From 9ea076805efcff6b90236437c5f5cb64eb0d6af7 Mon Sep 17 00:00:00 2001
From: Imre Farkas <ifarkas@redhat.com>
Date: Wed, 16 May 2012 12:18:00 +0200
Subject: [PATCH conductor 1/2] Delete jquery-svg

---
 src/public/javascripts/jquery-svg/blank.svg        |    3 -
 src/public/javascripts/jquery-svg/custom_test.js   |   67 -
 src/public/javascripts/jquery-svg/jquery.svg.css   |    9 -
 src/public/javascripts/jquery-svg/jquery.svg.js    | 1101 ----------------
 .../javascripts/jquery-svg/jquery.svg.min.js       |    7 -
 .../javascripts/jquery-svg/jquery.svg.pack.js      |    7 -
 .../javascripts/jquery-svg/jquery.svgfilter.js     |  396 ------
 .../javascripts/jquery-svg/jquery.svgfilter.min.js |    7 -
 .../jquery-svg/jquery.svgfilter.pack.js            |    7 -
 .../javascripts/jquery-svg/jquery.svggraph.js      | 1337 --------------------
 .../javascripts/jquery-svg/jquery.svggraph.min.js  |    7 -
 .../javascripts/jquery-svg/jquery.svggraph.pack.js |    7 -
 src/public/javascripts/jquery-svg/lion.svg         |  161 ---
 src/public/javascripts/jquery-svg/test.js          |  714 -----------
 14 files changed, 0 insertions(+), 3830 deletions(-)
 delete mode 100644 src/public/javascripts/jquery-svg/blank.svg
 delete mode 100644 src/public/javascripts/jquery-svg/custom_test.js
 delete mode 100644 src/public/javascripts/jquery-svg/jquery.svg.css
 delete mode 100644 src/public/javascripts/jquery-svg/jquery.svg.js
 delete mode 100644 src/public/javascripts/jquery-svg/jquery.svg.min.js
 delete mode 100644 src/public/javascripts/jquery-svg/jquery.svg.pack.js
 delete mode 100644 src/public/javascripts/jquery-svg/jquery.svgfilter.js
 delete mode 100644 src/public/javascripts/jquery-svg/jquery.svgfilter.min.js
 delete mode 100644 src/public/javascripts/jquery-svg/jquery.svgfilter.pack.js
 delete mode 100644 src/public/javascripts/jquery-svg/jquery.svggraph.js
 delete mode 100644 src/public/javascripts/jquery-svg/jquery.svggraph.min.js
 delete mode 100644 src/public/javascripts/jquery-svg/jquery.svggraph.pack.js
 delete mode 100644 src/public/javascripts/jquery-svg/lion.svg
 delete mode 100644 src/public/javascripts/jquery-svg/test.js

diff --git a/src/public/javascripts/jquery-svg/blank.svg b/src/public/javascripts/jquery-svg/blank.svg
deleted file mode 100644
index 730d3d5..0000000
--- a/src/public/javascripts/jquery-svg/blank.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<svg onload="window.parent.svgManager._registerSVG();" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
-</svg>
diff --git a/src/public/javascripts/jquery-svg/custom_test.js b/src/public/javascripts/jquery-svg/custom_test.js
deleted file mode 100644
index 4ce446a..0000000
--- a/src/public/javascripts/jquery-svg/custom_test.js
+++ /dev/null
@@ -1,67 +0,0 @@
-  //var chartArea = [[0.1, 0.1, 0.95, 0.9], [0.2, 0.1, 0.95, 0.9],
-  //                [0.1, 0.1, 0.8, 0.9], [0.1, 0.25, 0.9, 0.9], [0.1, 0.1, 0.9, 0.8]];
-  //var legendArea = [[0.0, 0.0, 0.0, 0.0], [0.005, 0.1, 0.125, 0.5],
-  //        [0.875, 0.1, 0.995, 0.5], [0.2, 0.1, 0.8, 0.2], [0.2, 0.9, 0.8, 0.995]];   
-  //var fills = [['lightblue', 'url(#fadeBlue)'], ['pink', 'url(#fadeRed)'],
-  // ['lightgreen', 'url(#fadeGreen)']];
-  function buildGraph(options) { 
-      var settings = $.extend({
-            svg_container: "",
-            graph_url: "test",
-            id: 1,   
-            dataType: "summary", 
-            chartType: "line", //tell svg plugin if we want line, bar, or pie graphs
-            chartTitle: "",
-            timeframe: "7 days",
-            xTitle: "",
-            yTitle: ""
-          },options||{});
-      var svg = svgManager.getSVGFor(settings.svg_container);
-      var params = {
-            id:settings.id, //id of the node to get graph data for
-            type:settings.dataType, /*this will be what we pass in to tell 
-             *the data api what kind of data to return*/
-            timeframe:settings.timeframe, //what time period do we want back from the data api?
-            isJSON:true}; /*while this is not used right now, there is the chance we will want to 
-              call the data api before rendering the page, this is a flag to allow that*/
-      $.getJSON(settings.graph_url, params, function(response) { 
-          var defs = svg.defs();
-          var legendPos = 1; 
-/*
-* Everything else that is commented out from here down is experimental stuff that we shouldn't need right away, 
-* but may want to play with as we make this look nicer.
-*/                
-          //svg.linearGradient(defs, 'fadeBlue', [[0, 'lightblue'], [1, 'blue']]);
-          //svg.linearGradient(defs, 'fadeRed', [[0, 'pink'], [1, 'red']]);
-          //svg.linearGradient(defs, 'fadeGreen', [[0, 'lightgreen'], [1, 'green']]);
-          svg.graph.noDraw().title(settings.chartTitle,10).
-              chartFormat('lightyellow', 'gray').
-              //gridlines({stroke: 'gray', stroke_dasharray: '2,2'}, 'gray').
-              status(setStatus);
-          $(response.dataset).each(function(){
-            svg.graph.noDraw().
-                    addSeries(this.name, this.values, this.fill, this.stroke, this.strokeWidth);
-
-          });
-          svg.graph.xAxis.title(settings.xTitle).scale(0, 3);
-          if (response.timepoints.length > 0){
-            svg.graph.xAxis.ticks(1, 0).labels(response.timepoints);
-          }
-            svg.graph.yAxis.title(settings.yTitle).scale(-5, 105).ticks(10, 5);
-            //svg.graph.legend.settings({fill: 'lightgoldenrodyellow', stroke: 'gray'});
-            svg.graph.legend.show(legendPos).area([0.0, 0.0, 0.0, 0.0]);
-            //for (var i = 0; i < 3; i++) {
-            //        svg.graph.series()[i].format((fills[i])[0]);
-            //}            
-            svg.graph.noDraw().//chartArea(chartArea[legendPos]).
-                    chartType(settings.chartType, {explode: [2], explodeDist: 10}).redraw();
-
-      });
-}
-/*callback function for when you mouse over the data.
- *I hope for this eventually to highlight the datapoint and show any additional information 
- *the design may call for.  
- **/
-function setStatus(value) {
-    //alert(value);
-} 
diff --git a/src/public/javascripts/jquery-svg/jquery.svg.css b/src/public/javascripts/jquery-svg/jquery.svg.css
deleted file mode 100644
index 26ae31f..0000000
--- a/src/public/javascripts/jquery-svg/jquery.svg.css
+++ /dev/null
@@ -1,9 +0,0 @@
-/* http://home.iprimus.com.au/kbwood/jquery/svg.html
-   SVG for jQuery v1.0.0.
-   Written by Keith Wood (kbwood@iprimus.com.au) August 2007.
-   Under the Creative Commons Licence http://creativecommons.org/licenses/by/3.0/
-   Share or Remix it but please Attribute the author. */
-
-svg\:svg { display: none; }
-
-.svg_error { color: red; font-weight: bold; }
diff --git a/src/public/javascripts/jquery-svg/jquery.svg.js b/src/public/javascripts/jquery-svg/jquery.svg.js
deleted file mode 100644
index dea8794..0000000
--- a/src/public/javascripts/jquery-svg/jquery.svg.js
+++ /dev/null
@@ -1,1101 +0,0 @@
-/* http://keith-wood.name/svg.html
-   SVG for jQuery v1.0.1.
-   Written by Keith Wood (kbwood@iprimus.com.au) August 2007.
-   Dual licensed under the GPL (http://dev.jquery.com/browser/trunk/jquery/GPL-LICENSE.txt) and 
-   MIT (http://dev.jquery.com/browser/trunk/jquery/MIT-LICENSE.txt) licenses. 
-   Please attribute the author if you use it. */
-
-var svgManager = null;
-
-(function($) { // Hide scope, no $ conflict
-
-/* SVG manager.
-   Use the singleton instance of this class, svgManager, 
-   to interact with the SVG functionality. */
-function SVGManager() {
-	this._nextId = 0; // Next ID for a SVG root
-	this._svgs = []; // List of SVG roots indexed by ID
-	this._settings = []; // Settings to be remembered per SVG object:
-		// [0] is width, [1] is height, [2] is URL to load initially, [3] is callback function
-	this._extensions = []; // List of SVG extensions added to SVGRoot
-		// for each entry [0] is extension name, [1] is extension class (function)
-		// the function takes one parameter - the SVGRoot instance
-	this.regional = []; // Localisations, indexed by language, '' for default (English)
-	this.regional[''] = {notSupportedText: 'This browser does not support SVG',
-		errorLoadingText: 'Error loading'};
-	this.local = this.regional['']; // Current localisation
-}
-
-$.extend(SVGManager.prototype, {
-	/* SVG namespace. */
-	svgNS: 'http://www.w3.org/2000/svg',
-	/* XLink namespace. */
-	xlinkNS: 'http://www.w3.org/1999/xlink',
-	
-	/* SVG root class. */
-	_rootClass: SVGRoot,
-	
-	/* Add the SVG object to its container. */
-	_connectSVG: function(container, loadURL, onLoad, settings) {
-		var id = this._nextId++;
-		container._svgId = id;
-		var svg = null;
-		if ($.browser.msie) {
-			container.innerHTML = '<embed type="image/svg+xml" width="' + container.clientWidth +
-				'" height="' + container.clientHeight + '" src="blank.svg"/>';
-			this._settings[id] = [container, loadURL, settings, onLoad];
-		}
-		else if (document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#SVG","1.1") ||
-				document.implementation.hasFeature("org.w3c.svg", "1.1")) {
-			svg = document.createElementNS(this.svgNS, 'svg');
-			svg.setAttribute('version', '1.1');
-			svg.setAttribute('width', container.clientWidth);
-			svg.setAttribute('height', container.clientHeight);
-			container.appendChild(svg);
-			this._afterLoad(id, svg, [container, loadURL, settings, onLoad]);
-		}
-		else {
-			container.innerHTML = '<p class="svg_error">' + this.local.notSupportedText + '</p>';
-		}
-		return id;
-	},
-
-	/* SVG callback after loading - register SVG root. */
-	_registerSVG: function() {
-		for (var i = 0; i < document.embeds.length; i++) { // Check all
-			var id = document.embeds[i].parentNode._svgId;
-			var svg = document.embeds[i].getSVGDocument();
-			svg = (svg ? svg.documentElement : null);
-			if (id != null && svg && !this._svgs[id]) { // Valid and not already done
-				this._afterLoad(id, svg);
-			}
-		}
-	},
-
-	/* Post-processing once loaded. */
-	_afterLoad: function(id, svg, settings) {
-		var settings = settings || this._settings[id];
-		var root = this._svgs[id] = new this._rootClass(svg, settings[0]);
-		if (settings[1]) { // Load URL
-			root.load(settings[1]);
-		}
-		if (settings[2]) { // Additional settings
-			root.configure(settings[2]);
-		}
-		if (settings[3]) { // Onload callback
-			settings[3](settings[0]);
-		}
-	},
-	
-	/* Return the SVG root created for a given container.
-	   @param  container  string - selector for the container or
-	                      element - the container for the SVG object or
-	                      jQuery collection - first entry is the container
-	   @return  the corresponding SVG root element, or null if not attached */
-	getSVGFor: function(container) {
-		container = (typeof container == 'string' ? $(container)[0] :
-			(container.jquery ? container[0] : container));
-		return this._svgs[container._svgId];
-	},
-	
-	/* Extend the SVGRoot object with an embedded class.
-	   The constructor function must take a single parameter that is
-	   a reference to the owning SVG root object. This allows the 
-	   extension to access the basic SVG functionality.
-	   @param  name      string - the name of the SVGRoot attribute to access the new class
-	   @param  extClass  function - the extension class constructor */
-	addExtension: function(name, extClass) {
-		this._extensions[this._extensions.length] = [name, extClass];
-	}
-});
-
-
-
-/* The main SVG interface, which encapsulates the SVG element.
-   Obtain a reference from svgManager.getSVGFor(). */
-function SVGRoot(svg, container) {
-	this._svg = svg; // The SVG root node
-	this._container = container; // The containing div
-	for (var i = 0; i < svgManager._extensions.length; i++) {
-		var extension = svgManager._extensions[i];
-		this[extension[0]] = new extension[1](this);
-	}
-}
-
-$.extend(SVGRoot.prototype, {
-
-	/* Retrieve the width of the SVG object. */
-	_width: function() {
-		return this._container.clientWidth;
-	},
-
-	/* Retrieve the height of the SVG object. */
-	_height: function() {
-		return this._container.clientHeight;
-	},
-	
-	/* Configure the SVG root.
-	   @param  settings  object - additional settings for the root
-	   @param  clear     boolean - true to remove existing attributes first,
-	                     false to add to what is already there (optional)
-	   @return  this root */
-	configure: function(settings, clear) {
-		if (clear) {
-			for (var i = this._svg.attributes.length - 1; i >= 0; i--) {
-				var attr = this._svg.attributes.item(i);
-				if (!(attr.nodeName == 'onload' || attr.nodeName == 'version' || 
-						attr.nodeName.substring(0, 5) == 'xmlns')) {
-					this._svg.attributes.removeNamedItem(attr.nodeName);
-				}
-			}
-		}
-		for (var attrName in settings) {
-			this._svg.setAttribute(attrName, settings[attrName]);
-		}
-		return this;
-	},
-	
-	/* Locate a specific element in the SVG document.
-	   @param  id  the element's identifier
-	   @return  the element reference, or null if not found */
-	getElementById: function(id) {
-		return this._svg.getElementById(id);
-	},
-	
-	/* Add a title.
-	   @param  parent    element - the parent node for the new title
-	   @param  text      string - the text of the title
-	   @param  settings  object - additional settings for the title (optional)
-	   @return  the new title node */
-	title: function(parent, text, settings) {
-		var node = this._makeNode(parent, 'title', settings || {});
-		node.appendChild(this._svg.ownerDocument.createTextNode(text));
-		return node;
-	},
-
-	/* Add a description.
-	   @param  parent    element - the parent node for the new description
-	   @param  text      string - the text of the description
-	   @param  settings  object - additional settings for the description (optional)
-	   @return  the new description node */
-	describe: function(parent, text, settings) {
-		var node = this._makeNode(parent, 'desc', settings || {});
-		node.appendChild(this._svg.ownerDocument.createTextNode(text));
-		return node;
-	},
-
-	/* Add a definitions node.
-	   @param  parent    element - the parent node for the new definitions
-	   @param  id        string - the ID of this definitions (optional)
-	   @param  settings  object - additional settings for the definitions (optional)
-	   @return  the new definitions node */
-	defs: function(parent, id, settings) {
-		if (typeof id != 'string') {
-			settings = id;
-			id = null;
-		}
-		return this._makeNode(parent, 'defs', $.extend(
-			(id ? {id: id} : {}), settings || {}));
-	},
-
-	/* Add a symbol definition.
-	   @param  parent    element - the parent node for the new symbol
-	   @param  id        string - the ID of this symbol
-	   @param  x1        number - the left coordinate for this symbol
-	   @param  y1        number - the top coordinate for this symbol
-	   @param  x2        number - the right coordinate for this symbol
-	   @param  y2        number - the bottom coordinate for this symbol
-	   @param  settings  object - additional settings for the symbol (optional)
-	   @return  the new symbol node */
-	symbol: function(parent, id, x1, y1, x2, y2, settings) {
-		return this._makeNode(parent, 'symbol', $.extend(
-			{id: id, viewBox: x1 + ' ' + y1 + ' ' + x2 + ' ' + y2}, settings || {}));
-	},
-
-	/* Add a marker definition.
-	   @param  parent    element - the parent node for the new marker
-	   @param  id        string - the ID of this marker
-	   @param  refX      number - the x-coordinate for the reference point
-	   @param  refY      number - the y-coordinate for the reference point
-	   @param  mWidth    number - the marker viewport width
-	   @param  mHeight   number - the marker viewport height
-	   @param  orient    string or int - 'auto' or angle (degrees) (optional)
-	   @param  settings  object - additional settings for the marker (optional)
-	   @return  the new marker node */
-	marker: function(parent, id, refX, refY, mWidth, mHeight, orient, settings) {
-		if (typeof orient == 'object') {
-			settings = orient;
-			orient = null;
-		}
-		return this._makeNode(parent, 'marker', $.extend(
-			{id: id, refX: refX, refY: refY, markerWidth: mWidth, 
-			markerHeight: mHeight, orient: orient || 'auto'}, settings || {}));
-	},
-
-	/* Add a style node.
-	   @param  parent    element - the parent node for the new node
-	   @param  styles    string - the CSS styles
-	   @param  settings  object - additional settings for the node (optional)
-	   @return  the new style node */
-	style: function(parent, styles, settings) {
-		var node = this._makeNode(parent, 'style', $.extend(
-			{type: 'text/css'}, settings || {}));
-		node.appendChild(this._svg.ownerDocument.createTextNode(this._escapeXML(styles)));
-		return node;
-	},
-
-	/* Add a script node.
-	   @param  parent    element - the parent node for the new node
-	   @param  script    string - the JavaScript code
-	   @param  type      string - the MIME type for the code (optional, default 'text/javascript')
-	   @param  settings  object - additional settings for the node (optional)
-	   @return  the new script node */
-	script: function(parent, script, type, settings) {
-		if (typeof type == 'object') {
-			settings = type;
-			type = null;
-		}
-		var node = this._makeNode(parent, 'script', $.extend(
-			{type: type || 'text/javascript'}, settings || {}));
-		node.appendChild(this._svg.ownerDocument.createTextNode(this._escapeXML(script)));
-		return node;
-	},
-	
-	/* Add a linear gradient definition.
-	   Specify all of x1, y1, x2, y2 or none of them.
-	   @param  parent    element - the parent node for the new gradient
-	   @param  id        string - the ID for this gradient
-	   @param  stops     string[][] - the gradient stops, each entry is
-	                     [0] is offset (0.0-1.0 or 0%-100%), [1] is colour, 
-						 [2] is opacity (optional)
-	   @param  x1        number - the x-coordinate of the gradient start (optional)
-	   @param  y1        number - the y-coordinate of the gradient start (optional)
-	   @param  x2        number - the x-coordinate of the gradient end (optional)
-	   @param  y2        number - the y-coordinate of the gradient end (optional)
-	   @param  settings  object - additional settings for the gradient (optional)
-	   @return  the new gradient node */
-	linearGradient: function(parent, id, stops, x1, y1, x2, y2, settings) {
-		if (typeof x1 == 'object') {
-			settings = x1;
-			x1 = null;
-		}
-		var sets = $.extend({id: id}, 
-			(x1 != null ? {x1: x1, y1: y1, x2: x2, y2: y2} : {}));
-		return this._gradient(parent, 'linearGradient', 
-			$.extend(sets, settings || {}), stops);
-	},
-	
-	/* Add a radial gradient definition.
-	   Specify all of cx, cy, r, fx, fy or none of them.
-	   @param  parent    element - the parent node for the new gradient
-	   @param  id        string - the ID for this gradient
-	   @param  stops     string[][] - the gradient stops, each entry
-	                     [0] is offset, [1] is colour, [2] is opacity (optional)
-	   @param  cx        number - the x-coordinate of the largest circle centre (optional)
-	   @param  cy        number - the y-coordinate of the largest circle centre (optional)
-	   @param  r         number - the radius of the largest circle (optional)
-	   @param  fx        number - the x-coordinate of the gradient focus (optional)
-	   @param  fy        number - the y-coordinate of the gradient focus (optional)
-	   @param  settings  object - additional settings for the gradient (optional)
-	   @return  the new gradient node */
-	radialGradient: function(parent, id, stops, cx, cy, r, fx, fy, settings) {
-		if (typeof cx == 'object') {
-			settings = cx;
-			cx = null;
-		}
-		var sets = $.extend({id: id}, 
-			(cx != null ? {cx: cx, cy: cy, r: r, fx: fx, fy: fy} : {}));
-		return this._gradient(parent, 'radialGradient', 
-			$.extend(sets, settings || {}), stops);
-	},
-	
-	/* Add a gradient node. */
-	_gradient: function(parent, name, settings, stops) {
-		var node = this._makeNode(parent, name, settings);
-		for (var i = 0; i < stops.length; i++) {
-			var stop = stops[i];
-			this._makeNode(node, 'stop', $.extend(
-				{offset: stop[0], stop_color: stop[1]}, 
-				(stop[2] != null ? {stop_opacity: stop[2]} : {})));
-		}
-		return node;
-	},
-
-	/* Add a pattern definition.
-	   Specify all of vx, vy, xwidth, vheight or none of them.
-	   @param  parent    element - the parent node for the new pattern
-	   @param  id        string - the ID for this pattern
-	   @param  x         number - the x-coordinate for the left edge of the pattern
-	   @param  y         number - the y-coordinate for the top edge of the pattern
-	   @param  width     number - the width of the pattern
-	   @param  height    number - the height of the pattern
-	   @param  vx        number - the minimum x-coordinate for view box (optional)
-	   @param  vy        number - the minimum y-coordinate for the view box (optional)
-	   @param  vwidth    number - the width of the view box (optional)
-	   @param  vheight   number - the height of the view box (optional)
-	   @param  settings  object - additional settings for the pattern (optional)
-	   @return  the new pattern node */
-	pattern: function(parent, id, x, y, width, height, vx, vy, vwidth, vheight, settings) {
-		if (typeof vx == 'object') {
-			settings = vx;
-			vx = null;
-		}
-		var sets = $.extend({id: id, x: x, y: y, width: width, height: height}, 
-			(vx != null ? {viewBox: vx + ' ' + vy + ' ' + vwidth + ' ' + vheight} : {}));
-		return this._makeNode(parent, 'pattern', $.extend(sets, settings || {}));
-	},
-
-	/* Add a mask definition.
-	   @param  parent    element - the parent node for the new mask
-	   @param  id        string - the ID for this mask
-	   @param  x         number - the x-coordinate for the left edge of the mask
-	   @param  y         number - the y-coordinate for the top edge of the mask
-	   @param  width     number - the width of the mask
-	   @param  height    number - the height of the mask
-	   @param  settings  object - additional settings for the mask (optional)
-	   @return  the new mask node */
-	mask: function(parent, id, x, y, width, height, settings) {
-		return this._makeNode(parent, 'mask', $.extend(
-			{id: id, x: x, y: y, width: width, height: height}, settings || {}));
-	},
-
-	/* Create a new path object.
-	   @return  a new path object */
-	createPath: function() {
-		return new SVGPath();
-	},
-
-	/* Create a new text object.
-	   @return  a new text object */
-	createText: function() {
-		return new SVGText();
-	},
-
-	/* Add an embedded SVG element.
-	   Specify all of vx, vy, vwidth, vheight or none of them.
-	   @param  parent    element - the parent node for the new node
-	   @param  x         number - the x-coordinate for the left edge of the node
-	   @param  y         number - the y-coordinate for the top edge of the node
-	   @param  width     number - the width of the node
-	   @param  height    number - the height of the node
-	   @param  vx        number - the minimum x-coordinate for view box (optional)
-	   @param  vy        number - the minimum y-coordinate for the view box (optional)
-	   @param  vwidth    number - the width of the view box (optional)
-	   @param  vheight   number - the height of the view box (optional)
-	   @param  settings  object - additional settings for the node (optional)
-	   @return  the new node */
-	svg: function(parent, x, y, width, height, vx, vy, vwidth, vheight, settings) {
-		if (typeof vx == 'object') {
-			settings = vx;
-			vx = null;
-		}
-		var sets = $.extend({x: x, y: y, width: width, height: height}, 
-			(vx != null ? {viewBox: vx + ' ' + vy + ' ' + vwidth + ' ' + vheight} : {}));
-		return this._makeNode(parent, 'svg', $.extend(sets, settings || {}));
-	},
-
-	/* Create a group.
-	   @param  parent    element - the parent node for the new group
-	   @param  id        string - the ID of this group (optional)
-	   @param  settings  object - additional settings for the group (optional)
-	   @return  the new group node */
-	group: function(parent, id, settings) {
-		if (typeof id == 'object') {
-			settings = id;
-			id = null;
-		}
-		return this._makeNode(parent, 'g', $.extend({id: id}, settings || {}));
-	},
-
-	/* Add a usage reference.
-	   Specify all of x, y, width, height or none of them.
-	   @param  parent    element - the parent node for the new node
-	   @param  x         number - the x-coordinate for the left edge of the node (optional)
-	   @param  y         number - the y-coordinate for the top edge of the node (optional)
-	   @param  width     number - the width of the node (optional)
-	   @param  height    number - the height of the node (optional)
-	   @param  ref       string - the ID of the definition node
-	   @param  settings  object - additional settings for the node (optional)
-	   @return  the new node */
-	use: function(parent, x, y, width, height, ref, settings) {
-		if (typeof x == 'string') {
-			ref = x;
-			settings = y;
-			x = y = width = height = null;
-		}
-		var node = this._makeNode(parent, 'use', $.extend(
-			{x: x, y: y, width: width, height: height}, settings || {}));
-		node.setAttributeNS(svgManager.xlinkNS, 'href', ref);
-		return node;
-	},
-
-	/* Add a link, which applies to all child elements.
-	   @param  parent    element - the parent node for the new link
-	   @param  ref       string - the target URL
-	   @param  settings  object - additional settings for the link (optional)
-	   @return  the new link node */
-	link: function(parent, ref, settings) {
-		var node = this._makeNode(parent, 'a', settings);
-		node.setAttributeNS(svgManager.xlinkNS, 'href', ref);
-		return node;
-	},
-
-	/* Add an image.
-	   @param  parent    element - the parent node for the new image
-	   @param  x         number - the x-coordinate for the left edge of the image
-	   @param  y         number - the y-coordinate for the top edge of the image
-	   @param  width     number - the width of the image
-	   @param  height    number - the height of the image
-	   @param  ref       string - the path to the image
-	   @param  settings  object - additional settings for the image (optional)
-	   @return  the new image node */
-	image: function(parent, x, y, width, height, ref, settings) {
-		var node = this._makeNode(parent, 'image', $.extend(
-			{x: x, y: y, width: width, height: height}, settings || {}));
-		node.setAttributeNS(svgManager.xlinkNS, 'href', ref);
-		return node;
-	},
-
-	/* Draw a path.
-	   @param  parent    element - the parent node for the new shape
-	   @param  path      string or SVGPath - the path to draw
-	   @param  settings  object - additional settings for the shape (optional)
-	   @return  the new shape node */
-	path: function(parent, path, settings) {
-		return this._makeNode(parent, 'path', $.extend(
-			{d: (path.path ? path.path() : path)}, settings || {}));
-	},
-
-	/* Draw a rectangle.
-	   @param  parent    element - the parent node for the new shape
-	   @param  x         number - the x-coordinate for the left edge of the rectangle
-	   @param  y         number - the y-coordinate for the top edge of the rectangle
-	   @param  width     number - the width of the rectangle
-	   @param  height    number - the height of the rectangle
-	   @param  settings  object - additional settings for the shape (optional)
-	   @return  the new shape node */
-	rect: function(parent, x, y, width, height, settings) {
-		return this._makeNode(parent, 'rect', $.extend(
-			{x: x, y: y, width: width, height: height}, settings || {}));
-	},
-
-	/* Draw a rounded rectangle.
-	   @param  parent    element - the parent node for the new shape
-	   @param  x         number - the x-coordinate for the left edge of the rectangle
-	   @param  y         number - the y-coordinate for the top edge of the rectangle
-	   @param  width     number - the width of the rectangle
-	   @param  height    number - the height of the rectangle
-	   @param  rx        number - the x-radius of the ellipse for the rounded corners
-	   @param  ry        number - the y-radius of the ellipse for the rounded corners
-	   @param  settings  object - additional settings for the shape (optional)
-	   @return  the new shape node */
-	roundrect: function(parent, x, y, width, height, rx, ry, settings) {
-		return this._makeNode(parent, 'rect', $.extend(
-			{x: x, y: y, width: width, height: height, rx: rx, ry: ry}, settings || {}));
-	},
-
-	/* Draw a circle.
-	   @param  parent    element - the parent node for the new shape
-	   @param  cx        number - the x-coordinate for the centre of the circle
-	   @param  cy        number - the y-coordinate for the centre of the circle
-	   @param  r         number - the radius of the circle
-	   @param  settings  object - additional settings for the shape (optional)
-	   @return  the new shape node */
-	circle: function(parent, cx, cy, r, settings) {
-		return this._makeNode(parent, 'circle', $.extend(
-			{cx: cx, cy: cy, r: r}, settings || {}));
-	},
-
-	/* Draw an ellipse.
-	   @param  parent    element - the parent node for the new shape
-	   @param  cx        number - the x-coordinate for the centre of the ellipse
-	   @param  cy        number - the y-coordinate for the centre of the ellipse
-	   @param  rx        number - the x-radius of the ellipse
-	   @param  ry        number - the y-radius of the ellipse
-	   @param  settings  object - additional settings for the shape (optional)
-	   @return  the new shape node */
-	ellipse: function(parent, cx, cy, rx, ry, settings) {
-		return this._makeNode(parent, 'ellipse', $.extend(
-			{cx: cx, cy: cy, rx: rx, ry: ry}, settings || {}));
-	},
-
-	/* Draw a line.
-	   @param  parent    element - the parent node for the new shape
-	   @param  x1        number - the x-coordinate for the start of the line
-	   @param  y1        number - the y-coordinate for the start of the line
-	   @param  x2        number - the x-coordinate for the end of the line
-	   @param  y2        number - the y-coordinate for the end of the line
-	   @param  settings  object - additional settings for the shape (optional)
-	   @return  the new shape node */
-	line: function(parent, x1, y1, x2, y2, settings) {
-		return this._makeNode(parent, 'line', $.extend(
-			{x1: x1, y1: y1, x2: x2, y2: y2}, settings || {}));
-	},
-
-	/* Draw a polygonal line.
-	   @param  parent    element - the parent node for the new shape
-	   @param  points    number[][] - the x-/y-coordinates for the points on the line
-	   @param  settings  object - additional settings for the shape (optional)
-	   @return  the new shape node */
-	polyline: function(parent, points, settings) {
-		return this._poly(parent, 'polyline', points, settings);
-	},
-
-	/* Draw a polygonal shape.
-	   @param  parent    element - the parent node for the new shape
-	   @param  points    number[][] - the x-/y-coordinates for the points on the shape
-	   @param  settings  object - additional settings for the shape (optional)
-	   @return  the new shape node */
-	polygon: function(parent, points, settings) {
-		return this._poly(parent, 'polygon', points, settings);
-	},
-
-	/* Draw a polygonal line or shape. */
-	_poly: function(parent, name, points, settings) {
-		var ps = '';
-		for (var i = 0; i < points.length; i++) {
-			ps += points[i].join() + ' ';
-		}
-		return this._makeNode(parent, name, $.extend(
-			{points: ps}, settings || {}));
-	},
-	
-	/* Draw text.
-	   Specify both of x and y or neither of them.
-	   @param  parent    element - the parent node for the text
-	   @param  x         number or number[] - the x-coordinate(s) for the text (optional)
-	   @param  y         number or number[] - the y-coordinate(s) for the text (optional)
-	   @param  value     string - the text content or
-	                     SVGText - text with spans and references
-	   @param  settings  object - additional settings for the text (optional)
-	   @return  the new text node */
-	text: function(parent, x, y, value, settings) {
-		if (typeof x == 'string' && arguments.length < 4) {
-			value = x;
-			settings = y;
-			x = y = null;
-		}
-		return this._text(parent, 'text', value, $.extend(
-			{x: (x && isArray(x) ? x.join(' ') : x), y: (y && isArray(y) ? y.join(' ') : y)}, 
-			settings || {}));
-	},
-	
-	/* Draw text along a path.
-	   @param  parent    element - the parent node for the text
-	   @param  path      string - the ID of the path
-	   @param  value     string - the text content or
-	                     SVGText - text with spans and references
-	   @param  settings  object - additional settings for the text (optional)
-	   @return  the new text node */
-	textpath: function(parent, path, value, settings) {
-		var node = this._text(parent, 'textPath', value, settings || {});
-		node.setAttributeNS(svgManager.xlinkNS, 'href', path);
-		return node;
-	},
-	
-	/* Draw text. */
-	_text: function(parent, name, value, settings) {
-		var node = this._makeNode(parent, name, settings);
-		if (typeof value == 'string') {
-			node.appendChild(node.ownerDocument.createTextNode(value));
-		}
-		else {
-			for (var i = 0; i < value._parts.length; i++) {
-				var part = value._parts[i];
-				if (part[0] == 'tspan') {
-					var child = this._makeNode(node, part[0], part[2]);
-					child.appendChild(node.ownerDocument.createTextNode(part[1]));
-					node.appendChild(child);
-				}
-				else if (part[0] == 'tref') {
-					var child = this._makeNode(node, part[0], part[2]);
-					child.setAttributeNS(svgManager.xlinkNS, 'href', part[1]);
-					node.appendChild(child);
-				}
-				else if (part[0] == 'textpath') {
-					var pathId = part[2].href;
-					part[2].href = null;
-					var child = this._makeNode(node, part[0], part[2]);
-					child.setAttributeNS(svgManager.xlinkNS, 'href', pathId);
-					child.appendChild(node.ownerDocument.createTextNode(part[1]));
-					node.appendChild(child);
-				}
-				else { // straight text
-					node.appendChild(node.ownerDocument.createTextNode(part[1]));
-				}
-			}
-		}
-		return node;
-	},
-
-	/* Add a custom SVG element.
-	   @param  parent    element - the parent node for the new element
-	   @param  name      string - the name of the element
-	   @param  settings  object - additional settings for the element (optional)
-	   @return  the new title node */
-	other: function(parent, name, settings) {
-		return this._makeNode(parent, other, settings || {});
-	},
-
-	/* Create a shape node with the given settings. */
-	_makeNode: function(parent, name, settings) {
-		parent = parent || this._svg;
-		var node = this._svg.ownerDocument.createElementNS(svgManager.svgNS, name);
-		for (var name in settings) {
-			var value = settings[name];
-			if (value != null && value != null && 
-					(typeof value != 'string' || value != '')) {
-				node.setAttribute(this._fromJSName(name), value);
-			}
-		}
-		parent.appendChild(node);
-		return node;
-	},
-	
-	/* JavaScript identifiers can't use '-', so convert from '_'. */
-	_fromJSName: function(name) {
-		return name.replace(/^_/, '').replace(/_/g, '-');
-	},
-	
-	/* Add an existing SVG node to the diagram.
-	   @param  parent  element - the parent node for the new node
-	   @param  node    element - the new node to add or
-	                   string - the jQuery selector for the node or
-	                   jQuery collection - set of nodes to add */
-	add: function(parent, node) {
-		var svg = this;
-		parent = parent || this._svg;
-		node = (node.jquery ? node : $(node));
-		node.each(function() {
-			var child = svg._cloneAsSVG(this);
-			if (child) {
-				parent.appendChild(child);
-			}
-		});
-	},
-	
-	/* SVG nodes must belong to the SVG namespace, so clone and ensure this is so. */
-	_cloneAsSVG: function(node) {
-		var newNode = null;
-		if (node.nodeType == 1) { // element
-			newNode = this._svg.ownerDocument.createElementNS(
-				node.namespaceURI || svgManager.svgNS, this._checkName(node.nodeName));
-			for (var i = 0; i < node.attributes.length; i++) {
-				var attr = node.attributes.item(i);
-				if (attr.nodeName != 'xmlns') {
-					if (attr.prefix == 'xlink') {
-						newNode.setAttributeNS(svgManager.xlinkNS, attr.localName, attr.nodeValue);
-					}
-					else {
-						newNode.setAttribute(this._checkName(attr.nodeName), attr.nodeValue);
-					}
-				}
-			}
-			for (var i = 0; i < node.childNodes.length; i++) {
-				var child = this._cloneAsSVG(node.childNodes[i]);
-				if (child) {
-					newNode.appendChild(child);
-				}
-			}
-		}
-		else if (node.nodeType == 3) { // text
-			if ($.trim(node.nodeValue)) {
-				newNode = this._svg.ownerDocument.createTextNode(node.nodeValue);
-			}
-		}
-		else if (node.nodeType == 4) { // CDATA
-			if ($.trim(node.nodeValue)) {
-				newNode = this._svg.ownerDocument.createCDATASection(node.nodeValue);
-			}
-		}
-		return newNode;
-	},
-	
-	/* Node names must be lower case and without SVG namespace prefix. */
-	_checkName: function(name) {
-		name = (name.substring(0, 1) >= 'A' && name.substring(0, 1) <= 'Z' ? name.toLowerCase() : name);
-		return (name.substring(0, 4) == 'svg:' ? name.substring(4) : name);
-	},
-
-	/* Load an external SVG document.
-	   @param  url    string - the location of the SVG document
-	   @param  addTo  boolean - true to add to what's already there, or false to clear the canvas first */
-	load: function(url, addTo) {
-		if (!addTo) {
-			this.clear(true);
-		}
-		var root = this;
-		var http = $.ajax({url: url, dataType: 'xml', success: function(data) {
-			if ($.browser.msie) { // Doesn't load properly!
-				data.loadXML(http.responseText);
-				if (data.parseError.errorCode != 0) {
-					root.text(null, 10, 20, svgManager.local.errorLoadingText + ': ' +
-						data.parseError.reason);
-					return;
-				}
-			}
-			var attrs = {};
-			for (var i = 0; i < data.documentElement.attributes.length; i++) {
-				var attr = data.documentElement.attributes.item(i);
-				if (!(attr.nodeName == 'version' || attr.nodeName.substring(0, 5) == 'xmlns')) {
-					attrs[attr.nodeName] = attr.nodeValue;
-				}
-			}
-			root.configure(attrs, true);
-			var nodes = data.documentElement.childNodes;
-			for (var i = 0; i < nodes.length; i++) {
-				root.add(null, nodes[i]);
-			}
-		}, error: function(http, message, exc) {
-			root.text(null, 10, 20, svgManager.local.errorLoadingText + ': ' +
-				message + (exc ? ' ' + exc.message : ''));
-		}});
-	},
-
-	/* Delete a specified node.
-	   @param  node  element - the drawing node to remove */
-	remove: function(node) {
-		node.parentNode.removeChild(node);
-	},
-
-	/* Delete everything in the current document.
-	   @param  attrsToo  boolean - true to clear any root attributes as well,
-	                     false to leave them (optional) */
-	clear: function(attrsToo) {
-		if (attrsToo) {
-			this.configure({}, true);
-		}
-		while (this._svg.firstChild) {
-			this._svg.removeChild(this._svg.firstChild);
-		}
-	},
-	
-	/* Serialise the current diagram into an SVG text document.
-	   @return  the SVG as text */
-	toSVG: function() {
-		return this._toSVG(this._svg);
-	},
-	
-	/* Serialise one node in the SVG hierarchy. */
-	_toSVG: function(node) {
-		var svgDoc = '';
-		if (!node) {
-			return svgDoc;
-		}
-		if (node.nodeType == 3) { // Text
-			svgDoc = node.nodeValue;
-		}
-		else if (node.nodeType == 4) { // CDATA
-			svgDoc = '<![CDATA[' + node.nodeValue + ']]>';
-		}
-		else { // Element
-			svgDoc = '<' + node.nodeName;
-			if (node.attributes) {
-				for (var i = 0; i < node.attributes.length; i++) {
-					var attr = node.attributes.item(i);
-					if (!($.trim(attr.nodeValue) == '' || attr.nodeValue.match(/^\[object/) ||
-							attr.nodeValue.match(/^function/))) {
-						svgDoc += ' ' + (attr.namespaceURI == svgManager.xlinkNS ? 'xlink:' : '') + 
-							attr.nodeName + '="' + attr.nodeValue + '"';
-					}
-				}
-			}	
-			if (node.firstChild) {
-				svgDoc += '>';
-				var child = node.firstChild;
-				while (child) {
-					svgDoc += this._toSVG(child);
-					child = child.nextSibling;
-				}
-				svgDoc += '</' + node.nodeName + '>';
-			}
-				else {
-				svgDoc += '/>';
-			}
-		}
-		return svgDoc;
-	},
-	
-	/* Escape reserved characters in XML. */
-	_escapeXML: function(text) {
-		text = text.replace(/&/g, '&amp;');
-		text = text.replace(/</g, '&lt;');
-		text = text.replace(/>/g, '&gt;');
-		return text;
-	}
-});
-
-/* Helper to generate an SVG path.
-   Obtain an instance from the SVGRoot object.
-   String calls together to generate the path and use its value:
-   var path = root.createPath();
-   root.path(null, path.moveTo(100, 100).lineTo(300, 100).lineTo(200, 300).close(), {fill: 'red'});
-   or
-   root.path(null, path.moveTo(100, 100).lineTo([[300, 100], [200, 300]]).close(), {fill: 'red'}); */
-function SVGPath() {
-	this._path = '';
-}
-
-$.extend(SVGPath.prototype, {
-	/* Prepare to create a new path.
-	   @return  this path */
-	reset: function() {
-		this._path = '';
-		return this;
-	},
-
-	/* Move the pointer to a position.
-	   @param  x         number - x-coordinate to move to or
-	                     number[][] - x-/y-coordinates to move to
-	   @param  y         number - y-coordinate to move to (omitted if x is array)
-	   @param  relative  boolean - true for coordinates relative to the current point,
-	                     false for coordinates being absolute
-	   @return  this path */
-	moveTo: function(x, y, relative) {
-		relative = (isArray(x) ? y : relative);
-		return this._coords((relative ? 'm' : 'M'), x, y);
-	},
-
-	/* Draw a line to a position.
-	   @param  x         number - x-coordinate to move to or
-	                     number[][] - x-/y-coordinates to move to
-	   @param  y         number - y-coordinate to move to (omitted if x is array)
-	   @param  relative  boolean - true for coordinates relative to the current point,
-	                     false for coordinates being absolute
-	   @return  this path */
-	lineTo: function(x, y, relative) {
-		relative = (isArray(x) ? y : relative);
-		return this._coords((relative ? 'l' : 'L'), x, y);
-	},
-
-	/* Draw a horizontal line to a position.
-	   @param  x         number - x-coordinate to draw to
-	   @param  relative  boolean - true for coordinates relative to the current point,
-	                     false for coordinates being absolute
-	   @return  this path */
-	horizTo: function(x, relative) {
-		this._path += (relative ? 'h' : 'H') + x;
-		return this;
-	},
-
-	/* Draw a vertical line to a position.
-	   @param  y         number - y-coordinate to draw to
-	   @param  relative  boolean - true for coordinates relative to the current point,
-	                     false for coordinates being absolute
-	   @return  this path */
-	vertTo: function(y, relative) {
-		this._path += (relative ? 'v' : 'V') + y;
-		return this;
-	},
-
-	/* Draw a cubic Bézier curve.
-	   @param  x1        number - x-coordinate of beginning control point or
-	                     number[][] - x-/y-coordinates of control and end points to draw to
-	   @param  y1        number - y-coordinate of beginning control point (omitted if x1 is array)
-	   @param  x2        number - x-coordinate of ending control point (omitted if x1 is array)
-	   @param  y2        number - y-coordinate of ending control point (omitted if x1 is array)
-	   @param  x         number - x-coordinate of curve end (omitted if x1 is array)
-	   @param  y         number - y-coordinate of curve end (omitted if x1 is array)
-	   @param  relative  boolean - true for coordinates relative to the current point,
-	                     false for coordinates being absolute
-	   @return  this path */
-	curveCTo: function(x1, y1, x2, y2, x, y, relative) {
-		relative = (isArray(x1) ? y1 : relative);
-		return this._coords((relative ? 'c' : 'C'), x1, y1, x2, y2, x, y);
-	},
-
-	/* Continue a cubic Bézier curve.
-	   Starting control point is the reflection of the previous end control point.
-	   @param  x2        number - x-coordinate of ending control point or
-	                     number[][] - x-/y-coordinates of control and end points to draw to
-	   @param  y2        number - y-coordinate of ending control point (omitted if x2 is array)
-	   @param  x         number - x-coordinate of curve end (omitted if x2 is array)
-	   @param  y         number - y-coordinate of curve end (omitted if x2 is array)
-	   @param  relative  boolean - true for coordinates relative to the current point,
-	                     false for coordinates being absolute
-	   @return  this path */
-	smoothCTo: function(x2, y2, x, y, relative) {
-		relative = (isArray(x2) ? y2 : relative);
-		return this._coords((relative ? 's' : 'S'), x2, y2, x, y);
-	},
-
-	/* Draw a quadratic Bézier curve.
-	   @param  x1        number - x-coordinate of control point or
-	                     number[][] - x-/y-coordinates of control and end points to draw to
-	   @param  y1        number - y-coordinate of control point (omitted if x1 is array)
-	   @param  x         number - x-coordinate of curve end (omitted if x1 is array)
-	   @param  y         number - y-coordinate of curve end (omitted if x1 is array)
-	   @param  relative  boolean - true for coordinates relative to the current point,
-	                     false for coordinates being absolute
-	   @return  this path */
-	curveQTo: function(x1, y1, x, y, relative) {
-		relative = (isArray(x1) ? y1 : relative);
-		return this._coords((relative ? 'q' : 'Q'), x1, y1, x, y);
-	},
-
-	/* Continue a quadratic Bézier curve.
-	   Control point is the reflection of the previous control point.
-	   @param  x         number - x-coordinate of curve end or
-	                     number[][] - x-/y-coordinates of points to draw to
-	   @param  y         number - y-coordinate of curve end (omitted if x is array)
-	   @param  relative  boolean - true for coordinates relative to the current point,
-	                     false for coordinates being absolute
-	   @return  this path */
-	smoothQTo: function(x, y, relative) {
-		relative = (isArray(x) ? y : relative);
-		return this._coords((relative ? 't' : 'T'), x, y);
-	},
-
-	/* Generate a path command with (a list of) coordinates. */
-	_coords: function(cmd, x1, y1, x2, y2, x3, y3) {
-		if (isArray(x1)) {
-			for (var i = 0; i < x1.length; i++) {
-				var cs = x1[i];
-				this._path += (i == 0 ? cmd : ' ') + cs[0] + ',' + cs[1] + 
-					(cs.length < 4 ? '' : ' ' + cs[2] + ',' + cs[3] + 
-					(cs.length < 6 ? '': ' ' + cs[4] + ',' + cs[5]));
-			}
-		}
-		else {
-			this._path += cmd + x1 + ',' + y1 + 
-				(x2 == null ? '' : ' ' + x2 + ',' + y2 +
-				(x3 == null ? '' : ' ' + x3 + ',' + y3));
-		}
-		return this;
-	},
-
-	/* Draw an arc to a position.
-	   @param  rx         number - x-radius of arc or
-	                      number/boolean[][] - x-/y-coordinates and flags for points to draw to
-	   @param  ry         number - y-radius of arc (omitted if rx is array)
-	   @param  xRotate    number - x-axis rotation (degrees, clockwise) (omitted if rx is array)
-	   @param  large      boolean - true to draw the large part of the arc,
-	                      false to draw the small part (omitted if rx is array)
-	   @param  clockwise  boolean - true to draw the clockwise arc,
-	                      false to draw the anti-clockwise arc (omitted if rx is array)
-	   @param  x          number - x-coordinate of arc end (omitted if rx is array)
-	   @param  y          number - y-coordinate of arc end (omitted if rx is array)
-	   @param  relative   boolean - true for coordinates relative to the current point,
-	                      false for coordinates being absolute
-	   @return  this path */
-	arcTo: function(rx, ry, xRotate, large, clockwise, x, y, relative) {
-		relative = (isArray(rx) ? ry : relative);
-		this._path += (relative ? 'a' : 'A');
-		if (isArray(rx)) {
-			for (var i = 0; i < rx.length; i++) {
-				var cs = rx[i];
-				this._path += (i == 0 ? '' : ' ') + cs[0] + ',' + cs[1] + ' ' +
-					cs[2] + ' ' + (cs[3] ? '1' : '0') + ',' +
-					(cs[4] ? '1' : '0') + ' ' + cs[5] + ',' + cs[6];
-			}
-		}
-		else {
-			this._path += rx + ',' + ry + ' ' + xRotate + ' ' +
-				(large ? '1' : '0') + ',' + (clockwise ? '1' : '0') + ' ' + x + ',' + y;
-		}
-		return this;
-	},
-	
-	/* Close the current path.
-	   @return  this path */
-	close: function() {
-		this._path += 'z';
-		return this;
-	},
-
-	/* Return the string rendering of the specified path.
-	   @return  stringified path */
-	path: function() {
-		return this._path;
-	}
-});
-
-/* Helper to generate an SVG text object.
-   Obtain an instance from the SVGRoot object.
-   String calls together to generate the text and use its value:
-   var text = root.createText();
-   root.text(null, x, y, text.string('This is ').
-     span('red', {fill: 'red'}).string('!'), {fill: 'blue'}); */
-function SVGText() {
-	this._parts = []; // The components of the text object
-}
-
-$.extend(SVGText.prototype, {
-	/* Prepare to create a new text object.
-	   @return  this text */
-	reset: function() {
-		this._parts = [];
-		return this;
-	},
-	
-	/* Add a straight string value.
-	   @param  value  string - the actual text
-	   @return  this text object */
-	string: function(value) {
-		this._parts[this._parts.length] = ['text', value];
-		return this;
-	},
-	
-	/* Add a separate text span that has its own settings.
-	   @param  value     string - the actual text
-	   @param  settings  object - the settings for this text
-	   @return  this text object */
-	span: function(value, settings) {
-		this._parts[this._parts.length] = ['tspan', value, settings];
-		return this;
-	},
-	
-	/* Add a reference to a previously defined text string.
-	   @param  id        string - the ID of the actual text
-	   @param  settings  object - the settings for this text
-	   @return  this text object */
-	ref: function(id, settings) {
-		this._parts[this._parts.length] = ['tref', id, settings];
-		return this;
-	},
-
-	/* Add text drawn along a path.
-	   @param  id        string - the ID of the path
-	   @param  value     string - the actual text
-	   @param  settings  object - the settings for this text
-	   @return  this text object */
-	path: function(id, value, settings) {
-		this._parts[this._parts.length] = ['textpath', value, 
-			$.extend({href: id}, settings || {})];
-		return this;
-	}
-});
-
-/* Attach the SVG functionality to a jQuery selection.
-   @param  loadURL   string - the URL of the initial document to load (optional)
-   @param  onLoad    function - a callback functional invoked following loading (optional)
-   @param  settings  object - the new settings to use for this SVG instance (optional)
-   @return jQuery object - for chaining further calls */
-$.fn.svg = function(loadURL, onLoad, settings) {
-	if (typeof loadURL == 'function') {
-		settings = onLoad;
-		onLoad = loadURL;
-		loadURL = null;
-	}
-	if (loadURL && typeof loadURL == 'object') {
-		settings = loadURL;
-		loadURL = onLoad = null;
-	}
-	if (onLoad && typeof onLoad == 'object') {
-		settings = onLoad;
-		onLoad = null;
-	}
-	return this.each(function() {
-		svgManager._connectSVG(this, loadURL, onLoad, settings);
-	});
-};
-
-/* Determine whether an object is an array. */
-function isArray(a) {
-	return (a.constructor && a.constructor.toString().match(/\Array\(\)/));
-}
-
-// Singleton primary SVG interface
-svgManager = new SVGManager();
-
-})(jQuery);
diff --git a/src/public/javascripts/jquery-svg/jquery.svg.min.js b/src/public/javascripts/jquery-svg/jquery.svg.min.js
deleted file mode 100644
index e0b75fe..0000000
--- a/src/public/javascripts/jquery-svg/jquery.svg.min.js
+++ /dev/null
@@ -1,7 +0,0 @@
-/* http://keith-wood.name/svg.html
-   SVG for jQuery v1.0.1.
-   Written by Keith Wood (kbwood@iprimus.com.au) August 2007.
-   Dual licensed under the GPL (http://dev.jquery.com/browser/trunk/jquery/GPL-LICENSE.txt) and 
-   MIT (http://dev.jquery.com/browser/trunk/jquery/MIT-LICENSE.txt) licenses. 
-   Please attribute the author if you use it. */
-var svgManager=null;(function($){function SVGManager(){this._nextId=0;this._svgs=[];this._settings=[];this._extensions=[];this.regional=[];this.regional['']={notSupportedText:'This browser does not support SVG',errorLoadingText:'Error loading'};this.local=this.regional['']}$.extend(SVGManager.prototype,{svgNS:'http://www.w3.org/2000/svg',xlinkNS:'http://www.w3.org/1999/xlink',_rootClass:SVGRoot,_connectSVG:function(a,b,c,d){var e=this._nextId++;a._svgId=e;var f=null;if($.browser.msie){a.innerHTML='<embed type="image/svg+xml" width="'+a.clientWidth+'" height="'+a.clientHeight+'" src="blank.svg"/>';this._settings[e]=[a,b,d,c]}else if(document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#SVG","1.1")||document.implementation.hasFeature("org.w3c.svg","1.1")){f=document.createElementNS(this.svgNS,'svg');f.setAttribute('version','1.1');f.setAttribute('width',a.clientWidth);f.setAttribute('height',a.clientHeight);a.appendChild(f);this._afterLoad(e,f,[a,b,d,c])}else{a.innerHTML='<p class="svg_error">'+this.local.notSupportedText+'</p>'}return e},_registerSVG:function(){for(var i=0;i<document.embeds.length;i++){var a=document.embeds[i].parentNode._svgId;var b=document.embeds[i].getSVGDocument();b=(b?b.documentElement:null);if(a!=null&&b&&!this._svgs[a]){this._afterLoad(a,b)}}},_afterLoad:function(a,b,c){var c=c||this._settings[a];var d=this._svgs[a]=new this._rootClass(b,c[0]);if(c[1]){d.load(c[1])}if(c[2]){d.configure(c[2])}if(c[3]){c[3](c[0])}},getSVGFor:function(a){a=(typeof a=='string'?$(a)[0]:(a.jquery?a[0]:a));return this._svgs[a._svgId]},addExtension:function(a,b){this._extensions[this._extensions.length]=[a,b]}});function SVGRoot(a,b){this._svg=a;this._container=b;for(var i=0;i<svgManager._extensions.length;i++){var c=svgManager._extensions[i];this[c[0]]=new c[1](this)}}$.extend(SVGRoot.prototype,{_width:function(){return this._container.clientWidth},_height:function(){return this._container.clientHeight},configure:function(a,b){if(b){for(var i=this._svg.attributes.length-1;i>=0;i--){var c=this._svg.attributes.item(i);if(!(c.nodeName=='onload'||c.nodeName=='version'||c.nodeName.substring(0,5)=='xmlns')){this._svg.attributes.removeNamedItem(c.nodeName)}}}for(var d in a){this._svg.setAttribute(d,a[d])}return this},getElementById:function(a){return this._svg.getElementById(a)},title:function(a,b,c){var d=this._makeNode(a,'title',c||{});d.appendChild(this._svg.ownerDocument.createTextNode(b));return d},describe:function(a,b,c){var d=this._makeNode(a,'desc',c||{});d.appendChild(this._svg.ownerDocument.createTextNode(b));return d},defs:function(a,b,c){if(typeof b!='string'){c=b;b=null}return this._makeNode(a,'defs',$.extend((b?{id:b}:{}),c||{}))},symbol:function(a,b,c,d,e,f,g){return this._makeNode(a,'symbol',$.extend({id:b,viewBox:c+' '+d+' '+e+' '+f},g||{}))},marker:function(a,b,c,d,e,f,g,h){if(typeof g=='object'){h=g;g=null}return this._makeNode(a,'marker',$.extend({id:b,refX:c,refY:d,markerWidth:e,markerHeight:f,orient:g||'auto'},h||{}))},style:function(a,b,c){var d=this._makeNode(a,'style',$.extend({type:'text/css'},c||{}));d.appendChild(this._svg.ownerDocument.createTextNode(this._escapeXML(b)));return d},script:function(a,b,c,d){if(typeof c=='object'){d=c;c=null}var e=this._makeNode(a,'script',$.extend({type:c||'text/javascript'},d||{}));e.appendChild(this._svg.ownerDocument.createTextNode(this._escapeXML(b)));return e},linearGradient:function(a,b,c,d,e,f,g,h){if(typeof d=='object'){h=d;d=null}var i=$.extend({id:b},(d!=null?{x1:d,y1:e,x2:f,y2:g}:{}));return this._gradient(a,'linearGradient',$.extend(i,h||{}),c)},radialGradient:function(a,b,c,d,e,r,f,g,h){if(typeof d=='object'){h=d;d=null}var i=$.extend({id:b},(d!=null?{cx:d,cy:e,r:r,fx:f,fy:g}:{}));return this._gradient(a,'radialGradient',$.extend(i,h||{}),c)},_gradient:function(a,b,c,d){var e=this._makeNode(a,b,c);for(var i=0;i<d.length;i++){var f=d[i];this._makeNode(e,'stop',$.extend({offset:f[0],stop_color:f[1]},(f[2]!=null?{stop_opacity:f[2]}:{})))}return e},pattern:function(a,b,x,y,c,d,e,f,g,h,i){if(typeof e=='object'){i=e;e=null}var j=$.extend({id:b,x:x,y:y,width:c,height:d},(e!=null?{viewBox:e+' '+f+' '+g+' '+h}:{}));return this._makeNode(a,'pattern',$.extend(j,i||{}))},mask:function(a,b,x,y,c,d,e){return this._makeNode(a,'mask',$.extend({id:b,x:x,y:y,width:c,height:d},e||{}))},createPath:function(){return new SVGPath()},createText:function(){return new SVGText()},svg:function(a,x,y,b,c,d,e,f,g,h){if(typeof d=='object'){h=d;d=null}var i=$.extend({x:x,y:y,width:b,height:c},(d!=null?{viewBox:d+' '+e+' '+f+' '+g}:{}));return this._makeNode(a,'svg',$.extend(i,h||{}))},group:function(a,b,c){if(typeof b=='object'){c=b;b=null}return this._makeNode(a,'g',$.extend({id:b},c||{}))},use:function(a,x,y,b,c,d,e){if(typeof x=='string'){d=x;e=y;x=y=b=c=null}var f=this._makeNode(a,'use',$.extend({x:x,y:y,width:b,height:c},e||{}));f.setAttributeNS(svgManager.xlinkNS,'href',d);return f},link:function(a,b,c){var d=this._makeNode(a,'a',c);d.setAttributeNS(svgManager.xlinkNS,'href',b);return d},image:function(a,x,y,b,c,d,e){var f=this._makeNode(a,'image',$.extend({x:x,y:y,width:b,height:c},e||{}));f.setAttributeNS(svgManager.xlinkNS,'href',d);return f},path:function(a,b,c){return this._makeNode(a,'path',$.extend({d:(b.path?b.path():b)},c||{}))},rect:function(a,x,y,b,c,d){return this._makeNode(a,'rect',$.extend({x:x,y:y,width:b,height:c},d||{}))},roundrect:function(a,x,y,b,c,d,e,f){return this._makeNode(a,'rect',$.extend({x:x,y:y,width:b,height:c,rx:d,ry:e},f||{}))},circle:function(a,b,c,r,d){return this._makeNode(a,'circle',$.extend({cx:b,cy:c,r:r},d||{}))},ellipse:function(a,b,c,d,e,f){return this._makeNode(a,'ellipse',$.extend({cx:b,cy:c,rx:d,ry:e},f||{}))},line:function(a,b,c,d,e,f){return this._makeNode(a,'line',$.extend({x1:b,y1:c,x2:d,y2:e},f||{}))},polyline:function(a,b,c){return this._poly(a,'polyline',b,c)},polygon:function(a,b,c){return this._poly(a,'polygon',b,c)},_poly:function(a,b,c,d){var e='';for(var i=0;i<c.length;i++){e+=c[i].join()+' '}return this._makeNode(a,b,$.extend({points:e},d||{}))},text:function(a,x,y,b,c){if(typeof x=='string'&&arguments.length<4){b=x;c=y;x=y=null}return this._text(a,'text',b,$.extend({x:(x&&isArray(x)?x.join(' '):x),y:(y&&isArray(y)?y.join(' '):y)},c||{}))},textpath:function(a,b,c,d){var e=this._text(a,'textPath',c,d||{});e.setAttributeNS(svgManager.xlinkNS,'href',b);return e},_text:function(a,b,c,d){var e=this._makeNode(a,b,d);if(typeof c=='string'){e.appendChild(e.ownerDocument.createTextNode(c))}else{for(var i=0;i<c._parts.length;i++){var f=c._parts[i];if(f[0]=='tspan'){var g=this._makeNode(e,f[0],f[2]);g.appendChild(e.ownerDocument.createTextNode(f[1]));e.appendChild(g)}else if(f[0]=='tref'){var g=this._makeNode(e,f[0],f[2]);g.setAttributeNS(svgManager.xlinkNS,'href',f[1]);e.appendChild(g)}else if(f[0]=='textpath'){var h=f[2].href;f[2].href=null;var g=this._makeNode(e,f[0],f[2]);g.setAttributeNS(svgManager.xlinkNS,'href',h);g.appendChild(e.ownerDocument.createTextNode(f[1]));e.appendChild(g)}else{e.appendChild(e.ownerDocument.createTextNode(f[1]))}}}return e},other:function(a,b,c){return this._makeNode(a,other,c||{})},_makeNode:function(a,b,c){a=a||this._svg;var d=this._svg.ownerDocument.createElementNS(svgManager.svgNS,b);for(var b in c){var e=c[b];if(e!=null&&e!=null&&(typeof e!='string'||e!='')){d.setAttribute(this._fromJSName(b),e)}}a.appendChild(d);return d},_fromJSName:function(a){return a.replace(/^_/,'').replace(/_/g,'-')},add:function(b,c){var d=this;b=b||this._svg;c=(c.jquery?c:$(c));c.each(function(){var a=d._cloneAsSVG(this);if(a){b.appendChild(a)}})},_cloneAsSVG:function(a){var b=null;if(a.nodeType==1){b=this._svg.ownerDocument.createElementNS(a.namespaceURI||svgManager.svgNS,this._checkName(a.nodeName));for(var i=0;i<a.attributes.length;i++){var c=a.attributes.item(i);if(c.nodeName!='xmlns'){if(c.prefix=='xlink'){b.setAttributeNS(svgManager.xlinkNS,c.localName,c.nodeValue)}else{b.setAttribute(this._checkName(c.nodeName),c.nodeValue)}}}for(var i=0;i<a.childNodes.length;i++){var d=this._cloneAsSVG(a.childNodes[i]);if(d){b.appendChild(d)}}}else if(a.nodeType==3){if($.trim(a.nodeValue)){b=this._svg.ownerDocument.createTextNode(a.nodeValue)}}else if(a.nodeType==4){if($.trim(a.nodeValue)){b=this._svg.ownerDocument.createCDATASection(a.nodeValue)}}return b},_checkName:function(a){a=(a.substring(0,1)>='A'&&a.substring(0,1)<='Z'?a.toLowerCase():a);return(a.substring(0,4)=='svg:'?a.substring(4):a)},load:function(e,f){if(!f){this.clear(true)}var g=this;var h=$.ajax({url:e,dataType:'xml',success:function(a){if($.browser.msie){a.loadXML(h.responseText);if(a.parseError.errorCode!=0){g.text(null,10,20,svgManager.local.errorLoadingText+': '+a.parseError.reason);return}}var b={};for(var i=0;i<a.documentElement.attributes.length;i++){var c=a.documentElement.attributes.item(i);if(!(c.nodeName=='version'||c.nodeName.substring(0,5)=='xmlns')){b[c.nodeName]=c.nodeValue}}g.configure(b,true);var d=a.documentElement.childNodes;for(var i=0;i<d.length;i++){g.add(null,d[i])}},error:function(a,b,c){g.text(null,10,20,svgManager.local.errorLoadingText+': '+b+(c?' '+c.message:''))}})},remove:function(a){a.parentNode.removeChild(a)},clear:function(a){if(a){this.configure({},true)}while(this._svg.firstChild){this._svg.removeChild(this._svg.firstChild)}},toSVG:function(){return this._toSVG(this._svg)},_toSVG:function(a){var b='';if(!a){return b}if(a.nodeType==3){b=a.nodeValue}else if(a.nodeType==4){b='<![CDATA['+a.nodeValue+']]>'}else{b='<'+a.nodeName;if(a.attributes){for(var i=0;i<a.attributes.length;i++){var c=a.attributes.item(i);if(!($.trim(c.nodeValue)==''||c.nodeValue.match(/^\[object/)||c.nodeValue.match(/^function/))){b+=' '+(c.namespaceURI==svgManager.xlinkNS?'xlink:':'')+c.nodeName+'="'+c.nodeValue+'"'}}}if(a.firstChild){b+='>';var d=a.firstChild;while(d){b+=this._toSVG(d);d=d.nextSibling}b+='</'+a.nodeName+'>'}else{b+='/>'}}return b},_escapeXML:function(a){a=a.replace(/&/g,'&amp;');a=a.replace(/</g,'&lt;');a=a.replace(/>/g,'&gt;');return a}});function SVGPath(){this._path=''}$.extend(SVGPath.prototype,{reset:function(){this._path='';return this},moveTo:function(x,y,a){a=(isArray(x)?y:a);return this._coords((a?'m':'M'),x,y)},lineTo:function(x,y,a){a=(isArray(x)?y:a);return this._coords((a?'l':'L'),x,y)},horizTo:function(x,a){this._path+=(a?'h':'H')+x;return this},vertTo:function(y,a){this._path+=(a?'v':'V')+y;return this},curveCTo:function(a,b,c,d,x,y,e){e=(isArray(a)?b:e);return this._coords((e?'c':'C'),a,b,c,d,x,y)},smoothCTo:function(a,b,x,y,c){c=(isArray(a)?b:c);return this._coords((c?'s':'S'),a,b,x,y)},curveQTo:function(a,b,x,y,c){c=(isArray(a)?b:c);return this._coords((c?'q':'Q'),a,b,x,y)},smoothQTo:function(x,y,a){a=(isArray(x)?y:a);return this._coords((a?'t':'T'),x,y)},_coords:function(a,b,c,d,e,f,g){if(isArray(b)){for(var i=0;i<b.length;i++){var h=b[i];this._path+=(i==0?a:' ')+h[0]+','+h[1]+(h.length<4?'':' '+h[2]+','+h[3]+(h.length<6?'':' '+h[4]+','+h[5]))}}else{this._path+=a+b+','+c+(d==null?'':' '+d+','+e+(f==null?'':' '+f+','+g))}return this},arcTo:function(a,b,c,d,e,x,y,f){f=(isArray(a)?b:f);this._path+=(f?'a':'A');if(isArray(a)){for(var i=0;i<a.length;i++){var g=a[i];this._path+=(i==0?'':' ')+g[0]+','+g[1]+' '+g[2]+' '+(g[3]?'1':'0')+','+(g[4]?'1':'0')+' '+g[5]+','+g[6]}}else{this._path+=a+','+b+' '+c+' '+(d?'1':'0')+','+(e?'1':'0')+' '+x+','+y}return this},close:function(){this._path+='z';return this},path:function(){return this._path}});function SVGText(){this._parts=[]}$.extend(SVGText.prototype,{reset:function(){this._parts=[];return this},string:function(a){this._parts[this._parts.length]=['text',a];return this},span:function(a,b){this._parts[this._parts.length]=['tspan',a,b];return this},ref:function(a,b){this._parts[this._parts.length]=['tref',a,b];return this},path:function(a,b,c){this._parts[this._parts.length]=['textpath',b,$.extend({href:a},c||{})];return this}});$.fn.svg=function(a,b,c){if(typeof a=='function'){c=b;b=a;a=null}if(a&&typeof a=='object'){c=a;a=b=null}if(b&&typeof b=='object'){c=b;b=null}return this.each(function(){svgManager._connectSVG(this,a,b,c)})};function isArray(a){return(a.constructor&&a.constructor.toString().match(/\Array\(\)/))}svgManager=new SVGManager()})(jQuery);
\ No newline at end of file
diff --git a/src/public/javascripts/jquery-svg/jquery.svg.pack.js b/src/public/javascripts/jquery-svg/jquery.svg.pack.js
deleted file mode 100644
index 24fc148..0000000
--- a/src/public/javascripts/jquery-svg/jquery.svg.pack.js
+++ /dev/null
@@ -1,7 +0,0 @@
-/* http://keith-wood.name/svg.html
-   SVG for jQuery v1.0.1.
-   Written by Keith Wood (kbwood@iprimus.com.au) August 2007.
-   Dual licensed under the GPL (http://dev.jquery.com/browser/trunk/jquery/GPL-LICENSE.txt) and 
-   MIT (http://dev.jquery.com/browser/trunk/jquery/MIT-LICENSE.txt) licenses. 
-   Please attribute the author if you use it. */
-eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('k E=o;(8($){8 1t(){7.27=0;7.1j=[];7.1u=[];7.1f=[];7.1v=[];7.1v[\'\']={28:\'2W 1w 2X 2Y 2Z 29\',1x:\'30 31\'};7.1k=7.1v[\'\']}$.u(1t.1l,{1m:\'1y://1z.1A.1n/32/Y\',11:\'1y://1z.1A.1n/33/1B\',2a:1C,2b:8(a,b,c,d){k e=7.27++;a.1D=e;k f=o;n($.1w.2c){a.2d=\'<34 1E="1F/Y+2e" 12="\'+a.1G+\'" 13="\'+a.1H+\'" 35="36.Y"/>\';7.1u[e]=[a,b,d,c]}J n(1o||1b.2f.2g("1y://1z.1A.1n/37/38/39#29","1.1")||1b.2f.2g("1n.3a.Y","1.1")){f=1b.1I(7.1m,\'Y\');f.1c(\'1J\',\'1.1\');f.1c(\'12\',a.1G);f.1c(\'13\',a.1H);a.G(f);7.1K(e,f,[a,b,d,c])}J{a.2d=\'<p 3b="3c">\'+7.1k.28+\'</p>\'}9 e},3d:8(){I(k i=0;i<1b.1L.B;i++){k a=1b.1L[i].2h.1D;k b=1b.1L[i].3e();b=(b?b.1p:o);n(a!=o&&b&&!7.1j[a]){7.1K(a,b)}}},1K:8(a,b,c){k c=c||7.1u[a];k d=7.1j[a]=1g 7.2a(b,c[0]);n(c[1]){d.2i(c[1])}n(c[2]){d.1q(c[2])}n(c[3]){c[3](c[0])}},3f:8(a){a=(F a==\'17\'?$(a)[0]:(a.2j?a[0]:a));9 7.1j[a.1D]},3g:8(a,b){7.1f[7.1f.B]=[a,b]}});8 1C(a,b){7.D=a;7.1M=b;I(k i=0;i<E.1f.B;i++){k c=E.1f[i];7[c[0]]=1g c[1](7)}}$.u(1C.1l,{3h:8(){9 7.1M.1G},3i:8(){9 7.1M.1H},1q:8(a,b){n(b){I(k i=7.D.W.B-1;i>=0;i--){k c=7.D.W.1r(i);n(!(c.K==\'3j\'||c.K==\'1J\'||c.K.1d(0,5)==\'1N\')){7.D.W.3k(c.K)}}}I(k d 2k a){7.D.1c(d,a[d])}9 7},2l:8(a){9 7.D.2l(a)},2m:8(a,b,c){k d=7.w(a,\'2m\',c||{});d.G(7.D.O.14(b));9 d},3l:8(a,b,c){k d=7.w(a,\'3m\',c||{});d.G(7.D.O.14(b));9 d},2n:8(a,b,c){n(F b!=\'17\'){c=b;b=o}9 7.w(a,\'2n\',$.u((b?{16:b}:{}),c||{}))},2o:8(a,b,c,d,e,f,g){9 7.w(a,\'2o\',$.u({16:b,1O:c+\' \'+d+\' \'+e+\' \'+f},g||{}))},2p:8(a,b,c,d,e,f,g,h){n(F g==\'X\'){h=g;g=o}9 7.w(a,\'2p\',$.u({16:b,3n:c,3o:d,3p:e,3q:f,3r:g||\'3s\'},h||{}))},2q:8(a,b,c){k d=7.w(a,\'2q\',$.u({1E:\'18/3t\'},c||{}));d.G(7.D.O.14(7.1P(b)));9 d},2r:8(a,b,c,d){n(F c==\'X\'){d=c;c=o}k e=7.w(a,\'2r\',$.u({1E:c||\'18/3u\'},d||{}));e.G(7.D.O.14(7.1P(b)));9 e},2s:8(a,b,c,d,e,f,g,h){n(F d==\'X\'){h=d;d=o}k i=$.u({16:b},(d!=o?{2t:d,2u:e,2v:f,2w:g}:{}));9 7.1Q(a,\'2s\',$.u(i,h||{}),c)},2x:8(a,b,c,d,e,r,f,g,h){n(F d==\'X\'){h=d;d=o}k i=$.u({16:b},(d!=o?{1R:d,1S:e,r:r,3v:f,3w:g}:{}));9 7.1Q(a,\'2x\',$.u(i,h||{}),c)},1Q:8(a,b,c,d){k e=7.w(a,b,c);I(k i=0;i<d.B;i++){k f=d[i];7.w(e,\'3x\',$.u({3y:f[0],3z:f[1]},(f[2]!=o?{3A:f[2]}:{})))}9 e},2y:8(a,b,x,y,c,d,e,f,g,h,i){n(F e==\'X\'){i=e;e=o}k j=$.u({16:b,x:x,y:y,12:c,13:d},(e!=o?{1O:e+\' \'+f+\' \'+g+\' \'+h}:{}));9 7.w(a,\'2y\',$.u(j,i||{}))},2z:8(a,b,x,y,c,d,e){9 7.w(a,\'2z\',$.u({16:b,x:x,y:y,12:c,13:d},e||{}))},3B:8(){9 1g 1T()},3C:8(){9 1g 1U()},Y:8(a,x,y,b,c,d,e,f,g,h){n(F d==\'X\'){h=d;d=o}k i=$.u({x:x,y:y,12:b,13:c},(d!=o?{1O:d+\' \'+e+\' \'+f+\' \'+g}:{}));9 7.w(a,\'Y\',$.u(i,h||{}))},3D:8(a,b,c){n(F b==\'X\'){c=b;b=o}9 7.w(a,\'g\',$.u({16:b},c||{}))},2A:8(a,x,y,b,c,d,e){n(F x==\'17\'){d=x;e=y;x=y=b=c=o}k f=7.w(a,\'2A\',$.u({x:x,y:y,12:b,13:c},e||{}));f.19(E.11,\'15\',d);9 f},3E:8(a,b,c){k d=7.w(a,\'a\',c);d.19(E.11,\'15\',b);9 d},1F:8(a,x,y,b,c,d,e){k f=7.w(a,\'1F\',$.u({x:x,y:y,12:b,13:c},e||{}));f.19(E.11,\'15\',d);9 f},1e:8(a,b,c){9 7.w(a,\'1e\',$.u({d:(b.1e?b.1e():b)},c||{}))},1V:8(a,x,y,b,c,d){9 7.w(a,\'1V\',$.u({x:x,y:y,12:b,13:c},d||{}))},3F:8(a,x,y,b,c,d,e,f){9 7.w(a,\'1V\',$.u({x:x,y:y,12:b,13:c,2B:d,2C:e},f||{}))},2D:8(a,b,c,r,d){9 7.w(a,\'2D\',$.u({1R:b,1S:c,r:r},d||{}))},2E:8(a,b,c,d,e,f){9 7.w(a,\'2E\',$.u({1R:b,1S:c,2B:d,2C:e},f||{}))},2F:8(a,b,c,d,e,f){9 7.w(a,\'2F\',$.u({2t:b,2u:c,2v:d,2w:e},f||{}))},2G:8(a,b,c){9 7.1W(a,\'2G\',b,c)},2H:8(a,b,c){9 7.1W(a,\'2H\',b,c)},1W:8(a,b,c,d){k e=\'\';I(k i=0;i<c.B;i++){e+=c[i].1X()+\' \'}9 7.w(a,b,$.u({3G:e},d||{}))},18:8(a,x,y,b,c){n(F x==\'17\'&&3H.B<4){b=x;c=y;x=y=o}9 7.1Y(a,\'18\',b,$.u({x:(x&&P(x)?x.1X(\' \'):x),y:(y&&P(y)?y.1X(\' \'):y)},c||{}))},1Z:8(a,b,c,d){k e=7.1Y(a,\'3I\',c,d||{});e.19(E.11,\'15\',b);9 e},1Y:8(a,b,c,d){k e=7.w(a,b,d);n(F c==\'17\'){e.G(e.O.14(c))}J{I(k i=0;i<c.R.B;i++){k f=c.R[i];n(f[0]==\'2I\'){k g=7.w(e,f[0],f[2]);g.G(e.O.14(f[1]));e.G(g)}J n(f[0]==\'2J\'){k g=7.w(e,f[0],f[2]);g.19(E.11,\'15\',f[1]);e.G(g)}J n(f[0]==\'1Z\'){k h=f[2].15;f[2].15=o;k g=7.w(e,f[0],f[2]);g.19(E.11,\'15\',h);g.G(e.O.14(f[1]));e.G(g)}J{e.G(e.O.14(f[1]))}}}9 e},2K:8(a,b,c){9 7.w(a,2K,c||{})},w:8(a,b,c){a=a||7.D;k d=7.D.O.1I(E.1m,b);I(k b 2k c){k e=c[b];n(e!=o&&e!=o&&(F e!=\'17\'||e!=\'\')){d.1c(7.2L(b),e)}}a.G(d);9 d},2L:8(a){9 a.1h(/^2M/,\'\').1h(/2M/g,\'-\')},2N:8(b,c){k d=7;b=b||7.D;c=(c.2j?c:$(c));c.2O(8(){k a=d.21(7);n(a){b.G(a)}})},21:8(a){k b=o;n(a.1i==1){b=7.D.O.1I(a.2P||E.1m,7.22(a.K));I(k i=0;i<a.W.B;i++){k c=a.W.1r(i);n(c.K!=\'1N\'){n(c.3J==\'1B\'){b.19(E.11,c.3K,c.N)}J{b.1c(7.22(c.K),c.N)}}}I(k i=0;i<a.23.B;i++){k d=7.21(a.23[i]);n(d){b.G(d)}}}J n(a.1i==3){n($.24(a.N)){b=7.D.O.14(a.N)}}J n(a.1i==4){n($.24(a.N)){b=7.D.O.3L(a.N)}}9 b},22:8(a){a=(a.1d(0,1)>=\'A\'&&a.1d(0,1)<=\'Z\'?a.3M():a);9(a.1d(0,4)==\'Y:\'?a.1d(4):a)},2i:8(e,f){n(!f){7.2Q(1o)}k g=7;k h=$.3N({3O:e,3P:\'2e\',3Q:8(a){n($.1w.2c){a.3R(h.3S);n(a.2R.3T!=0){g.18(o,10,20,E.1k.1x+\': \'+a.2R.3U);9}}k b={};I(k i=0;i<a.1p.W.B;i++){k c=a.1p.W.1r(i);n(!(c.K==\'1J\'||c.K.1d(0,5)==\'1N\')){b[c.K]=c.N}}g.1q(b,1o);k d=a.1p.23;I(k i=0;i<d.B;i++){g.2N(o,d[i])}},3V:8(a,b,c){g.18(o,10,20,E.1k.1x+\': \'+b+(c?\' \'+c.3W:\'\'))}})},3X:8(a){a.2h.2S(a)},2Q:8(a){n(a){7.1q({},1o)}2T(7.D.1s){7.D.2S(7.D.1s)}},3Y:8(){9 7.25(7.D)},25:8(a){k b=\'\';n(!a){9 b}n(a.1i==3){b=a.N}J n(a.1i==4){b=\'<![3Z[\'+a.N+\']]>\'}J{b=\'<\'+a.K;n(a.W){I(k i=0;i<a.W.B;i++){k c=a.W.1r(i);n(!($.24(c.N)==\'\'||c.N.26(/^\\[X/)||c.N.26(/^8/))){b+=\' \'+(c.2P==E.11?\'1B:\':\'\')+c.K+\'="\'+c.N+\'"\'}}}n(a.1s){b+=\'>\';k d=a.1s;2T(d){b+=7.25(d);d=d.40}b+=\'</\'+a.K+\'>\'}J{b+=\'/>\'}}9 b},1P:8(a){a=a.1h(/&/g,\'&41;\');a=a.1h(/</g,\'&42;\');a=a.1h(/>/g,\'&43;\');9 a}});8 1T(){7.U=\'\'}$.u(1T.1l,{2U:8(){7.U=\'\';9 7},44:8(x,y,a){a=(P(x)?y:a);9 7.1a((a?\'m\':\'M\'),x,y)},45:8(x,y,a){a=(P(x)?y:a);9 7.1a((a?\'l\':\'L\'),x,y)},46:8(x,a){7.U+=(a?\'h\':\'H\')+x;9 7},47:8(y,a){7.U+=(a?\'v\':\'V\')+y;9 7},48:8(a,b,c,d,x,y,e){e=(P(a)?b:e);9 7.1a((e?\'c\':\'C\'),a,b,c,d,x,y)},49:8(a,b,x,y,c){c=(P(a)?b:c);9 7.1a((c?\'s\':\'S\'),a,b,x,y)},4a:8(a,b,x,y,c){c=(P(a)?b:c);9 7.1a((c?\'q\':\'Q\'),a,b,x,y)},4b:8(x,y,a){a=(P(x)?y:a);9 7.1a((a?\'t\':\'T\'),x,y)},1a:8(a,b,c,d,e,f,g){n(P(b)){I(k i=0;i<b.B;i++){k h=b[i];7.U+=(i==0?a:\' \')+h[0]+\',\'+h[1]+(h.B<4?\'\':\' \'+h[2]+\',\'+h[3]+(h.B<6?\'\':\' \'+h[4]+\',\'+h[5]))}}J{7.U+=a+b+\',\'+c+(d==o?\'\':\' \'+d+\',\'+e+(f==o?\'\':\' \'+f+\',\'+g))}9 7},4c:8(a,b,c,d,e,x,y,f){f=(P(a)?b:f);7.U+=(f?\'a\':\'A\');n(P(a)){I(k i=0;i<a.B;i++){k g=a[i];7.U+=(i==0?\'\':\' \')+g[0]+\',\'+g[1]+\' \'+g[2]+\' \'+(g[3]?\'1\':\'0\')+\',\'+(g[4]?\'1\':\'0\')+\' \'+g[5]+\',\'+g[6]}}J{7.U+=a+\',\'+b+\' \'+c+\' \'+(d?\'1\':\'0\')+\',\'+(e?\'1\':\'0\')+\' \'+x+\',\'+y}9 7},4d:8(){7.U+=\'z\';9 7},1e:8(){9 7.U}});8 1U(){7.R=[]}$.u(1U.1l,{2U:8(){7.R=[];9 7},17:8(a){7.R[7.R.B]=[\'18\',a];9 7},4e:8(a,b){7.R[7.R.B]=[\'2I\',a,b];9 7},4f:8(a,b){7.R[7.R.B]=[\'2J\',a,b];9 7},1e:8(a,b,c){7.R[7.R.B]=[\'1Z\',b,$.u({15:a},c||{})];9 7}});$.4g.Y=8(a,b,c){n(F a==\'8\'){c=b;b=a;a=o}n(a&&F a==\'X\'){c=a;a=b=o}n(b&&F b==\'X\'){c=b;b=o}9 7.2O(8(){E.2b(7,a,b,c)})};8 P(a){9(a.2V&&a.2V.4h().26(/\\4i\\(\\)/))}E=1g 1t()})(4j);',62,268,'|||||||this|function|return|||||||||||var|||if|null||||||extend||_makeNode|||||length||_svg|svgManager|typeof|appendChild||for|else|nodeName|||nodeValue|ownerDocument|isArray||_parts|||_path||attributes|object|svg|||xlinkNS|width|height|createTextNode|href|id|string|text|setAttributeNS|_coords|document|setAttribute|substring|path|_extensions|new|replace|nodeType|_svgs|local|prototype|svgNS|org|true|documentElement|configure|item|firstChild|SVGManager|_settings|regional|browser|errorLoadingText|http|www|w3|xlink|SVGRoot|_svgId|type|image|clientWidth|clientHeight|createElementNS|version|_afterLoad|embeds|_container|xmlns|viewBox|_escapeXML|_gradient|cx|cy|SVGPath|SVGText|rect|_poly|join|_text|textpath||_cloneAsSVG|_checkName|childNodes|trim|_toSVG|match|_nextId|notSupportedText|SVG|_rootClass|_connectSVG|msie|innerHTML|xml|implementation|hasFeature|parentNode|load|jquery|in|getElementById|title|defs|symbol|marker|style|script|linearGradient|x1|y1|x2|y2|radialGradient|pattern|mask|use|rx|ry|circle|ellipse|line|polyline|polygon|tspan|tref|other|_fromJSName|_|add|each|namespaceURI|clear|parseError|removeChild|while|reset|constructor|This|does|not|support|Error|loading|2000|1999|embed|src|blank|TR|SVG11|feature|w3c|class|svg_error|_registerSVG|getSVGDocument|getSVGFor|addExtension|_width|_height|onload|removeNamedItem|describe|desc|refX|refY|markerWidth|markerHeight|orient|auto|css|javascript|fx|fy|stop|offset|stop_color|stop_opacity|createPath|createText|group|link|roundrect|points|arguments|textPath|prefix|localName|createCDATASection|toLowerCase|ajax|url|dataType|success|loadXML|responseText|errorCode|reason|error|message|remove|toSVG|CDATA|nextSibling|amp|lt|gt|moveTo|lineTo|horizTo|vertTo|curveCTo|smoothCTo|curveQTo|smoothQTo|arcTo|close|span|ref|fn|toString|Array|jQuery'.split('|'),0,{}))
\ No newline at end of file
diff --git a/src/public/javascripts/jquery-svg/jquery.svgfilter.js b/src/public/javascripts/jquery-svg/jquery.svgfilter.js
deleted file mode 100644
index cd9e6bd..0000000
--- a/src/public/javascripts/jquery-svg/jquery.svgfilter.js
+++ /dev/null
@@ -1,396 +0,0 @@
-/* http://keith-wood.name/svg.html
-   SVG filters for jQuery v1.0.1.
-   Written by Keith Wood (kbwood@iprimus.com.au) August 2007.
-   Dual licensed under the GPL (http://dev.jquery.com/browser/trunk/jquery/GPL-LICENSE.txt) and 
-   MIT (http://dev.jquery.com/browser/trunk/jquery/MIT-LICENSE.txt) licenses. 
-   Please attribute the author if you use it. */
-
-(function($) { // Hide scope, no $ conflict
-
-svgManager.addExtension('filters', SVGFilter);
-
-$.extend(svgManager._rootClass.prototype, {
-
-	/* Add a filter definition.
-	   @param  parent    element - the parent node for the new filter
-	   @param  id        string - the ID for this filter
-	   @param  x         number - the x-coordinate for the left edge of the filter
-	   @param  y         number - the y-coordinate for the top edge of the filter
-	   @param  width     number - the width of the filter
-	   @param  height    number - the height of the filter
-	   @param  settings  object - additional settings for the filter (optional)
-	   @return  the new filter node */
-	filter: function(parent, id, x, y, width, height, settings) {
-		return this._makeNode(parent, 'filter', $.extend(
-			{id: id, x: x, y: y, width: width, height: height}, settings || {}));
-	}
-});
-
-/* Extension point for SVG filters.
-   Access through root.filters. */
-function SVGFilter(root) {
-	this._root = root; // The attached SVG root object
-}
-
-$.extend(SVGFilter.prototype, {
-
-	/* Add a distant light filter.
-	   @param  parent     element - the parent node for the new filter
-	   @param  result     string - the ID of this filter
-	   @param  azimuth    number - the angle (degrees) in the XY plane for the light source
-	   @param  elevation  number - the angle (degrees) in the YZ plane for the light source
-	   @param  settings   object - additional settings for the filter (optional)
-	   @return  the new filter node */
-	distantLight: function(parent, result, azimuth, elevation, settings) {
-		return this._root._makeNode(parent, 'feDistantLight', $.extend(
-			{result: result, azimuth: azimuth, elevantion: elevation}, settings || {}));
-	},
-
-	/* Add a point light filter.
-	   @param  parent    element - the parent node for the new filter
-	   @param  result    string - the ID of this filter
-	   @param  x         number - the x-coordinate for the light source
-	   @param  y         number - the y-coordinate for the light source
-	   @param  z         number - the z-coordinate for the light source
-	   @param  settings  object - additional settings for the filter (optional)
-	   @return  the new filter node */
-	pointLight: function(parent, result, x, y, z, settings) {
-		return this._root._makeNode(parent, 'fePointLight', $.extend(
-			{result: result, x: x, y: y, z: z}, settings || {}));
-	},
-
-	/* Add a spot light filter.
-	   Specify all of toX, toY, toZ or none of them.
-	   @param  parent    element - the parent node for the new filter
-	   @param  result    string - the ID of this filter
-	   @param  x         number - the x-coordinate for the light source
-	   @param  y         number - the y-coordinate for the light source
-	   @param  z         number - the z-coordinate for the light source
-	   @param  toX       number - the x-coordinate for where the light is pointing (optional)
-	   @param  toY       number - the y-coordinate for where the light is pointing (optional)
-	   @param  toZ       number - the z-coordinate for where the light is pointing (optional)
-	   @param  settings  object - additional settings for the filter (optional)
-	   @return  the new filter node */
-	spotLight: function(parent, result, x, y, z, toX, toY, toZ, settings) {
-		if (typeof toX == 'object') {
-			settings = toX;
-			toX = null;
-		}
-		var sets = $.extend({result: result, x: x, y: y, z: z}, 
-			(toX != null ? {pointsAtX: toX, pointsAtY: toY, pointsAtZ: toZ} : {}));
-		return this._root._makeNode(parent, 'feSpotLight', $.extend(sets, settings || {}));
-	},
-
-	/* Add a blend filter.
-	   @param  parent    element - the parent node for the new filter
-	   @param  result    string - the ID of this filter
-	   @param  mode      string - normal | multiply | screen | darken | lighten
-	   @param  in1       string - the first image to blend
-	   @param  in2       string - the second image to blend
-	   @param  settings  object - additional settings for the filter (optional)
-	   @return  the new filter node */
-	blend: function(parent, result, mode, in1, in2, settings) {
-		return this._root._makeNode(parent, 'feBlend', $.extend(
-			{result: result, mode: mode, _in: in1, in2: in2}, settings || {}));
-	},
-
-	/* Add a colour matrix filter.
-	   @param  parent    element - the parent node for the new filter
-	   @param  result    string - the ID of this filter
-	   @param  in1       string - the source to colour
-	   @param  type      string - matrix | saturate | hueRotate | luminanceToAlpha
-	   @param  values    number[][] - for 'matrix' the matrix (5x4) values to apply
-	                     number - for 'saturate' 0.0 to 1.0
-						 number - for 'hueRotate' degrees
-						 void - for 'luminanceToAlpha'
-	   @param  settings  object - additional settings for the filter (optional)
-	   @return  the new filter node */
-	colorMatrix: function(parent, result, in1, type, values, settings) {
-		if (isArray(values)) {
-			var vs = '';
-			for (var i = 0; i < values.length; i++) {
-				vs += (i == 0 ? '' : ' ') + values[i].join(' ');
-			}
-			values = vs;
-		}
-		else if (typeof values == 'object') {
-			settings = values;
-			values = null;
-		}
-		var sets = $.extend({result: result, _in: in1, type: type},
-			(values != null ? {values: values} : {}));
-		return this._root._makeNode(parent, 'feColorMatrix', $.extend(sets, settings || {}));
-	},
-
-	/* Add a component transfer filter.
-	   @param  parent     element - the parent node for the new filter
-	   @param  result     string - the ID of this filter
-	   @param  functions  object[] - one for each of RGB and A (alpha, optional)
-	                      for each entry: 
-	                      [0] is string - identity | table | discrete | linear | gamma
-	                      [1] is number[] - for 'table' or 'discrete' the list of 
-	                      interpolation or step values OR
-	                      number - for 'linear' the slope, for 'gamma' the amplitude,
-	                      [2] is number - for 'linear' the intercept, for 'gamma' the exponent,
-	                      [3] is number - for 'gamma' the offset
-	   @param  settings   object - additional settings for the filter (optional)
-	   @return  the new filter node */
-	componentTransfer: function(parent, result, functions, settings) {
-		var node = this._root._makeNode(parent, 'feComponentTransfer', 
-			$.extend({result: result}, settings || {}));
-		var rgba = ['R', 'G', 'B', 'A'];
-		for (var i = 0; i < Math.min(4, functions.length); i++) {
-			var props = functions[i];
-			var sets = $.extend({type: props[0]}, 
-				(type == 'table' || type == 'discrete' ? {table: props[1].join(' ')} : 
-				(type == 'linear' ? {slope: props[1], intercept: props[2]} : 
-				(type == 'gamma' ? {amplitude: props[1], 
-				exponent: props[2], offset: props[3]} : {}))));
-			this._root._makeNode(node, 'feFunc' + rgba[i], sets);
-		}
-		return node;
-	},
-
-	/* Add a composite filter.
-	   Specify all of k1, k2, k3, k4 or none of them.
-	   @param  parent    element - the parent node for the new filter
-	   @param  result    string - the ID of this filter
-	   @param  operator  string - over | in | out | atop | xor | arithmetic
-	   @param  in1       string - the first filter to compose
-	   @param  in2       string - the second filter to compose
-	   @param  k1        number - for 'arithmetic' (optional)
-	   @param  k2        number - for 'arithmetic' (optional)
-	   @param  k3        number - for 'arithmetic' (optional)
-	   @param  k4        number - for 'arithmetic' (optional)
-	   @param  settings  object - additional settings for the filter (optional)
-	   @return  the new filter node */
-	composite: function(parent, result, operator, in1, in2, k1, k2, k3, k4, settings) {
-		if (typeof k1 == 'object') {
-			settings = k1;
-			k1 = null;
-		}
-		var sets = $.extend({result: result, operator: operator, _in: in1, in2: in2},
-			(k1 != null ? {k1: k1, k2: k2, k3: k3, k4: k4} : {}));
-		return this._root._makeNode(parent, 'feComposite', 
-			$.extend(sets, settings || {}));
-	},
-
-	/* Add a convolve matrix filter.
-	   @param  parent    element - the parent node for the new filter
-	   @param  result    string - the ID of this filter
-	   @param  order     int or 'int int' - the size(s) of the matrix
-	   @param  matrix    number[][] - the kernel matrix for the convolution
-	   @param  settings  object - additional settings for the filter (optional)
-	   @return  the new filter node */
-	convolveMatrix: function(parent, result, order, matrix, settings) {
-		var mx = '';
-		for (var i = 0; i < matrix.length; i++) {
-			mx += (i == 0 ? '' : ' ') + matrix[i].join(' ');
-		}
-		matrix = mx;
-		return this._root._makeNode(parent, 'feConvolveMatrix', $.extend(
-			{result: result, order: order, kernelMatrix: matrix}, settings || {}));
-	},
-
-	/* Add a diffuse lighting filter.
-	   @param  parent    element - the parent node for the new filter
-	   @param  result    string - the ID of this filter
-	   @param  colour    string - the lighting colour (optional)
-	   @param  settings  object - additional settings for the filter (optional)
-	   @return  the new filter node */
-	diffuseLighting: function(parent, result, colour, settings) {
-		if (typeof colour == 'object') {
-			settings = colour;
-			colour = null;
-		}
-		return this._root._makeNode(parent, 'feDiffuseLighting', 
-			$.extend($.extend({result: result}, (colour ? {lighting_color: colour} : {})), settings || {}));
-	},
-
-	/* Add a displacement map filter.
-	   @param  parent    element - the parent node for the new filter
-	   @param  result    string - the ID of this filter
-	   @param  in1       string - the source image
-	   @param  in2       string - the displacement image
-	   @param  settings  object - additional settings for the filter (optional)
-	   @return  the new filter node */
-	displacementMap: function(parent, result, in1, in2, settings) {
-		return this._root._makeNode(parent, 'feDisplacementMap', 
-			$.extend({result: result, _in: in1, in2: in2}, settings || {}));
-	},
-
-	/* Add a flood filter.
-	   Specify all of x, y, width, height or none of them.
-	   @param  parent    element - the parent node for the new filter
-	   @param  result    string - the ID of this filter
-	   @param  x         number - the left coordinate of the rectangle (optional)
-	   @param  y         number - the top coordinate of the rectangle (optional)
-	   @param  width     number - the width of the rectangle (optional)
-	   @param  height    number - the height of the rectangle (optional)
-	   @param  colour    string - the colour to fill with
-	   @param  opacity   number - the opacity 0.0-1.0
-	   @param  settings  object - additional settings for the filter (optional)
-	   @return  the new filter node */
-	flood: function(parent, result, x, y, width, height, colour, opacity, settings) {
-		if (arguments.length < 6) {
-			colour = x;
-			opacity = y;
-			settings = width;
-			x = null;
-		}
-		var sets = $.extend({result: result, flood_color: colour, flood_opacity: opacity},
-			(x != null ? {x: x, y: y, width: width, height: height} : {}));
-		return this._root._makeNode(parent, 'feFlood', 
-			$.extend(sets, settings || {}));
-	},
-
-	/* Add a Gaussian blur filter.
-	   @param  parent    element - the parent node for the new filter
-	   @param  result    string - the ID of this filter
-	   @param  in1       string - the source filter
-	   @param  stdDevX   number - the standard deviation along the x-axis
-	   @param  stdDevY   number - the standard deviation along the y-axis (optional)
-	   @param  settings  object - additional settings for the filter (optional)
-	   @return  the new filter node */
-	gaussianBlur: function(parent, result, in1, stdDevX, stdDevY, settings) {
-		if (typeof stdDevY == 'object') {
-			settings = stdDevY;
-			stdDevY = null;
-		}
-		return this._root._makeNode(parent, 'feGaussianBlur', $.extend(
-			{result: result, _in: in1, stdDeviation: stdDevX + (stdDevY ? ' ' + stdDevY : '')}, 
-			settings || {}));
-	},
-
-	/* Add an image filter.
-	   @param  parent    element - the parent node for the new filter
-	   @param  result    string - the ID of this filter
-	   @param  href      string - the URL of the image
-	   @param  settings  object - additional settings for the filter (optional)
-	   @return  the new filter node */
-	image: function(parent, result, href, settings) {
-		var node = this._root._makeNode(parent, 'feImage', $.extend(
-			{result: result}, settings || {}));
-		node.setAttributeNS(svgManager._xlinkNS, 'href', href);
-		return node;
-	},
-
-	/* Add a merge filter.
-	   @param  parent    element - the parent node for the new filter
-	   @param  result    string - the ID of this filter
-	   @param  refs      string[] - the IDs of the filters to merge
-	   @param  settings  object - additional settings for the filter (optional)
-	   @return  the new filter node */
-	merge: function(parent, result, refs, settings) {
-		var node = this._root._makeNode(parent, 'feMerge', $.extend(
-			{result: result}, settings || {}));
-		for (var i = 0; i < refs.length; i++) {
-			this._root._makeNode(node, 'feMergeNode', {_in: refs[i]});
-		}
-		return node;
-	},
-
-	/* Add a morphology filter.
-	   @param  parent    element - the parent node for the new filter
-	   @param  result    string - the ID of this filter
-	   @param  in1       string - the source filter
-	   @param  operator  string - erode | dilate
-	   @param  radiusX   number - the size of the operation in the x-axis
-	   @param  radiusY   number - the size of the operation in the y-axis (optional)
-	   @param  settings  object - additional settings for the filter (optional)
-	   @return  the new filter node */
-	morphology: function(parent, result, in1, operator, radiusX, radiusY, settings) {
-		if (typeof radiusY == 'object') {
-			settings = radiusY;
-			radiusY = null;
-		}
-		return this._root._makeNode(parent, 'feMorphology', $.extend(
-			{result: result, _in: in1, operator: operator, 
-			radius: radiusX + (radiusY ? ' ' + radiusY : '')}, settings || {}));
-	},
-
-	/* Add an offset filter.
-	   @param  parent    element - the parent node for the new filter
-	   @param  result    string - the ID of this filter
-	   @param  in1       string - the source filter
-	   @param  dX        number - the offset in the x-axis
-	   @param  dY        number - the offset in the y-axis
-	   @param  settings  object - additional settings for the filter (optional)
-	   @return  the new filter node */
-	offset: function(parent, result, in1, dx, dy, settings) {
-		return this._root._makeNode(parent, 'feOffset', $.extend(
-			{result: result, _in: in1, dx: dx, dy: dy}, settings || {}));
-	},
-
-	/* Add a specular lighting filter.
-	   Numeric params are only optional if following numeric params are also omitted.
-	   @param  parent            element - the parent node for the new filter
-	   @param  result            string - the ID of this filter
-	   @param  in1               string - the source filter
-	   @param  surfaceScale      number - the surface height when Ain = 1 (optional)
-	   @param  specularConstant  number - the ks in Phong lighting model (optional)
-	   @param  specularExponent  number - the shininess 1.0-128.0 (optional)
-	   @param  settings          object - additional settings for the filter (optional)
-	   @return  the new filter node */
-	specularLighting: function(parent, result, in1, surfaceScale, 
-			specularConstant, specularExponent, settings) {
-		if (typeof surfaceScale == 'object') {
-			settings = surfaceScale;
-			surfaceScale = null;
-		}
-		if (typeof specularConstant == 'object') {
-			settings = specularConstant;
-			specularConstant = null;
-		}
-		if (typeof specularExponent == 'object') {
-			settings = specularExponent;
-			specularExponent = null;
-		}
-		return this._root._makeNode(parent, 'feSpecularLighting', $.extend(
-			{result: result, _in: in1, surfaceScale: surfaceScale, 
-			specularConstant: specularConstant, specularExponent: specularExponent}, 
-			settings || {}));
-	},
-
-	/* Add a tile filter.
-	   @param  parent    element - the parent node for the new filter
-	   @param  result    string - the ID of this filter
-	   @param  in1       string - the source filter
-	   @param  x         number - the left coordinate of the rectangle
-	   @param  y         number - the top coordinate of the rectangle
-	   @param  width     number - the width of the rectangle
-	   @param  height    number - the height of the rectangle
-	   @param  settings  object - additional settings for the filter (optional)
-	   @return  the new filter node */
-	tile: function(parent, result, in1, x, y, width, height, settings) {
-		return this._root._makeNode(parent, 'feTile', $.extend(
-			{result: result, _in: in1, x: x, y: y, width: width, height: height}, 
-			settings || {}));
-	},
-
-	/* Add a turbulence filter.
-	   @param  parent    element - the parent node for the new filter
-	   @param  result    string - the ID of this filter
-	   @param  type      string - fractalNoise | turbulence
-	   @param  baseFreq  number or 'number number' - the base frequency,
-	                     optionally separated into x- and y-components
-	   @param  octaves   number - the amount of turbulence (optional)
-	   @param  settings  object - additional settings for the filter (optional)
-	   @return  the new filter node */
-	turbulence: function(parent, result, type, baseFreq, octaves, settings) {
-		if (typeof octaves == 'object') {
-			settings = octaves;
-			octaves = null;
-		}
-		return this._root._makeNode(parent, 'feTurbulence', $.extend(
-			{result: result, type: type, baseFrequency: baseFreq, numOctaves: octaves}, 
-			settings || {}));
-	}
-});
-
-/* Determine whether an object is an array. */
-function isArray(a) {
-	return (a.constructor && a.constructor.toString().match(/\Array\(\)/));
-}
-
-})(jQuery)
diff --git a/src/public/javascripts/jquery-svg/jquery.svgfilter.min.js b/src/public/javascripts/jquery-svg/jquery.svgfilter.min.js
deleted file mode 100644
index 6177beb..0000000
--- a/src/public/javascripts/jquery-svg/jquery.svgfilter.min.js
+++ /dev/null
@@ -1,7 +0,0 @@
-/* http://keith-wood.name/svg.html
-   SVG filters for jQuery v1.0.1.
-   Written by Keith Wood (kbwood@iprimus.com.au) August 2007.
-   Dual licensed under the GPL (http://dev.jquery.com/browser/trunk/jquery/GPL-LICENSE.txt) and 
-   MIT (http://dev.jquery.com/browser/trunk/jquery/MIT-LICENSE.txt) licenses. 
-   Please attribute the author if you use it. */
-(function($){svgManager.addExtension('filters',SVGFilter);$.extend(svgManager._rootClass.prototype,{filter:function(a,b,x,y,c,d,e){return this._makeNode(a,'filter',$.extend({id:b,x:x,y:y,width:c,height:d},e||{}))}});function SVGFilter(a){this._root=a}$.extend(SVGFilter.prototype,{distantLight:function(a,b,c,d,e){return this._root._makeNode(a,'feDistantLight',$.extend({result:b,azimuth:c,elevantion:d},e||{}))},pointLight:function(a,b,x,y,z,c){return this._root._makeNode(a,'fePointLight',$.extend({result:b,x:x,y:y,z:z},c||{}))},spotLight:function(a,b,x,y,z,c,d,e,f){if(typeof c=='object'){f=c;c=null}var g=$.extend({result:b,x:x,y:y,z:z},(c!=null?{pointsAtX:c,pointsAtY:d,pointsAtZ:e}:{}));return this._root._makeNode(a,'feSpotLight',$.extend(g,f||{}))},blend:function(a,b,c,d,e,f){return this._root._makeNode(a,'feBlend',$.extend({result:b,mode:c,_in:d,in2:e},f||{}))},colorMatrix:function(a,b,c,d,e,f){if(isArray(e)){var g='';for(var i=0;i<e.length;i++){g+=(i==0?'':' ')+e[i].join(' ')}e=g}else if(typeof e=='object'){f=e;e=null}var h=$.extend({result:b,_in:c,type:d},(e!=null?{values:e}:{}));return this._root._makeNode(a,'feColorMatrix',$.extend(h,f||{}))},componentTransfer:function(a,b,c,d){var e=this._root._makeNode(a,'feComponentTransfer',$.extend({result:b},d||{}));var f=['R','G','B','A'];for(var i=0;i<Math.min(4,c.length);i++){var g=c[i];var h=$.extend({type:g[0]},(type=='table'||type=='discrete'?{table:g[1].join(' ')}:(type=='linear'?{slope:g[1],intercept:g[2]}:(type=='gamma'?{amplitude:g[1],exponent:g[2],offset:g[3]}:{}))));this._root._makeNode(e,'feFunc'+f[i],h)}return e},composite:function(a,b,c,d,e,f,g,h,i,j){if(typeof f=='object'){j=f;f=null}var k=$.extend({result:b,operator:c,_in:d,in2:e},(f!=null?{k1:f,k2:g,k3:h,k4:i}:{}));return this._root._makeNode(a,'feComposite',$.extend(k,j||{}))},convolveMatrix:function(a,b,c,d,e){var f='';for(var i=0;i<d.length;i++){f+=(i==0?'':' ')+d[i].join(' ')}d=f;return this._root._makeNode(a,'feConvolveMatrix',$.extend({result:b,order:c,kernelMatrix:d},e||{}))},diffuseLighting:function(a,b,c,d){if(typeof c=='object'){d=c;c=null}return this._root._makeNode(a,'feDiffuseLighting',$.extend($.extend({result:b},(c?{lighting_color:c}:{})),d||{}))},displacementMap:function(a,b,c,d,e){return this._root._makeNode(a,'feDisplacementMap',$.extend({result:b,_in:c,in2:d},e||{}))},flood:function(a,b,x,y,c,d,e,f,g){if(arguments.length<6){e=x;f=y;g=c;x=null}var h=$.extend({result:b,flood_color:e,flood_opacity:f},(x!=null?{x:x,y:y,width:c,height:d}:{}));return this._root._makeNode(a,'feFlood',$.extend(h,g||{}))},gaussianBlur:function(a,b,c,d,e,f){if(typeof e=='object'){f=e;e=null}return this._root._makeNode(a,'feGaussianBlur',$.extend({result:b,_in:c,stdDeviation:d+(e?' '+e:'')},f||{}))},image:function(a,b,c,d){var e=this._root._makeNode(a,'feImage',$.extend({result:b},d||{}));e.setAttributeNS(svgManager._xlinkNS,'href',c);return e},merge:function(a,b,c,d){var e=this._root._makeNode(a,'feMerge',$.extend({result:b},d||{}));for(var i=0;i<c.length;i++){this._root._makeNode(e,'feMergeNode',{_in:c[i]})}return e},morphology:function(a,b,c,d,e,f,g){if(typeof f=='object'){g=f;f=null}return this._root._makeNode(a,'feMorphology',$.extend({result:b,_in:c,operator:d,radius:e+(f?' '+f:'')},g||{}))},offset:function(a,b,c,d,e,f){return this._root._makeNode(a,'feOffset',$.extend({result:b,_in:c,dx:d,dy:e},f||{}))},specularLighting:function(a,b,c,d,e,f,g){if(typeof d=='object'){g=d;d=null}if(typeof e=='object'){g=e;e=null}if(typeof f=='object'){g=f;f=null}return this._root._makeNode(a,'feSpecularLighting',$.extend({result:b,_in:c,surfaceScale:d,specularConstant:e,specularExponent:f},g||{}))},tile:function(a,b,c,x,y,d,e,f){return this._root._makeNode(a,'feTile',$.extend({result:b,_in:c,x:x,y:y,width:d,height:e},f||{}))},turbulence:function(a,b,c,d,e,f){if(typeof e=='object'){f=e;e=null}return this._root._makeNode(a,'feTurbulence',$.extend({result:b,type:c,baseFrequency:d,numOctaves:e},f||{}))}});function isArray(a){return(a.constructor&&a.constructor.toString().match(/\Array\(\)/))}})(jQuery)
\ No newline at end of file
diff --git a/src/public/javascripts/jquery-svg/jquery.svgfilter.pack.js b/src/public/javascripts/jquery-svg/jquery.svgfilter.pack.js
deleted file mode 100644
index e176e75..0000000
--- a/src/public/javascripts/jquery-svg/jquery.svgfilter.pack.js
+++ /dev/null
@@ -1,7 +0,0 @@
-/* http://keith-wood.name/svg.html
-   SVG filters for jQuery v1.0.1.
-   Written by Keith Wood (kbwood@iprimus.com.au) August 2007.
-   Dual licensed under the GPL (http://dev.jquery.com/browser/trunk/jquery/GPL-LICENSE.txt) and 
-   MIT (http://dev.jquery.com/browser/trunk/jquery/MIT-LICENSE.txt) licenses. 
-   Please attribute the author if you use it. */
-eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('(7($){C.2d(\'1B\',H);$.5(C.2a.N,{J:7(a,b,x,y,c,d,e){m 8.l(a,\'J\',$.5({1s:b,x:x,y:y,E:c,F:d},e||{}))}});7 H(a){8.9=a}$.5(H.N,{1d:7(a,b,c,d,e){m 8.9.l(a,\'1a\',$.5({n:b,X:c,U:d},e||{}))},T:7(a,b,x,y,z,c){m 8.9.l(a,\'29\',$.5({n:b,x:x,y:y,z:z},c||{}))},1T:7(a,b,x,y,z,c,d,e,f){q(s c==\'r\'){f=c;c=p}o g=$.5({n:b,x:x,y:y,z:z},(c!=p?{1w:c,1r:d,1p:e}:{}));m 8.9.l(a,\'1o\',$.5(g,f||{}))},1l:7(a,b,c,d,e,f){m 8.9.l(a,\'1k\',$.5({n:b,1i:c,t:d,I:e},f||{}))},1c:7(a,b,c,d,e,f){q(M(e)){o g=\'\';w(o i=0;i<e.v;i++){g+=(i==0?\'\':\' \')+e[i].D(\' \')}e=g}Z q(s e==\'r\'){f=e;e=p}o h=$.5({n:b,t:c,u:d},(e!=p?{S:e}:{}));m 8.9.l(a,\'13\',$.5(h,f||{}))},Q:7(a,b,c,d){o e=8.9.l(a,\'15\',$.5({n:b},d||{}));o f=[\'R\',\'G\',\'B\',\'A\'];w(o i=0;i<1P.1M(4,c.v);i++){o g=c[i];o h=$.5({u:g[0]},(u==\'O\'||u==\'1K\'?{O:g[1].D(\' \')}:(u==\'1J\'?{1I:g[1],1G:g[2]}:(u==\'1D\'?{1C:g[1],1A:g[2],K:g[3]}:{}))));8.9.l(e,\'1t\'+f[i],h)}m e},1q:7(a,b,c,d,e,f,g,h,i,j){q(s f==\'r\'){j=f;f=p}o k=$.5({n:b,L:c,t:d,I:e},(f!=p?{1n:f,1m:g,1u:h,1v:i}:{}));m 8.9.l(a,\'1j\',$.5(k,j||{}))},1x:7(a,b,c,d,e){o f=\'\';w(o i=0;i<d.v;i++){f+=(i==0?\'\':\' \')+d[i].D(\' \')}d=f;m 8.9.l(a,\'1y\',$.5({n:b,1z:c,1h:d},e||{}))},1g:7(a,b,c,d){q(s c==\'r\'){d=c;c=p}m 8.9.l(a,\'1f\',$.5($.5({n:b},(c?{1e:c}:{})),d||{}))},1E:7(a,b,c,d,e){m 8.9.l(a,\'1F\',$.5({n:b,t:c,I:d},e||{}))},1b:7(a,b,x,y,c,d,e,f,g){q(1H.v<6){e=x;f=y;g=c;x=p}o h=$.5({n:b,19:e,18:f},(x!=p?{x:x,y:y,E:c,F:d}:{}));m 8.9.l(a,\'1L\',$.5(h,g||{}))},17:7(a,b,c,d,e,f){q(s e==\'r\'){f=e;e=p}m 8.9.l(a,\'16\',$.5({n:b,t:c,Y:d+(e?\' \'+e:\'\')},f||{}))},1O:7(a,b,c,d){o e=8.9.l(a,\'W\',$.5({n:b},d||{}));e.V(C.1Q,\'1R\',c);m e},10:7(a,b,c,d){o e=8.9.l(a,\'1S\',$.5({n:b},d||{}));w(o i=0;i<c.v;i++){8.9.l(e,\'11\',{t:c[i]})}m e},1U:7(a,b,c,d,e,f,g){q(s f==\'r\'){g=f;f=p}m 8.9.l(a,\'12\',$.5({n:b,t:c,L:d,1W:e+(f?\' \'+f:\'\')},g||{}))},K:7(a,b,c,d,e,f){m 8.9.l(a,\'1X\',$.5({n:b,t:c,1Y:d,14:e},f||{}))},1Z:7(a,b,c,d,e,f,g){q(s d==\'r\'){g=d;d=p}q(s e==\'r\'){g=e;e=p}q(s f==\'r\'){g=f;f=p}m 8.9.l(a,\'20\',$.5({n:b,t:c,21:d,23:e,22:f},g||{}))},1V:7(a,b,c,x,y,d,e,f){m 8.9.l(a,\'24\',$.5({n:b,t:c,x:x,y:y,E:d,F:e},f||{}))},25:7(a,b,c,d,e,f){q(s e==\'r\'){f=e;e=p}m 8.9.l(a,\'26\',$.5({n:b,u:c,27:d,28:e},f||{}))}});7 M(a){m(a.P&&a.P.1N().2b(/\\2c\\(\\)/))}})(2e)',62,139,'|||||extend||function|this|_root||||||||||||_makeNode|return|result|var|null|if|object|typeof|_in|type|length|for||||||svgManager|join|width|height||SVGFilter|in2|filter|offset|operator|isArray|prototype|table|constructor|componentTransfer||values|pointLight|elevantion|setAttributeNS|feImage|azimuth|stdDeviation|else|merge|feMergeNode|feMorphology|feColorMatrix|dy|feComponentTransfer|feGaussianBlur|gaussianBlur|flood_opacity|flood_color|feDistantLight|flood|colorMatrix|distantLight|lighting_color|feDiffuseLighting|diffuseLighting|kernelMatrix|mode|feComposite|feBlend|blend|k2|k1|feSpotLight|pointsAtZ|composite|pointsAtY|id|feFunc|k3|k4|pointsAtX|convolveMatrix|feConvolveMatrix|order|exponent|filters|amplitude|gamma|displacementMap|feDisplacementMap|intercept|arguments|slope|linear|discrete|feFlood|min|toString|image|Math|_xlinkNS|href|feMerge|spotLight|morphology|tile|radius|feOffset|dx|specularLighting|feSpecularLighting|surfaceScale|specularExponent|specularConstant|feTile|turbulence|feTurbulence|baseFrequency|numOctaves|fePointLight|_rootClass|match|Array|addExtension|jQuery'.split('|'),0,{}))
\ No newline at end of file
diff --git a/src/public/javascripts/jquery-svg/jquery.svggraph.js b/src/public/javascripts/jquery-svg/jquery.svggraph.js
deleted file mode 100644
index d97091a..0000000
--- a/src/public/javascripts/jquery-svg/jquery.svggraph.js
+++ /dev/null
@@ -1,1337 +0,0 @@
-/* http://keith-wood.name/svg.html
-   SVG graphing extension for jQuery v1.0.1.
-   Written by Keith Wood (kbwood@iprimus.com.au) August 2007.
-   Dual licensed under the GPL (http://dev.jquery.com/browser/trunk/jquery/GPL-LICENSE.txt) and 
-   MIT (http://dev.jquery.com/browser/trunk/jquery/MIT-LICENSE.txt) licenses. 
-   Please attribute the author if you use it. */
-
-var svgGraphing = null;
-
-(function($) { // Hide scope, no $ conflict
-
-svgManager.addExtension('graph', SVGGraph);
-
-// Singleton primary SVG graphing interface
-svgGraphing = new SVGGraphing();
-
-function SVGGraphing() {
-	this.regional = [];
-	this.regional[''] = {percentageText: 'Percentage'};
-	this.region = this.regional[''];
-}
-
-$.extend(SVGGraphing.prototype, {
-	_chartTypes: [],
-	
-	/* Add a new chart rendering type to the package.
-	   The rendering object must implement the following functions:
-	   getTitle(), getDescription(), getOptions(), drawChart(graph).
-	   @param  id         string - the ID of this graph renderer
-	   @param  chartType  object - the object implementing this chart type */
-	addChartType: function(id, chartType) {
-		this._chartTypes[id] = chartType;
-	},
-	
-	/* Retrieve the list of chart types.
-	   @return  object[string] - the array of chart types indexed by ID */
-	chartTypes: function() {
-		return this._chartTypes;
-	}
-});
-
-/* Extension point for SVG graphing.
-   Access through root.filters. */
-function SVGGraph(root) {
-	this._root = root; // The attached SVG root object
-	this._drawNow = true; // True for immediate update, false to wait for redraw call
-	for (var id in svgGraphing._chartTypes) {
-		this._chartType = svgGraphing._chartTypes[id]; // Use first graph renderer
-		break;
-	}
-	this._chartOptions = {}; // Extra options for the graph type
-	// The graph title and settings
-	this._title = {value: '', offset: 25, settings: {text_anchor: 'middle'}};
-	this._area = [0.1, 0.1, 0.8, 0.9]; // The chart area: left, top, right, bottom, 
-		// > 1 in pixels, <= 1 as proportion
-	this._chartFormat = {fill: 'none', stroke: 'black'}; // The formatting for the chart area
-	this._gridlines = []; // The formatting of the x- and y-gridlines
-	this._series = []; // The series to be plotted, each is an object
-	this._onstatus = null; // The callback function for status updates
-	this._chartGroup = this._root.group(null, 'graph'); // The main group for the graph
-	
-	this.xAxis = new SVGGraphAxis(); // The main x-axis
-	this.xAxis.title('', 40);
-	this.yAxis = new SVGGraphAxis(); // The main y-axis
-	this.yAxis.title('', 40);
-	this.x2Axis = null; // The secondary x-axis
-	this.y2Axis = null; // The secondary y-axis
-	this.legend = new SVGGraphLegend(); // The chart legend
-}
-
-$.extend(SVGGraph.prototype, {
-
-	/* Useful indexes. */
-	X: 0,
-	Y: 1,
-	W: 2,
-	H: 3,
-	L: 0,
-	T: 1,
-	R: 2,
-	B: 3,
-	
-	/* Standard percentage axis. */
-	_percentageAxis: new SVGGraphAxis(svgGraphing.region.percentageText, 0, 100, 10, 0),
-
-	/* Set or retrieve the type of chart to be rendered.
-	   See svgGraphing.getChartTypes() for the list of available types.
-	   @param  id       string - the ID of the chart type
-	   @param  options  object - additional settings for this chart type (optional)
-	   @return  SVGGraph - this graph object or 
-	            string - the chart type (if no parameters) */
-	chartType: function(id, options) {
-		if (arguments.length == 0) {
-			return this._chartType;
-		}
-		var chartType = svgGraphing._chartTypes[id];
-		if (chartType) {
-			this._chartType = chartType;
-			this._chartOptions = $.extend({}, options || {});
-		}
-		this._drawGraph();
-		return this;
-	},
-	
-	/* Set or retrieve additional options for the particular chart type.
-	   @param  options  object - the extra options
-	   @return  SVGGraph - this graph object or
-	            object - the chart options (if no parameters) */
-	chartOptions: function(options) {
-		if (arguments.length == 0) {
-			return this._chartOptions;
-		}
-		this._chartOptions = $.extend({}, options);
-		this._drawGraph();
-		return this;
-	},
-	
-	/* Set or retrieve the background of the graph chart.
-	   @param  fill      string - how to fill the chart background
-	   @param  stroke    string - the colour of the outline (optional)
-	   @param  settings  object - additional formatting for the chart background (optional)
-	   @return  SVGGraph - this graph object or
-	            object - the chart format (if no parameters) */
-	chartFormat: function(fill, stroke, settings) {
-		if (arguments.length == 0) {
-			return this._chartFormat;
-		}
-		if (typeof stroke == 'object') {
-			settings = stroke;
-			stroke = null;
-		}
-		this._chartFormat = $.extend($.extend({fill: fill},
-			(stroke ? {stroke: stroke} : {})), settings || {});
-		this._drawGraph();
-		return this;
-	},
-	
-	/* Set or retrieve the main chart area.
-	   @param  left    number - > 1 is pixels, <= 1 is proportion of width or
-	                   number[4] - for left, top, right, bottom
-	   @param  top     number - > 1 is pixels, <= 1 is proportion of height
-	   @param  right   number - > 1 is pixels, <= 1 is proportion of width
-	   @param  bottom  number - > 1 is pixels, <= 1 is proportion of height
-	   @return  SVGGraph - this graph object or
-	            number[4] - the chart area: left, top, right, bottom (if no parameters) */
-	chartArea: function(left, top, right, bottom) {
-		if (arguments.length == 0) {
-			return this._area;
-		}
-		this._area = (isArray(left) ? left : [left, top, right, bottom]);
-		this._drawGraph();
-		return this;
-	},
-	
-	/* Set or retrieve the gridlines formatting for the graph chart.
-	   @param  xSettings  string - the colour of the gridlines along the x-axis, or
-	                      object - formatting for the gridlines along the x-axis, or
-						  null for none
-	   @param  ySettings  string - the colour of the gridlines along the y-axis, or
-	                      object - formatting for the gridlines along the y-axis, or
-						  null for none
-	   @return  SVGGraph - this graph object or
-	            object[2] - the gridlines formatting (if no parameters) */
-	gridlines: function(xSettings, ySettings) {
-		if (arguments.length == 0) {
-			return this._gridlines;
-		}
-		this._gridlines = [(typeof xSettings == 'string' ? {stroke: xSettings} : xSettings),
-			(typeof ySettings == 'string' ? {stroke: ySettings} : ySettings)];
-		this._drawGraph();
-		return this;
-	},
-	
-	/* Set or retrieve the title of the graph and its formatting.
-	   @param  value     string - the title
-	   @param  offset    number - the vertical positioning of the title
-                          > 1 is pixels, <= 1 is proportion of width (optional)
-	   @param  settings  object - formatting for the title (optional)
-	   @return  SVGGraph - this graph object or
-	            object - value, offset, and settings for the title (if no parameters) */
-	title: function(value, offset, settings) {
-		if (arguments.length == 0) {
-			return this._title;
-		}
-		if (typeof offset == 'object') {
-			settings = offset;
-			offset = null;
-		}
-		this._title = {value: value, offset: offset || this._title.offset,
-			settings: $.extend({text_anchor: 'middle'}, settings || {})};
-		this._drawGraph();
-		return this;
-	},
-	
-	/* Add a series of values to be plotted on the graph.
-	   @param  name         string - the name of this series
-	   @param  values       number[] - the values to be plotted
-	   @param  fill         string - how the plotted values are filled
-	   @param  stroke       string - the colour of the plotted lines
-	   @param  strokeWidth  number - the width of the plotted lines (optional)
-	   @param  settings     object - additional settings for the plotted values (optional)
-	   @return  SVGGraph - this graph object */
-	addSeries: function(name, values, fill, stroke, strokeWidth, settings) {
-		if (typeof strokeWidth == 'object') {
-			settings = strokeWidth;
-			strokeWidth = null;
-		}
-		this._series[this._series.length] = 
-			new SVGGraphSeries(name, values, fill, stroke, strokeWidth, settings || {});
-		this._drawGraph();
-		return this;
-	},
-	
-	/* Retrieve the series wrappers.
-	   @return  SVGGraphSeries[] - the list of series */
-	series: function() {
-		return this._series;
-	},
-	
-	/* Suppress drawing of the graph until redraw() is called.
-	   @return  SVGGraph - this graph object */
-	noDraw: function() {
-		this._drawNow = false;
-		return this;
-	},
-	
-	/* Redraw the entire graph with the current settings and values.
-	   @return  SVGGraph - this graph object */
-	redraw: function() {
-		this._drawNow = true;
-		this._drawGraph();
-		return this;
-	},
-	
-	/* Set the callback function for status updates.
-	   @param  onstatus  function - the callback function
-	   @return  SVGGraph - this graph object */
-	status: function(onstatus) {
-		this._onstatus = onstatus;
-		return this;
-	},
-	
-	/* Actually draw the graph (if allowed) based on the graph type set. */
-	_drawGraph: function() {
-		if (!this._drawNow) {
-			return;
-		}
-		while (this._chartGroup.firstChild) {
-			this._chartGroup.removeChild(this._chartGroup.firstChild);
-		}
-		if (!this._chartGroup.parent) {
-			this._root._svg.appendChild(this._chartGroup);
-		}
-		this._chartType.drawGraph(this);
-	},
-
-	/* Draw the graph title - centred. */
-	_drawTitle: function() {
-		this._root.text(this._chartGroup, this._root._width() / 2, this._title.offset,
-			this._title.value, this._title.settings);
-	},
-	
-	/* Calculate the actual dimensions of the chart area.
-	    @param  area  number[4] - the area values to evaluate (optional)
-		@return  an array of dimension values: left, top, width, height */
-	_getDims: function(area) {
-		area = area || this._area;
-		var left = (area[this.L] > 1 ? area[this.L] :
-			this._root._width() * area[this.L]);
-		var top = (area[this.T] > 1 ? area[this.T] :
-			this._root._height() * area[this.T]);
-		var width = (area[this.R] > 1 ? area[this.R] :
-			this._root._width() * area[this.R]) - left;
-		var height = (area[this.B] > 1 ? area[this.B] :
-			this._root._height() * area[this.B]) - top;
-		return [left, top, width, height];
-	},
-	
-	/* Draw the chart background, including gridlines.
-	   @param  noXGrid  boolean - true to suppress the x-gridlines, false to draw them (optional)
-	   @param  noYGrid  boolean - true to suppress the y-gridlines, false to draw them (optional)
-	   @return  the background group element */
-	_drawChartBackground: function(noXGrid, noYGrid) {
-		var bg = this._root.group(this._chartGroup, 'background');
-		var dims = this._getDims();
-		this._root.rect(bg, dims[this.X], dims[this.Y], dims[this.W], dims[this.H], this._chartFormat);
-		if (this._gridlines[0] && this.yAxis._ticks.major && !noYGrid) {
-			this._drawGridlines(bg, this.yAxis, true, dims, this._gridlines[0]);
-		}
-		if (this._gridlines[1] && this.xAxis._ticks.major && !noXGrid) {
-			this._drawGridlines(bg, this.xAxis, false, dims, this._gridlines[1]);
-		}
-		return bg;
-	},
-	
-	/* Draw one set of gridlines.
-	   @param  bg      element - the background group element
-	   @param  axis    SVGGraphAxis - the axis definition
-	   @param  horiz   boolean - true if horizontal, false if vertical
-	   @param  dims    number[] - the left, top, width, height of the chart area
-	   @param  format  object - additional settings for the gridlines */
-	_drawGridlines: function(bg, axis, horiz, dims, format) {
-		var g = this._root.group(bg, format);
-		var scale = (horiz ? dims[this.H] : dims[this.W]) / (axis._scale.max - axis._scale.min);
-		var major = Math.floor(axis._scale.min / axis._ticks.major) * axis._ticks.major;
-		major = (major < axis._scale.min ? major + axis._ticks.major : major);
-		while (major <= axis._scale.max) {
-			var v = (horiz ? axis._scale.max - major : major - axis._scale.min) * scale +
-				(horiz ? dims[this.Y] : dims[this.X]);
-			this._root.line(g, (horiz ? dims[this.X] : v), (horiz ? v : dims[this.Y]), 
-				(horiz ? dims[this.X] + dims[this.W] : v), (horiz ? v : dims[this.Y] + dims[this.H]));
-			major += axis._ticks.major;
-		}
-	},
-	
-	/* Draw the axes in their standard configuration.
-	   @param  noX  boolean - true to suppress the x-axes, false to draw it (optional) */
-	_drawAxes: function(noX) {
-		var dims = this._getDims();
-		if (this.xAxis && !noX) {
-			if (this.xAxis._title) {
-				this._root.text(this._chartGroup, dims[this.X] + dims[this.W] / 2,
-					dims[this.Y] + dims[this.H] + this.xAxis._titleOffset, this.xAxis._title);
-			}
-			this._drawAxis(this.xAxis, 'xAxis', dims[this.X], dims[this.Y] + dims[this.H],
-				dims[this.X] + dims[this.W], dims[this.Y] + dims[this.H]);
-		}
-		if (this.yAxis) {
-			if (this.yAxis._title) {
-				this._root.text(this._chartGroup, 0, 0, this.yAxis._title, {text_anchor: 'middle',
-					transform: 'translate(' + (dims[this.X] - this.yAxis._titleOffset) + ',' +
-					(dims[this.Y] + dims[this.H] / 2) + ') rotate(-90)'});
-			}
-			this._drawAxis(this.yAxis, 'yAxis', dims[this.X], dims[this.Y],
-				dims[this.X], dims[this.Y] + dims[this.H]);
-		}
-		if (this.x2Axis && !noX) {
-			if (this.x2Axis._title) {
-				this._root.text(this._chartGroup, dims[this.X] + dims[this.W] / 2,
-					dims[this.X] - this.x2Axis._titleOffset, this.x2Axis._title);
-			}
-			this._drawAxis(this.x2Axis, 'x2Axis', dims[this.X], dims[this.Y],
-				dims[this.X] + dims[this.W], dims[this.Y]);
-		}
-		if (this.y2Axis) {
-			if (this.y2Axis._title) {
-				this._root.text(this._chartGroup, 0, 0, this.y2Axis._title, {text_anchor: 'middle',
-					transform: 'translate(' + (dims[this.X] + dims[this.W] + this.y2Axis._titleOffset) +
-					',' + (dims[this.Y] + dims[this.H] / 2) + ') rotate(-90)'});
-			}
-			this._drawAxis(this.y2Axis, 'y2Axis', dims[this.X] + dims[this.W], dims[this.Y],
-				dims[this.X] + dims[this.W], dims[this.Y] + dims[this.H]);
-		}
-	},
-	
-	/* Draw an axis and its tick marks.
-	   @param  axis  SVGGraphAxis - the axis definition
-	   @param  id    string - the identifier for the axis group element
-	   @param  x1    number - starting x-coodinate for the axis
-	   @param  y1    number - starting y-coodinate for the axis
-	   @param  x2    number - ending x-coodinate for the axis
-	   @param  y2    number - ending y-coodinate for the axis */
-	_drawAxis: function(axis, id, x1, y1, x2, y2) {
-		var horiz = (y1 == y2);
-		var gl = this._root.group(this._chartGroup, id, axis._lineFormat);
-		var gt = this._root.group(this._chartGroup, id + 'Labels',
-			$.extend({text_anchor: (horiz ? 'middle' : 'end')}, axis._labelFormat));
-		this._root.line(gl, x1, y1, x2, y2);
-		if (axis._ticks.major) {
-			var bottomRight = (x2 > (this._root._width() / 2) && 
-				y2 > (this._root._height() / 2));
-			var scale = (horiz ? x2 - x1 : y2 - y1) / (axis._scale.max - axis._scale.min);
-			var size = axis._ticks.size;
-			var major = Math.floor(axis._scale.min / axis._ticks.major) * axis._ticks.major;
-			major = (major < axis._scale.min ? major + axis._ticks.major : major);
-			var minor = (!axis._ticks.minor ? axis._scale.max + 1 :
-				Math.floor(axis._scale.min / axis._ticks.minor) * axis._ticks.minor);
-			minor = (minor < axis._scale.min ? minor + axis._ticks.minor : minor);
-			var offsets = this._getTickOffsets(axis, bottomRight);
-			while (major <= axis._scale.max || minor <= axis._scale.max) {
-				var cur = Math.min(major, minor);
-				var len = (cur == major ? size : size / 2);
-				var v = (horiz ? x1 : y1) +
-					(horiz ? cur - axis._scale.min : axis._scale.max - cur) * scale;
-				this._root.line(gl, (horiz ? v : x1 + len * offsets[0]), 
-					(horiz ? y1 + len * offsets[0] : v), 
-					(horiz ? v : x1 + len * offsets[1]), 
-					(horiz ? y1 + len * offsets[1] : v));
-				if (cur == major) {
-					this._root.text(gt, (horiz ? v : x1 - size), (horiz ? y1 + 2 * size : v),
-						(axis._labels ? axis._labels[cur] : '' + cur));
-				}
-				major += (cur == major ? axis._ticks.major : 0);
-				minor += (cur == minor ? axis._ticks.minor : 0);
-			}
-		}
-	},
-	
-	/* Calculate offsets based on axis and tick positions.
-	   @param  axis         SVGGraphAxis - the axis definition
-	   @param  bottomRight  boolean - true if this axis is appearing on the bottom or 
-	                        right of the chart area, false if to the top or left
-	   @return  the array of offset multipliers (-1..+1) */
-	_getTickOffsets: function(axis, bottomRight) {
-		return [(axis._ticks.position == (bottomRight ? 'in' : 'out') || 
-			axis._ticks.position == 'both' ? -1 : 0), 
-			(axis._ticks.position == (bottomRight ? 'out' : 'in') || 
-			axis._ticks.position == 'both' ? +1 : 0), ];
-	},
-	
-	/* Retrieve the standard percentage axis.
-	   @return  percentage axis */
-	_getPercentageAxis: function() {
-		this._percentageAxis._title = svgGraphing.region.percentageText;
-		return this._percentageAxis;
-	},
-
-	/* Calculate the column totals across all the series. */
-	_getTotals: function() {
-		var totals = [];
-		var numVal = (this._series.length ? this._series[0]._values.length : 0);
-		for (var i = 0; i < numVal; i++) {
-			totals[i] = 0;
-			for (var j = 0; j < this._series.length; j++) {
-				totals[i] += this._series[j]._values[i];
-			}
-		}
-		return totals;
-	},
-	
-	/* Draw the chart legend. */
-	_drawLegend: function() {
-		if (!this.legend._show) {
-			return;
-		}
-		var g = this._root.group(this._chartGroup, 'legend');
-		var dims = this._getDims(this.legend._area);
-		this._root.rect(g, dims[this.X], dims[this.Y], dims[this.W], dims[this.H],
-			this.legend._bgSettings);
-		var horiz =  dims[this.W] > dims[this.H];
-		var numSer = this._series.length;
-		var offset = (horiz ? dims[this.W] : dims[this.H]) / numSer;
-		var xBase = dims[this.X] + 5;
-		var yBase = dims[this.Y] + (horiz ? dims[this.H] / 2 : offset / 2);
-		for (var i = 0; i < numSer; i++) {
-			var series = this._series[i];
-			this._root.rect(g, xBase + (horiz ? i * offset : 0),
-				yBase + (horiz ? 0 : i * offset) - this.legend._sampleSize,
-				this.legend._sampleSize, this.legend._sampleSize,
-				{fill: series._fill, stroke: series._stroke, stroke_width: 1});
-			this._root.text(g, xBase + (horiz ? i * offset : 0) + this.legend._sampleSize + 5,
-				yBase + (horiz ? 0 : i * offset), series._name, this.legend._textSettings);
-		}
-	},
-	
-	/* Show the current value status on hover. */
-	_showStatus: function(value) {
-		var onStatus = (!this._onstatus ? '' :
-			this._onstatus.toString().replace(/function (.*)\([\s\S]*/m, '$1'));
-		return (!this._onstatus ? {} :
-			{onmouseover: 'window.parent.' + onStatus + '(\'' + value + '\');',
-			onmouseout: 'window.parent.' + onStatus  + '(\'\');'});
-	}
-});
-
-/* Details about each graph axis.
-   @param  title  string - the title of the axis
-   @param  min    number - the minimum value displayed on this axis
-   @param  max    number - the maximum value displayed on this axis
-   @param  major  number - the distance between major ticks
-   @param  minor  number - the distance between minor ticks (optional)
-   @return  the new axis object */
-function SVGGraphAxis(title, min, max, major, minor) {
-	/* Title of this axis. */
-	this._title = title || '';
-	/* Formatting settings for the title. */
-	this._titleFormat = {};
-	/* The offset for positioning the title. */
-	this._titleOffset = 0;
-	/* List of labels for this axis - one per possible value across all series. */
-	this._labels = null;
-	/* Formatting settings for the labels. */
-	this._labelFormat = {};
-	/* Formatting settings for the axis lines. */
-	this._lineFormat = {stroke: 'black'};
-	/* Tick mark options. */
-	this._ticks = {major: major || 10, minor: minor || 0, size: 10, position: 'out'};
-	/* Axis scale settings. */
-	this._scale = {min: min || 0, max: max || 100};
-	/* Where this axis crosses the other one. */
-	this._crossAt = 0;
-}
-
-$.extend(SVGGraphAxis.prototype, {
-
-	/* Set or retrieve the scale for this axis.
-	   @param  min  number - the minimum value shown
-	   @param  max  number - the maximum value shown
-	   @return  SVGGraphAxis - this axis object or
-	            object - min and max values (if no parameters) */
-	scale: function(min, max) {
-		if (arguments.length == 0) {
-			return this._scale;
-		}
-		this._scale.min = min;
-		this._scale.max = max;
-		return this;
-	},
-	
-	/* Set or retrieve the ticks for this axis.
-	   @param  major     number - the distance between major ticks
-	   @param  minor     number - the distance between minor ticks
-	   @param  size      number - the length of the major ticks (minor are half) (optional)
-	   @param  position  string - the location of the ticks:
-	                     'in', 'out', 'both' (optional)
-	   @return  SVGGraphAxis - this axis object or
-	            object - major, minor, size, and position values (if no parameters) */
-	ticks: function(major, minor, size, position) {
-		if (arguments.length == 0) {
-			return this._ticks;
-		}
-		if (typeof size == 'string') {
-			position = size;
-			size = null;
-		}
-		this._ticks.major = major;
-		this._ticks.minor = minor;
-		this._ticks.size = size || 10;
-		this._ticks.position = position || 'out';
-		return this;
-	},
-	
-	/* Set or retrieve the title for this axis.
-	   @param  title   string - the title text
-	   @param  offset  number - the distance to offset the title position (optional)
-	   @param  format  object - formatting settings for the title (optional)
-	   @return  SVGGraphAxis - this axis object or
-	            object - title, offset, and format values (if no parameters) */
-	title: function(title, offset, format) {
-		if (arguments.length == 0) {
-			return {title: this._title, offset: this._titleOffset, format: this._titleFormat};
-		}
-		if (typeof offset == 'object') {
-			format = offset;
-			offset = null;
-		}
-		this._title = title;
-		if (offset != null) {
-			this._titleOffset = offset;
-		}
-		if (format) {
-			this._titleFormat = format;
-		}
-		return this;
-	},
-	
-	/* Set or retrieve the labels for this axis.
-	   @param  labels  string[] - the text for each entry
-	   @param  format  object - formatting settings for the labels (optional)
-	   @return  SVGGraphAxis - this axis object or
-	            object - labels and format values (if no parameters) */
-	labels: function(labels, format) {
-		if (arguments.length == 0) {
-			return {labels: this._labels, format: this._labelFormat};
-		}
-		this._labels = labels;
-		if (format) {
-			this._labelFormat = format;
-		}
-		return this;
-	},
-	
-	/* Set or retrieve the line formatting for this axis.
-	   @param  colour    string - the line's colour
-	   @param  width     number - the line's width (optional)
-	   @param  settings  object - additional formatting settings for the line (optional)
-	   @return  SVGGraphAxis - this axis object or
-	            object - line formatting values (if no parameters) */
-	line: function(colour, width, settings) {
-		if (arguments.length == 0) {
-			return this._lineFormat;
-		}
-		if (typeof width == 'object') {
-			settings = width;
-			width = null;
-		}
-		$.extend(this._lineFormat, {stroke: colour, stroke_width: width || 1});
-		$.extend(this._lineFormat, settings || {});
-		return this;
-	}
-});
-
-var defaultSeriesFill = 'green';
-var defaultSeriesStroke = 'black';
-
-/* Details about each graph series.
-   @param  name         string - the name of this series
-   @param  values       number[] - the list of values to be plotted
-   @param  fill         string - how the series should be displayed
-   @param  stroke       string - the colour of the (out)line for the series
-   @param  strokeWidth  number - the width of the (out)line for the series
-   @param  settings     object - additional formatting settings
-   @return  the new series object */
-function SVGGraphSeries(name, values, fill, stroke, strokeWidth, settings) {
-	/* The name of this series. */
-	this._name = name || '';
-	/* The list of values for this series. */
-	this._values = values || [];
-	/* Which axis this series applies to: 1 = primary, 2 = secondary. */
-	this._axis = 1;
-	/* How the series is plotted. */
-	this._fill = fill || defaultSeriesFill;
-	/* The colour for the (out)line. */
-	this._stroke = stroke || defaultSeriesStroke;
-	/* The (out)line width. */
-	this._strokeWidth = strokeWidth || 1;
-	/* Additional formatting settings for the series. */
-	this._settings = settings || {};
-}
-
-$.extend(SVGGraphSeries.prototype, {
-
-	/* Set or retrieve the name for this series.
-	   @param  name    string - the series' name
-	   @return  SVGGraphSeries - this series object or
-	            string - the series name (if no parameters) */
-	name: function(name) {
-		if (arguments.length == 0) {
-			return this._name;
-		}
-		this._name = name;
-		return this;
-	},
-
-	/* Set or retrieve the values for this series.
-	   @param  name    string - the series' name (optional)
-	   @param  values  number[] - the values to be graphed
-	   @return  SVGGraphSeries - this series object or
-	            number[] - the series values (if no parameters) */
-	values: function(name, values) {
-		if (arguments.length == 0) {
-			return this._values;
-		}
-		if (isArray(name)) {
-			valus = name;
-			name = null;
-		}
-		this._name = name || this._name;
-		this._values = values;
-		return this;
-	},
-	
-	/* Set or retrieve the formatting for this series.
-	   @param  fill         string - how the values are filled when plotted
-	   @param  stroke       string - the (out)line colour
-	   @param  strokeWidth  number - the line's width (optional)
-	   @param  settings     object - additional formatting settings for the series (optional)
-	   @return  SVGGraphSeries - this series object or
-	            object - formatting settings (if no parameters) */
-	format: function(fill, stroke, strokeWidth, settings) {
-		if (arguments.length == 0) {
-			return $.extend({fill: this._fill, stroke: this._stroke,
-				stroke_width: this._strokeWidth}, this._settings);
-		}
-		if (typeof strokeWidth == 'object') {
-			settings = strokeWidth;
-			strokeWidth = null;
-		}
-		this._fill = fill || defaultSeriesFill;
-		this._stroke = stroke || this._stroke;
-		this._strokeWidth = strokeWidth || this._strokeWidth;
-		$.extend(this._settings, settings || {});
-		return this;
-	}
-});
-
-/* Details about the graph legend.
-   @param  bgSettings    object - additional formatting settings for the legend background (optional)
-   @param  textSettings  object - additional formatting settings for the legend text (optional)
-   @return  the new legend object */
-function SVGGraphLegend(bgSettings, textSettings) {
-	this._show = true; // Show the legend?
-	this._area = [0.9, 0.1, 1.0, 0.9]; // The legend area: left, top, right, bottom, 
-		// > 1 in pixels, <= 1 as proportion
-	this._sampleSize = 15; // Size of sample box
-	this._bgSettings = bgSettings || {stroke: 'gray'}; // Additional formatting settings for the legend background
-	this._textSettings = textSettings || {}; // Additional formatting settings for the text
-}
-
-$.extend(SVGGraphLegend.prototype, {
-
-	/* Set or retrieve whether the legend should be shown.
-	   @param  show  boolean - true to display it, false to hide it
-	   @return  SVGGraphLegend - this legend object or
-	            boolean - show the legend? (if no parameters) */
-	show: function(show) {
-		if (arguments.length == 0) {
-			return this._show;
-		}
-		this._show = show;
-		return this;
-	},
-	
-	/* Set or retrieve the legend area.
-	   @param  left    number - > 1 is pixels, <= 1 is proportion of width or
-	                   number[4] - for left, top, right, bottom
-	   @param  top     number - > 1 is pixels, <= 1 is proportion of height
-	   @param  right   number - > 1 is pixels, <= 1 is proportion of width
-	   @param  bottom  number - > 1 is pixels, <= 1 is proportion of height
-	   @return  SVGGraphLegend - this legend object or
-	            number[4] - the legend area: left, top, right, bottom (if no parameters) */
-	area: function(left, top, right, bottom) {
-		if (arguments.length == 0) {
-			return this._area;
-		}
-		this._area = (isArray(left) ? left : [left, top, right, bottom]);
-		return this;
-	},
-
-	/* Set or retrieve additional settings for the legend area.
-	   @param  sampleSize    number - the size of the sample box to display (optional)
-	   @param  bgSettings    object - additional formatting settings for the legend background
-	   @param  textSettings  object - additional formatting settings for the legend text (optional)
-	   @return  SVGGraphLegend - this legend object or
-	            object - bgSettings and textSettings for the legend (if no parameters) */
-	settings: function(sampleSize, bgSettings, textSettings) {
-		if (arguments.length == 0) {
-			return {sampleSize: this._sampleSize, bgSettings: this._bgSettings,
-				textSettings: this._textSettings};
-		}
-		if (typeof sampleSize == 'object') {
-			textSettings = bgSettings;
-			bgSettings = sampleSize;
-			sampleSize = null;
-		}
-		if (sampleSize) {
-			this._sampleSize = sampleSize;
-		}
-		this._bgSettings = bgSettings;
-		if (textSettings) {
-			this._textSettings = textSettings;
-		}
-		return this;
-	}
-});
-
-//==============================================================================
-
-/* Round a number to a given number of decimal points. */
-function roundNumber(num, dec) {
-	return Math.round(num * Math.pow(10, dec)) / Math.pow(10, dec);
-}
-
-var barOptions = ['barWidth (number) - the width of each bar',
-	'barGap (number) - the gap between sets of bars'];
-
-//------------------------------------------------------------------------------
-
-/* Draw a standard grouped column bar chart. */
-function SVGColumnChart() {
-}
-
-$.extend(SVGColumnChart.prototype, {
-
-	/* Retrieve the display title for this chart type.
-	   @return  the title */
-	title: function() {
-		return 'Basic column chart';
-	},
-
-	/* Retrieve a description of this chart type.
-	   @return  its description */
-	description: function() {
-		return 'Compare sets of values as vertical bars with grouped categories.';
-	},
-
-	/* Retrieve a list of the options that may be set for this chart type.
-	   @return  options list */
-	options: function() {
-		return barOptions;
-	},
-
-	/* Actually draw the graph in this type's style.
-	   @param  graph  object - the SVGGraph object */
-	drawGraph: function(graph) {
-		graph._drawChartBackground(true);
-		var barWidth = graph._chartOptions.barWidth || 10;
-		var barGap = graph._chartOptions.barGap || 10;
-		var numSer = graph._series.length;
-		var numVal = (numSer ? (graph._series[0])._values.length : 0);
-		var dims = graph._getDims();
-		var xScale = dims[graph.W] / ((numSer * barWidth + barGap) * numVal + barGap);
-		var yScale = dims[graph.H] / (graph.yAxis._scale.max - graph.yAxis._scale.min);
-		this._chart = graph._root.group(graph._chartGroup, 'chart');
-		for (var i = 0; i < numSer; i++) {
-			this._drawSeries(graph, i, numSer, barWidth, barGap, dims, xScale, yScale);
-		}
-		graph._drawTitle();
-		graph._drawAxes(true);
-		this._drawXAxis(graph, numSer, numVal, barWidth, barGap, dims, xScale);
-		graph._drawLegend();
-	},
-	
-	/* Plot an individual series. */
-	_drawSeries: function(graph, cur, numSer, barWidth, barGap, dims, xScale, yScale) {
-		var series = graph._series[cur];
-		var g = graph._root.group(this._chart, 'series' + cur,
-			$.extend({stroke: series._stroke,
-			stroke_width: series._strokeWidth}, series._settings || {}));
-		for (var i = 0; i < series._values.length; i++) {
-			graph._root.rect(g, 
-				dims[graph.X] + xScale * (barGap + i * (numSer * barWidth + barGap) + (cur * barWidth)),
-				dims[graph.Y] + yScale * (graph.yAxis._scale.max - series._values[i]), 
-				xScale * barWidth, yScale * series._values[i], $.extend({fill: series._fill},
-				graph._showStatus(series._name + ' ' + series._values[i])));
-		}
-	},
-	
-	/* Draw the x-axis and its ticks. */
-	_drawXAxis: function(graph, numSer, numVal, barWidth, barGap, dims, xScale) {
-		var axis = graph.xAxis;
-		if (axis._title) {
-			graph._root.text(graph._chartGroup, dims[graph.X] + dims[graph.W] / 2,
-				dims[graph.Y] + dims[graph.H] + axis._titleOffset,
-				axis._title, {text_anchor: 'middle'});
-		}
-		var gl = graph._root.group(graph._chartGroup, 'xAxis', axis._lineFormat);
-		var gt = graph._root.group(graph._chartGroup, 'xAxisLabels',
-			$.extend({text_anchor: 'middle'}, axis._labelFormat));
-		graph._root.line(gl, dims[graph.X], dims[graph.Y] + dims[graph.H],
-			dims[graph.X] + dims[graph.W], dims[graph.Y] + dims[graph.H]);
-		if (axis._ticks.major) {
-			var offsets = graph._getTickOffsets(axis, true);
-			for (var i = 1; i < numVal; i++) {
-				var x = dims[graph.X] + xScale * (barGap / 2 + i * (numSer * barWidth + barGap));
-				graph._root.line(gl, x, dims[graph.Y] + dims[graph.H] + offsets[0] * axis._ticks.size,
-					x, dims[graph.Y] + dims[graph.H] + offsets[1] * axis._ticks.size);
-			}
-			for (var i = 0; i < numVal; i++) {
-				var x = dims[graph.X] + xScale * (barGap / 2 + (i + 0.5) * (numSer * barWidth + barGap));
-				graph._root.text(gt, x, dims[graph.Y] + dims[graph.H] + 2 * axis._ticks.size,
-					(axis._labels ? axis._labels[i] : '' + i));
-			}
-		}
-	}
-});
-
-//------------------------------------------------------------------------------
-
-/* Draw a stacked column bar chart. */
-function SVGStackedColumnChart() {
-}
-
-$.extend(SVGStackedColumnChart.prototype, {
-
-	/* Retrieve the display title for this chart type.
-	   @return  the title */
-	title: function() {
-		return 'Stacked column chart';
-	},
-
-	/* Retrieve a description of this chart type.
-	   @return  its description */
-	description: function() {
-		return 'Compare sets of values as vertical bars showing ' +
-			'relative contributions to the whole for each category.';
-	},
-
-	/* Retrieve a list of the options that may be set for this chart type.
-	   @return  options list */
-	options: function() {
-		return barOptions;
-	},
-
-	/* Actually draw the graph in this type's style.
-	   @param  graph  object - the SVGGraph object */
-	drawGraph: function(graph) {
-		var bg = graph._drawChartBackground(true, true);
-		var dims = graph._getDims();
-		if (graph._gridlines[0] && graph.xAxis._ticks.major) {
-			graph._drawGridlines(bg, graph._getPercentageAxis(), true, dims, graph._gridlines[0]);
-		}
-		var barWidth = graph._chartOptions.barWidth || 10;
-		var barGap = graph._chartOptions.barGap || 10;
-		var numSer = graph._series.length;
-		var numVal = (numSer ? (graph._series[0])._values.length : 0);
-		var xScale = dims[graph.W] / ((barWidth + barGap) * numVal + barGap);
-		var yScale = dims[graph.H];
-		this._chart = graph._root.group(graph._chartGroup, 'chart');
-		this._drawColumns(graph, numSer, numVal, barWidth, barGap, dims, xScale, yScale);
-		graph._drawTitle();
-		graph._root.text(graph._chartGroup, 0, 0, svgGraphing.region.percentageText,
-			{text_anchor: 'middle', transform: 'translate(' + (dims[graph.X] - graph.yAxis._titleOffset) +
-			',' +(dims[graph.Y] + dims[graph.H] / 2) + ') rotate(-90)'});
-		//graph._drawAxis(graph._getPercentageAxis(), 'yAxis',
-			//dims[graph.X], dims[graph.Y], dims[graph.X], dims[graph.Y] + dims[graph.H]);
-		this._drawXAxis(graph, numVal, barWidth, barGap, dims, xScale);
-		graph._drawLegend();
-	},
-	
-	/* Plot all of the columns. */
-	_drawColumns: function(graph, numSer, numVal, barWidth, barGap, dims, xScale, yScale) {
-		var totals = graph._getTotals();
-		var accum = [];
-		for (var i = 0; i < numVal; i++) {
-			accum[i] = 0;
-		}
-		for (var s = 0; s < numSer; s++) {
-			var series = graph._series[s];
-			var g = graph._root.group(this._chart, 'series' + s,
-				$.extend({stroke: series._stroke, stroke_width: series._strokeWidth},
-				series._settings || {}));
-			for (var i = 0; i < series._values.length; i++) {
-				accum[i] += series._values[i];
-				graph._root.rect(g,
-					dims[graph.X] + xScale * (barGap + i * (barWidth + barGap)),
-					dims[graph.Y] + yScale * (totals[i] - accum[i]) / totals[i],
-					xScale * barWidth, yScale * series._values[i] / totals[i],
-					$.extend({fill: series._fill}, graph._showStatus(series._name + ' ' +
-					roundNumber(series._values[i] / totals[i] * 100, 2) + '%')));
-			}
-		}
-	},
-	
-	/* Draw the x-axis and its ticks. */
-	_drawXAxis: function(graph, numVal, barWidth, barGap, dims, xScale) {
-		var axis = graph.xAxis;
-		if (axis._title) {
-			graph._root.text(graph._chartGroup, dims[graph.X] + dims[graph.W] / 2,
-				dims[graph.Y] + dims[graph.H] + axis._titleOffset,
-				axis._title, {text_anchor: 'middle'});
-		}
-		var gl = graph._root.group(graph._chartGroup, 'xAxis', axis._lineFormat);
-		var gt = graph._root.group(graph._chartGroup, 'xAxisLabels',
-			$.extend({text_anchor: 'middle'}, axis._labelFormat));
-		graph._root.line(gl, dims[graph.X], dims[graph.Y] + dims[graph.H],
-		dims[graph.X] + dims[graph.W], dims[graph.Y] + dims[graph.H]);
-		if (axis._ticks.major) {
-			var offsets = graph._getTickOffsets(axis, true);
-			for (var i = 1; i < numVal; i++) {
-				var x = dims[graph.X] + xScale * (barGap / 2 + i * (barWidth + barGap));
-				graph._root.line(gl, x, dims[graph.Y] + dims[graph.H] + offsets[0] * axis._ticks.size,
-					x, dims[graph.Y] + dims[graph.H] + offsets[1] * axis._ticks.size);
-			}
-			for (var i = 0; i < numVal; i++) {
-				var x = dims[graph.X] + xScale * (barGap / 2 + (i + 0.5) * (barWidth + barGap));
-				graph._root.text(gt, x, dims[graph.Y] + dims[graph.H] + 2 * axis._ticks.size,
-					(axis._labels ? axis._labels[i] : '' + i));
-			}
-		}
-	}
-});
-
-//------------------------------------------------------------------------------
-
-/* Draw a standard grouped row bar chart. */
-function SVGRowChart() {
-}
-
-$.extend(SVGRowChart.prototype, {
-
-	/* Retrieve the display title for this chart type.
-	   @return  the title */
-	title: function() {
-		return 'Basic row chart';
-	},
-
-	/* Retrieve a description of this chart type.
-	   @return  its description */
-	description: function() {
-		return 'Compare sets of values as horizontal rows with grouped categories.';
-	},
-
-	/* Retrieve a list of the options that may be set for this chart type.
-	   @return  options list */
-	options: function() {
-		return barOptions;
-	},
-
-	/* Actually draw the graph in this type's style.
-	   @param  graph  object - the SVGGraph object */
-	drawGraph: function(graph) {
-		var bg = graph._drawChartBackground(true, true);
-		var dims = graph._getDims();
-		graph._drawGridlines(bg, graph.yAxis, false, dims, graph._gridlines[0]);
-		var barWidth = graph._chartOptions.barWidth || 10;
-		var barGap = graph._chartOptions.barGap || 10;
-		var numSer = graph._series.length;
-		var numVal = (numSer ? (graph._series[0])._values.length : 0);
-		var xScale = dims[graph.W] / (graph.yAxis._scale.max - graph.yAxis._scale.min);
-		var yScale = dims[graph.H] / ((numSer * barWidth + barGap) * numVal + barGap);
-		this._chart = graph._root.group(graph._chartGroup, 'chart');
-		for (var i = 0; i < numSer; i++) {
-			this._drawSeries(graph, i, numSer, barWidth, barGap, dims, xScale, yScale);
-		}
-		graph._drawTitle();
-		this._drawAxes(graph, numSer, numVal, barWidth, barGap, dims, yScale);
-		graph._drawLegend();
-	},
-	
-	/* Plot an individual series. */
-	_drawSeries: function(graph, cur, numSer, barWidth, barGap, dims, xScale, yScale) {
-		var series = graph._series[cur];
-		var g = graph._root.group(this._chart, 'series' + cur,
-			$.extend({stroke: series._stroke, stroke_width: series._strokeWidth},
-			series._settings || {}));
-		for (var i = 0; i < series._values.length; i++) {
-			graph._root.rect(g,
-				dims[graph.X] + xScale * (0 - graph.yAxis._scale.min),
-				dims[graph.Y] + yScale * (barGap + i * (numSer * barWidth + barGap) + (cur * barWidth)),
-				xScale * series._values[i], yScale * barWidth, $.extend({fill: series._fill},
-				graph._showStatus(series._name + ' ' + series._values[i])));
-		}
-	},
-	
-	/* Draw the axes for this graph. */
-	_drawAxes: function(graph, numSer, numVal, barWidth, barGap, dims, yScale) {
-		// X-axis
-		var axis = graph.yAxis;
-		if (axis) {
-			if (axis._title) {
-				graph._root.text(graph._chartGroup, dims[graph.X] + dims[graph.W] / 2,
-					dims[graph.Y] + dims[graph.H] + axis._titleOffset, axis._title, axis._titleFormat);
-			}
-			graph._drawAxis(axis, 'xAxis', dims[graph.X], dims[graph.Y] + dims[graph.H],
-				dims[graph.X] + dims[graph.W], dims[graph.Y] + dims[graph.H]);
-		}
-		// Y-axis
-		var axis = graph.xAxis;
-		if (axis._title) {
-			graph._root.text(graph._chartGroup, 0, 0, axis._title, {text_anchor: 'middle',
-				transform: 'translate(' + (dims[graph.X] - axis._titleOffset) + ',' +
-				(dims[graph.Y] + dims[graph.H] / 2) + ') rotate(-90)'});
-		}
-		var gl = graph._root.group(graph._chartGroup, 'yAxis', axis._lineFormat);
-		var gt = graph._root.group(graph._chartGroup, 'yAxisLabels',
-			$.extend({text_anchor: 'end'}, axis._labelFormat));
-		graph._root.line(gl, dims[graph.X], dims[graph.Y], dims[graph.X], dims[graph.Y] + dims[graph.H]);
-		if (axis._ticks.major) {
-			var offsets = graph._getTickOffsets(axis, false);
-			for (var i = 1; i < numVal; i++) {
-				var y = dims[graph.Y] + yScale * (barGap / 2 + i * (numSer * barWidth + barGap));
-				graph._root.line(gl, dims[graph.X] + offsets[0] * axis._ticks.size, y,
-					dims[graph.X] + offsets[1] * axis._ticks.size, y);
-			}
-			for (var i = 0; i < numVal; i++) {
-				var y = dims[graph.Y] + yScale * (barGap / 2 + (i + 0.5) * (numSer * barWidth + barGap));
-				graph._root.text(gt, dims[graph.X] - axis._ticks.size, y,
-					(axis._labels ? axis._labels[i] : '' + i));
-			}
-		}
-	}
-});
-
-//------------------------------------------------------------------------------
-
-/* Draw a stacked row bar chart. */
-function SVGStackedRowChart() {
-}
-
-$.extend(SVGStackedRowChart.prototype, {
-
-	/* Retrieve the display title for this chart type.
-	   @return  the title */
-	title: function() {
-		return 'Stacked row chart';
-	},
-
-	/* Retrieve a description of this chart type.
-	   @return  its description */
-	description: function() {
-		return 'Compare sets of values as horizontal bars showing ' +
-			'relative contributions to the whole for each category.';
-	},
-
-	/* Retrieve a list of the options that may be set for this chart type.
-	   @return  options list */
-	options: function() {
-		return barOptions;
-	},
-
-	/* Actually draw the graph in this type's style.
-	   @param  graph  object - the SVGGraph object */
-	drawGraph: function(graph) {
-		var bg = graph._drawChartBackground(true, true);
-		var dims = graph._getDims();
-		if (graph._gridlines[0] && graph.xAxis._ticks.major) {
-			graph._drawGridlines(bg, graph._getPercentageAxis(), false, dims, graph._gridlines[0]);
-		}
-		var barWidth = graph._chartOptions.barWidth || 10;
-		var barGap = graph._chartOptions.barGap || 10;
-		var numSer = graph._series.length;
-		var numVal = (numSer ? (graph._series[0])._values.length : 0);
-		var xScale = dims[graph.W];
-		var yScale = dims[graph.H] / ((barWidth + barGap) * numVal + barGap);
-		this._chart = graph._root.group(graph._chartGroup, 'chart');
-		this._drawRows(graph, numSer, numVal, barWidth, barGap, dims, xScale, yScale);
-		graph._drawTitle();
-		graph._root.text(graph._chartGroup, dims[graph.X] + dims[graph.W] / 2,
-			dims[graph.Y] + dims[graph.H] + graph.xAxis._titleOffset,
-			svgGraphing.region.percentageText, {text_anchor: 'middle'});
-	//	graph._drawAxis(graph._getPercentageAxis(), 'xAxis',
-	//		dims[graph.X], dims[graph.Y] + dims[graph.H],
-	//		dims[graph.X] + dims[graph.W], dims[graph.Y] + dims[graph.H]);
-	//	this._drawYAxis(graph, numVal, barWidth, barGap, dims, yScale);
-		graph._drawLegend();
-	},
-	
-	/* Plot all of the rows. */
-	_drawRows: function(graph, numSer, numVal, barWidth, barGap, dims, xScale, yScale) {
-		var totals = graph._getTotals();
-		var accum = [];
-		for (var i = 0; i < numVal; i++) {
-			accum[i] = 0;
-		}
-		for (var s = 0; s < numSer; s++) {
-			var series = graph._series[s];
-			var g = graph._root.group(this._chart, 'series' + s,
-				$.extend({stroke: series._stroke, stroke_width: series._strokeWidth},
-				series._settings || {}));
-			for (var i = 0; i < series._values.length; i++) {
-				graph._root.rect(g,
-					dims[graph.X] + xScale * accum[i] / totals[i],
-					dims[graph.Y] + yScale * (barGap + i * (barWidth + barGap)),
-					xScale * series._values[i] / totals[i], yScale * barWidth,
-					$.extend({fill: series._fill}, graph._showStatus(series._name + ' ' +
-					roundNumber(series._values[i] / totals[i] * 100, 2) + '%')));
-				accum[i] += series._values[i];
-			}
-		}
-	},
-	
-	/* Draw the y-axis and its ticks. */
-	_drawYAxis: function(graph, numVal, barWidth, barGap, dims, yScale) {
-		var axis = graph.xAxis;
-		if (axis._title) {
-			graph._root.text(graph._chartGroup, 0, 0, axis._title, {text_anchor: 'middle',
-				transform: 'translate(' + (dims[graph.X] - axis._titleOffset) + ',' +
-				(dims[graph.Y] + dims[graph.H] / 2) + ') rotate(-90)'});
-		}
-		var gl = graph._root.group(graph._chartGroup, 'yAxis', axis._lineFormat);
-		var gt = graph._root.group(graph._chartGroup, 'yAxisLabels',
-			$.extend({text_anchor: 'end'}, axis._labelFormat));
-		graph._root.line(gl, dims[graph.X], dims[graph.Y], dims[graph.X], dims[graph.Y] + dims[graph.H]);
-		if (axis._ticks.major) {
-			var offsets = graph._getTickOffsets(axis, false);
-			for (var i = 1; i < numVal; i++) {
-				var y = dims[graph.Y] + yScale * (barGap / 2 + i * (barWidth + barGap));
-				graph._root.line(gl, dims[graph.X] + offsets[0] * axis._ticks.size, y,
-					dims[graph.X] + offsets[1] * axis._ticks.size, y);
-			}
-			for (var i = 0; i < numVal; i++) {
-				var y = dims[graph.Y] + yScale * (barGap / 2 + (i + 0.5) * (barWidth + barGap));
-				graph._root.text(gt, dims[graph.X] - axis._ticks.size, y,
-					(axis._labels ? axis._labels[i] : '' + i));
-			}
-		}
-	}
-});
-
-//------------------------------------------------------------------------------
-
-/* Draw a standard line chart. */
-function SVGLineChart() {
-}
-
-$.extend(SVGLineChart.prototype, {
-
-	/* Retrieve the display title for this chart type.
-	   @return  the title */
-	title: function() {
-		return 'Basic line chart';
-	},
-
-	/* Retrieve a description of this chart type.
-	   @return  its description */
-	description: function() {
-		return 'Compare sets of values as continuous lines.';
-	},
-
-	/* Retrieve a list of the options that may be set for this chart type.
-	   @return  options list */
-	options: function() {
-		return [];
-	},
-	
-	/* Actually draw the graph in this type's style.
-	   @param  graph  object - the SVGGraph object */
-	drawGraph: function(graph) {
-		graph._drawChartBackground();
-		var dims = graph._getDims();
-		var xScale = dims[graph.W] / (graph.xAxis._scale.max - graph.xAxis._scale.min);
-		var yScale = dims[graph.H] / (graph.yAxis._scale.max - graph.yAxis._scale.min);
-		this._chart = graph._root.group(graph._chartGroup, 'chart');
-		for (var i = 0; i < graph._series.length; i++) {
-			this._drawSeries(graph, i, dims, xScale, yScale);
-		}
-		graph._drawTitle();
-		graph._drawAxes();
-		graph._drawLegend();
-	},
-	
-	/* Plot an individual series. */
-	_drawSeries: function(graph, cur, dims, xScale, yScale) {
-		var series = graph._series[cur];
-		var path = graph._root.createPath();
-		for (var i = 0; i < series._values.length; i++) {
-			var x = dims[graph.X] + i * xScale;
-			var y = dims[graph.Y] + (graph.yAxis._scale.max - series._values[i]) * yScale;
-			if (i == 0) {
-				path.moveTo(x, y);
-			}
-			else {
-				path.lineTo(x, y);
-			}
-		}
-		graph._root.path(this._chart, path, 
-			$.extend($.extend({id: 'series' + cur, fill: 'none', stroke: series._stroke, 
-			stroke_width: series._strokeWidth}, graph._showStatus(series._name),
-			series._settings || {})));
-	}
-});
-
-//------------------------------------------------------------------------------
-
-/* Draw a standard pie chart. */
-function SVGPieChart() {
-}
-
-$.extend(SVGPieChart.prototype, {
-
-	_options: ['explode (number[]) - indexes of sections to explode out of the pie',
-		'explodeDist (number) - the distance to move an exploded section',
-		'pieGap (number) - the distance between pies for multiple values'],
-
-	/* Retrieve the display title for this chart type.
-	   @return  the title */
-	title: function() {
-		return 'Pie chart';
-	},
-
-	/* Retrieve a description of this chart type.
-	   @return  its description */
-	description: function() {
-		return 'Compare relative sizes of values as contributions to the whole.';
-	},
-
-	/* Retrieve a list of the options that may be set for this chart type.
-	   @return  options list */
-	options: function() {
-		return this._options;
-	},
-	
-	/* Actually draw the graph in this type's style.
-	   @param  graph  object - the SVGGraph object */
-	drawGraph: function(graph) {
-		graph._drawChartBackground(true, true);
-		this._chart = graph._root.group(graph._chartGroup, 'chart');
-		var dims = graph._getDims();
-		this._drawSeries(graph, dims);
-		graph._drawTitle();
-		graph._drawLegend();
-	},
-	
-	/* Plot all the series. */
-	_drawSeries: function(graph, dims) {
-		var totals = graph._getTotals();
-		var numSer = graph._series.length;
-		var numVal = (numSer ? (graph._series[0])._values.length : 0);
-		var path = graph._root.createPath();
-		var explode = graph._chartOptions.explode || [];
-		var explodeDist = graph._chartOptions.explodeDist || 10;
-		var pieGap = (numVal <= 1 ? 0 : graph._chartOptions.pieGap || 10);
-		var xBase = (dims[graph.W] - (numVal * pieGap) - pieGap) / numVal / 2;
-		var yBase = dims[graph.H] / 2;
-		var radius = Math.min(xBase, yBase) - (explode.length > 0 ? explodeDist : 0);
-		var gt = graph._root.group(graph._chartGroup, 'xAxisLabels',
-			$.extend({text_anchor: 'middle'}, graph.xAxis._labelFormat));
-		var gl = [];
-		for (var i = 0; i < numVal; i++) {
-			var cx = dims[graph.X] + xBase + (i * (2 * Math.min(xBase, yBase) + pieGap)) + pieGap;
-			var cy = dims[graph.Y] + yBase;
-			var curTotal = 0;
-			for (var j = 0; j < numSer; j++) {
-				var series = graph._series[j];
-				if (i == 0) {
-					gl[j] = graph._root.group(this._chart, 'series' + j,
-						$.extend({stroke: series._stroke, stroke_width: series._strokeWidth},
-						series._settings || {}));
-				}
-				if (series._values[i] == 0) {
-					continue;
-				}
-				var start = (curTotal / totals[i]) * 2 * Math.PI;
-				curTotal += series._values[i];
-				var end = (curTotal / totals[i]) * 2 * Math.PI;
-				var exploding = false;
-				for (var k = 0; k < explode.length; k++) {
-					if (explode[k] == j) {
-						exploding = true;
-						break;
-					}
-				}
-				var x = cx + (exploding ? explodeDist * Math.cos((start + end) / 2) : 0);
-				var y = cy + (exploding ? explodeDist * Math.sin((start + end) / 2) : 0);
-				var status = series._name + ' ' +
-					roundNumber((end - start) / 2 / Math.PI * 100, 2) + '%';
-				graph._root.path(gl[j], path.reset().moveTo(x, y).
-					lineTo(x + radius * Math.cos(start), y + radius * Math.sin(start)).
-					arcTo(radius, radius, 0, (end - start < Math.PI ? 0 : 1), 1, 
-					x + radius * Math.cos(end), y + radius * Math.sin(end)).close(), 
-					$.extend({fill: series._fill}, graph._showStatus(status)));
-			}
-			if (graph.xAxis) {
-				graph._root.text(gt, cx, dims[graph.Y] + dims[graph.H] + graph.xAxis._titleOffset,
-					graph.xAxis._labels[i])
-			}
-		}
-	}
-});
-
-//------------------------------------------------------------------------------
-
-/* Determine whether an object is an array. */
-function isArray(a) {
-	return (a.constructor && a.constructor.toString().match(/\Array\(\)/));
-}
-
-// Basic chart types
-svgGraphing.addChartType('column', new SVGColumnChart());
-svgGraphing.addChartType('stackedColumn', new SVGStackedColumnChart());
-svgGraphing.addChartType('row', new SVGRowChart());
-svgGraphing.addChartType('stackedRow', new SVGStackedRowChart());
-svgGraphing.addChartType('line', new SVGLineChart());
-svgGraphing.addChartType('pie', new SVGPieChart());
-
-})(jQuery)
diff --git a/src/public/javascripts/jquery-svg/jquery.svggraph.min.js b/src/public/javascripts/jquery-svg/jquery.svggraph.min.js
deleted file mode 100644
index b8484c6..0000000
--- a/src/public/javascripts/jquery-svg/jquery.svggraph.min.js
+++ /dev/null
@@ -1,7 +0,0 @@
-/* http://keith-wood.name/svg.html
-   SVG graphing extension for jQuery v1.0.1.
-   Written by Keith Wood (kbwood@iprimus.com.au) August 2007.
-   Dual licensed under the GPL (http://dev.jquery.com/browser/trunk/jquery/GPL-LICENSE.txt) and 
-   MIT (http://dev.jquery.com/browser/trunk/jquery/MIT-LICENSE.txt) licenses. 
-   Please attribute the author if you use it. */
-var svgGraphing=null;(function($){svgManager.addExtension('graph',SVGGraph);svgGraphing=new SVGGraphing();function SVGGraphing(){this.regional=[];this.regional['']={percentageText:'Percentage'};this.region=this.regional['']}$.extend(SVGGraphing.prototype,{_chartTypes:[],addChartType:function(a,b){this._chartTypes[a]=b},chartTypes:function(){return this._chartTypes}});function SVGGraph(a){this._root=a;this._drawNow=true;for(var b in svgGraphing._chartTypes){this._chartType=svgGraphing._chartTypes[b];break}this._chartOptions={};this._title={value:'',offset:25,settings:{text_anchor:'middle'}};this._area=[0.1,0.1,0.8,0.9];this._chartFormat={fill:'none',stroke:'black'};this._gridlines=[];this._series=[];this._onstatus=null;this._chartGroup=this._root.group(null,'graph');this.xAxis=new SVGGraphAxis();this.xAxis.title('',40);this.yAxis=new SVGGraphAxis();this.yAxis.title('',40);this.x2Axis=null;this.y2Axis=null;this.legend=new SVGGraphLegend()}$.extend(SVGGraph.prototype,{X:0,Y:1,W:2,H:3,L:0,T:1,R:2,B:3,_percentageAxis:new SVGGraphAxis(svgGraphing.region.percentageText,0,100,10,0),chartType:function(a,b){if(arguments.length==0){return this._chartType}var c=svgGraphing._chartTypes[a];if(c){this._chartType=c;this._chartOptions=$.extend({},b||{})}this._drawGraph();return this},chartOptions:function(a){if(arguments.length==0){return this._chartOptions}this._chartOptions=$.extend({},a);this._drawGraph();return this},chartFormat:function(a,b,c){if(arguments.length==0){return this._chartFormat}if(typeof b=='object'){c=b;b=null}this._chartFormat=$.extend($.extend({fill:a},(b?{stroke:b}:{})),c||{});this._drawGraph();return this},chartArea:function(a,b,c,d){if(arguments.length==0){return this._area}this._area=(isArray(a)?a:[a,b,c,d]);this._drawGraph();return this},gridlines:function(a,b){if(arguments.length==0){return this._gridlines}this._gridlines=[(typeof a=='string'?{stroke:a}:a),(typeof b=='string'?{stroke:b}:b)];this._drawGraph();return this},title:function(a,b,c){if(arguments.length==0){return this._title}if(typeof b=='object'){c=b;b=null}this._title={value:a,offset:b||this._title.offset,settings:$.extend({text_anchor:'middle'},c||{})};this._drawGraph();return this},addSeries:function(a,b,c,d,e,f){if(typeof e=='object'){f=e;e=null}this._series[this._series.length]=new SVGGraphSeries(a,b,c,d,e,f||{});this._drawGraph();return this},series:function(){return this._series},noDraw:function(){this._drawNow=false;return this},redraw:function(){this._drawNow=true;this._drawGraph();return this},status:function(a){this._onstatus=a;return this},_drawGraph:function(){if(!this._drawNow){return}while(this._chartGroup.firstChild){this._chartGroup.removeChild(this._chartGroup.firstChild)}if(!this._chartGroup.parent){this._root._svg.appendChild(this._chartGroup)}this._chartType.drawGraph(this)},_drawTitle:function(){this._root.text(this._chartGroup,this._root._width()/2,this._title.offset,this._title.value,this._title.settings)},_getDims:function(a){a=a||this._area;var b=(a[this.L]>1?a[this.L]:this._root._width()*a[this.L]);var c=(a[this.T]>1?a[this.T]:this._root._height()*a[this.T]);var d=(a[this.R]>1?a[this.R]:this._root._width()*a[this.R])-b;var e=(a[this.B]>1?a[this.B]:this._root._height()*a[this.B])-c;return[b,c,d,e]},_drawChartBackground:function(a,b){var c=this._root.group(this._chartGroup,'background');var d=this._getDims();this._root.rect(c,d[this.X],d[this.Y],d[this.W],d[this.H],this._chartFormat);if(this._gridlines[0]&&this.yAxis._ticks.major&&!b){this._drawGridlines(c,this.yAxis,true,d,this._gridlines[0])}if(this._gridlines[1]&&this.xAxis._ticks.major&&!a){this._drawGridlines(c,this.xAxis,false,d,this._gridlines[1])}return c},_drawGridlines:function(a,b,c,d,e){var g=this._root.group(a,e);var f=(c?d[this.H]:d[this.W])/(b._scale.max-b._scale.min);var h=Math.floor(b._scale.min/b._ticks.major)*b._ticks.major;h=(h<b._scale.min?h+b._ticks.major:h);while(h<=b._scale.max){var v=(c?b._scale.max-h:h-b._scale.min)*f+(c?d[this.Y]:d[this.X]);this._root.line(g,(c?d[this.X]:v),(c?v:d[this.Y]),(c?d[this.X]+d[this.W]:v),(c?v:d[this.Y]+d[this.H]));h+=b._ticks.major}},_drawAxes:function(a){var b=this._getDims();if(this.xAxis&&!a){if(this.xAxis._title){this._root.text(this._chartGroup,b[this.X]+b[this.W]/2,b[this.Y]+b[this.H]+this.xAxis._titleOffset,this.xAxis._title)}this._drawAxis(this.xAxis,'xAxis',b[this.X],b[this.Y]+b[this.H],b[this.X]+b[this.W],b[this.Y]+b[this.H])}if(this.yAxis){if(this.yAxis._title){this._root.text(this._chartGroup,0,0,this.yAxis._title,{text_anchor:'middle',transform:'translate('+(b[this.X]-this.yAxis._titleOffset)+','+(b[this.Y]+b[this.H]/2)+') rotate(-90)'})}this._drawAxis(this.yAxis,'yAxis',b[this.X],b[this.Y],b[this.X],b[this.Y]+b[this.H])}if(this.x2Axis&&!a){if(this.x2Axis._title){this._root.text(this._chartGroup,b[this.X]+b[this.W]/2,b[this.X]-this.x2Axis._titleOffset,this.x2Axis._title)}this._drawAxis(this.x2Axis,'x2Axis',b[this.X],b[this.Y],b[this.X]+b[this.W],b[this.Y])}if(this.y2Axis){if(this.y2Axis._title){this._root.text(this._chartGroup,0,0,this.y2Axis._title,{text_anchor:'middle',transform:'translate('+(b[this.X]+b[this.W]+this.y2Axis._titleOffset)+','+(b[this.Y]+b[this.H]/2)+') rotate(-90)'})}this._drawAxis(this.y2Axis,'y2Axis',b[this.X]+b[this.W],b[this.Y],b[this.X]+b[this.W],b[this.Y]+b[this.H])}},_drawAxis:function(a,b,c,d,e,f){var g=(d==f);var h=this._root.group(this._chartGroup,b,a._lineFormat);var i=this._root.group(this._chartGroup,b+'Labels',$.extend({text_anchor:(g?'middle':'end')},a._labelFormat));this._root.line(h,c,d,e,f);if(a._ticks.major){var j=(e>(this._root._width()/2)&&f>(this._root._height()/2));var k=(g?e-c:f-d)/(a._scale.max-a._scale.min);var l=a._ticks.size;var m=Math.floor(a._scale.min/a._ticks.major)*a._ticks.major;m=(m<a._scale.min?m+a._ticks.major:m);var n=(!a._ticks.minor?a._scale.max+1:Math.floor(a._scale.min/a._ticks.minor)*a._ticks.minor);n=(n<a._scale.min?n+a._ticks.minor:n);var o=this._getTickOffsets(a,j);while(m<=a._scale.max||n<=a._scale.max){var p=Math.min(m,n);var q=(p==m?l:l/2);var v=(g?c:d)+(g?p-a._scale.min:a._scale.max-p)*k;this._root.line(h,(g?v:c+q*o[0]),(g?d+q*o[0]:v),(g?v:c+q*o[1]),(g?d+q*o[1]:v));if(p==m){this._root.text(i,(g?v:c-l),(g?d+2*l:v),(a._labels?a._labels[p]:''+p))}m+=(p==m?a._ticks.major:0);n+=(p==n?a._ticks.minor:0)}}},_getTickOffsets:function(a,b){return[(a._ticks.position==(b?'in':'out')||a._ticks.position=='both'?-1:0),(a._ticks.position==(b?'out':'in')||a._ticks.position=='both'?+1:0),]},_getPercentageAxis:function(){this._percentageAxis._title=svgGraphing.region.percentageText;return this._percentageAxis},_getTotals:function(){var a=[];var b=(this._series.length?this._series[0]._values.length:0);for(var i=0;i<b;i++){a[i]=0;for(var j=0;j<this._series.length;j++){a[i]+=this._series[j]._values[i]}}return a},_drawLegend:function(){if(!this.legend._show){return}var g=this._root.group(this._chartGroup,'legend');var a=this._getDims(this.legend._area);this._root.rect(g,a[this.X],a[this.Y],a[this.W],a[this.H],this.legend._bgSettings);var b=a[this.W]>a[this.H];var c=this._series.length;var d=(b?a[this.W]:a[this.H])/c;var e=a[this.X]+5;var f=a[this.Y]+(b?a[this.H]/2:d/2);for(var i=0;i<c;i++){var h=this._series[i];this._root.rect(g,e+(b?i*d:0),f+(b?0:i*d)-this.legend._sampleSize,this.legend._sampleSize,this.legend._sampleSize,{fill:h._fill,stroke:h._stroke,stroke_width:1});this._root.text(g,e+(b?i*d:0)+this.legend._sampleSize+5,f+(b?0:i*d),h._name,this.legend._textSettings)}},_showStatus:function(a){var b=(!this._onstatus?'':this._onstatus.toString().replace(/function (.*)\([\s\S]*/m,'$1'));return(!this._onstatus?{}:{onmouseover:'window.parent.'+b+'(\''+a+'\');',onmouseout:'window.parent.'+b+'(\'\');'})}});function SVGGraphAxis(a,b,c,d,e){this._title=a||'';this._titleFormat={};this._titleOffset=0;this._labels=null;this._labelFormat={};this._lineFormat={stroke:'black'};this._ticks={major:d||10,minor:e||0,size:10,position:'out'};this._scale={min:b||0,max:c||100};this._crossAt=0}$.extend(SVGGraphAxis.prototype,{scale:function(a,b){if(arguments.length==0){return this._scale}this._scale.min=a;this._scale.max=b;return this},ticks:function(a,b,c,d){if(arguments.length==0){return this._ticks}if(typeof c=='string'){d=c;c=null}this._ticks.major=a;this._ticks.minor=b;this._ticks.size=c||10;this._ticks.position=d||'out';return this},title:function(a,b,c){if(arguments.length==0){return{title:this._title,offset:this._titleOffset,format:this._titleFormat}}if(typeof b=='object'){c=b;b=null}this._title=a;if(b!=null){this._titleOffset=b}if(c){this._titleFormat=c}return this},labels:function(a,b){if(arguments.length==0){return{labels:this._labels,format:this._labelFormat}}this._labels=a;if(b){this._labelFormat=b}return this},line:function(a,b,c){if(arguments.length==0){return this._lineFormat}if(typeof b=='object'){c=b;b=null}$.extend(this._lineFormat,{stroke:a,stroke_width:b||1});$.extend(this._lineFormat,c||{});return this}});var B='green';var C='black';function SVGGraphSeries(a,b,c,d,e,f){this._name=a||'';this._values=b||[];this._axis=1;this._fill=c||B;this._stroke=d||C;this._strokeWidth=e||1;this._settings=f||{}}$.extend(SVGGraphSeries.prototype,{name:function(a){if(arguments.length==0){return this._name}this._name=a;return this},values:function(a,b){if(arguments.length==0){return this._values}if(isArray(a)){valus=a;a=null}this._name=a||this._name;this._values=b;return this},format:function(a,b,c,d){if(arguments.length==0){return $.extend({fill:this._fill,stroke:this._stroke,stroke_width:this._strokeWidth},this._settings)}if(typeof c=='object'){d=c;c=null}this._fill=a||B;this._stroke=b||this._stroke;this._strokeWidth=c||this._strokeWidth;$.extend(this._settings,d||{});return this}});function SVGGraphLegend(a,b){this._show=true;this._area=[0.9,0.1,1.0,0.9];this._sampleSize=15;this._bgSettings=a||{stroke:'gray'};this._textSettings=b||{}}$.extend(SVGGraphLegend.prototype,{show:function(a){if(arguments.length==0){return this._show}this._show=a;return this},area:function(a,b,c,d){if(arguments.length==0){return this._area}this._area=(isArray(a)?a:[a,b,c,d]);return this},settings:function(a,b,c){if(arguments.length==0){return{sampleSize:this._sampleSize,bgSettings:this._bgSettings,textSettings:this._textSettings}}if(typeof a=='object'){c=b;b=a;a=null}if(a){this._sampleSize=a}this._bgSettings=b;if(c){this._textSettings=c}return this}});function roundNumber(a,b){return Math.round(a*Math.pow(10,b))/Math.pow(10,b)}var D=['barWidth (number) - the width of each bar','barGap (number) - the gap between sets of bars'];function SVGColumnChart(){}$.extend(SVGColumnChart.prototype,{title:function(){return'Basic column chart'},description:function(){return'Compare sets of values as vertical bars with grouped categories.'},options:function(){return D},drawGraph:function(a){a._drawChartBackground(true);var b=a._chartOptions.barWidth||10;var c=a._chartOptions.barGap||10;var d=a._series.length;var e=(d?(a._series[0])._values.length:0);var f=a._getDims();var g=f[a.W]/((d*b+c)*e+c);var h=f[a.H]/(a.yAxis._scale.max-a.yAxis._scale.min);this._chart=a._root.group(a._chartGroup,'chart');for(var i=0;i<d;i++){this._drawSeries(a,i,d,b,c,f,g,h)}a._drawTitle();a._drawAxes(true);this._drawXAxis(a,d,e,b,c,f,g);a._drawLegend()},_drawSeries:function(a,b,c,d,e,f,h,j){var k=a._series[b];var g=a._root.group(this._chart,'series'+b,$.extend({stroke:k._stroke,stroke_width:k._strokeWidth},k._settings||{}));for(var i=0;i<k._values.length;i++){a._root.rect(g,f[a.X]+h*(e+i*(c*d+e)+(b*d)),f[a.Y]+j*(a.yAxis._scale.max-k._values[i]),h*d,j*k._values[i],$.extend({fill:k._fill},a._showStatus(k._name+' '+k._values[i])))}},_drawXAxis:function(a,b,c,d,e,f,g){var h=a.xAxis;if(h._title){a._root.text(a._chartGroup,f[a.X]+f[a.W]/2,f[a.Y]+f[a.H]+h._titleOffset,h._title,{text_anchor:'middle'})}var j=a._root.group(a._chartGroup,'xAxis',h._lineFormat);var k=a._root.group(a._chartGroup,'xAxisLabels',$.extend({text_anchor:'middle'},h._labelFormat));a._root.line(j,f[a.X],f[a.Y]+f[a.H],f[a.X]+f[a.W],f[a.Y]+f[a.H]);if(h._ticks.major){var l=a._getTickOffsets(h,true);for(var i=1;i<c;i++){var x=f[a.X]+g*(e/2+i*(b*d+e));a._root.line(j,x,f[a.Y]+f[a.H]+l[0]*h._ticks.size,x,f[a.Y]+f[a.H]+l[1]*h._ticks.size)}for(var i=0;i<c;i++){var x=f[a.X]+g*(e/2+(i+0.5)*(b*d+e));a._root.text(k,x,f[a.Y]+f[a.H]+2*h._ticks.size,(h._labels?h._labels[i]:''+i))}}}});function SVGStackedColumnChart(){}$.extend(SVGStackedColumnChart.prototype,{title:function(){return'Stacked column chart'},description:function(){return'Compare sets of values as vertical bars showing '+'relative contributions to the whole for each category.'},options:function(){return D},drawGraph:function(a){var b=a._drawChartBackground(true,true);var c=a._getDims();if(a._gridlines[0]&&a.xAxis._ticks.major){a._drawGridlines(b,a._getPercentageAxis(),true,c,a._gridlines[0])}var d=a._chartOptions.barWidth||10;var e=a._chartOptions.barGap||10;var f=a._series.length;var g=(f?(a._series[0])._values.length:0);var h=c[a.W]/((d+e)*g+e);var i=c[a.H];this._chart=a._root.group(a._chartGroup,'chart');this._drawColumns(a,f,g,d,e,c,h,i);a._drawTitle();a._root.text(a._chartGroup,0,0,svgGraphing.region.percentageText,{text_anchor:'middle',transform:'translate('+(c[a.X]-a.yAxis._titleOffset)+','+(c[a.Y]+c[a.H]/2)+') rotate(-90)'});a._drawAxis(a._getPercentageAxis(),'yAxis',c[a.X],c[a.Y],c[a.X],c[a.Y]+c[a.H]);this._drawXAxis(a,g,d,e,c,h);a._drawLegend()},_drawColumns:function(a,b,c,d,e,f,h,j){var k=a._getTotals();var l=[];for(var i=0;i<c;i++){l[i]=0}for(var s=0;s<b;s++){var m=a._series[s];var g=a._root.group(this._chart,'series'+s,$.extend({stroke:m._stroke,stroke_width:m._strokeWidth},m._settings||{}));for(var i=0;i<m._values.length;i++){l[i]+=m._values[i];a._root.rect(g,f[a.X]+h*(e+i*(d+e)),f[a.Y]+j*(k[i]-l[i])/k[i],h*d,j*m._values[i]/k[i],$.extend({fill:m._fill},a._showStatus(m._name+' '+roundNumber(m._values[i]/k[i]*100,2)+'%')))}}},_drawXAxis:function(a,b,c,d,e,f){var g=a.xAxis;if(g._title){a._root.text(a._chartGroup,e[a.X]+e[a.W]/2,e[a.Y]+e[a.H]+g._titleOffset,g._title,{text_anchor:'middle'})}var h=a._root.group(a._chartGroup,'xAxis',g._lineFormat);var j=a._root.group(a._chartGroup,'xAxisLabels',$.extend({text_anchor:'middle'},g._labelFormat));a._root.line(h,e[a.X],e[a.Y]+e[a.H],e[a.X]+e[a.W],e[a.Y]+e[a.H]);if(g._ticks.major){var k=a._getTickOffsets(g,true);for(var i=1;i<b;i++){var x=e[a.X]+f*(d/2+i*(c+d));a._root.line(h,x,e[a.Y]+e[a.H]+k[0]*g._ticks.size,x,e[a.Y]+e[a.H]+k[1]*g._ticks.size)}for(var i=0;i<b;i++){var x=e[a.X]+f*(d/2+(i+0.5)*(c+d));a._root.text(j,x,e[a.Y]+e[a.H]+2*g._ticks.size,(g._labels?g._labels[i]:''+i))}}}});function SVGRowChart(){}$.extend(SVGRowChart.prototype,{title:function(){return'Basic row chart'},description:function(){return'Compare sets of values as horizontal rows with grouped categories.'},options:function(){return D},drawGraph:function(a){var b=a._drawChartBackground(true,true);var c=a._getDims();a._drawGridlines(b,a.yAxis,false,c,a._gridlines[0]);var d=a._chartOptions.barWidth||10;var e=a._chartOptions.barGap||10;var f=a._series.length;var g=(f?(a._series[0])._values.length:0);var h=c[a.W]/(a.yAxis._scale.max-a.yAxis._scale.min);var j=c[a.H]/((f*d+e)*g+e);this._chart=a._root.group(a._chartGroup,'chart');for(var i=0;i<f;i++){this._drawSeries(a,i,f,d,e,c,h,j)}a._drawTitle();this._drawAxes(a,f,g,d,e,c,j);a._drawLegend()},_drawSeries:function(a,b,c,d,e,f,h,j){var k=a._series[b];var g=a._root.group(this._chart,'series'+b,$.extend({stroke:k._stroke,stroke_width:k._strokeWidth},k._settings||{}));for(var i=0;i<k._values.length;i++){a._root.rect(g,f[a.X]+h*(0-a.yAxis._scale.min),f[a.Y]+j*(e+i*(c*d+e)+(b*d)),h*k._values[i],j*d,$.extend({fill:k._fill},a._showStatus(k._name+' '+k._values[i])))}},_drawAxes:function(a,b,c,d,e,f,g){var h=a.yAxis;if(h){if(h._title){a._root.text(a._chartGroup,f[a.X]+f[a.W]/2,f[a.Y]+f[a.H]+h._titleOffset,h._title,h._titleFormat)}a._drawAxis(h,'xAxis',f[a.X],f[a.Y]+f[a.H],f[a.X]+f[a.W],f[a.Y]+f[a.H])}var h=a.xAxis;if(h._title){a._root.text(a._chartGroup,0,0,h._title,{text_anchor:'middle',transform:'translate('+(f[a.X]-h._titleOffset)+','+(f[a.Y]+f[a.H]/2)+') rotate(-90)'})}var j=a._root.group(a._chartGroup,'yAxis',h._lineFormat);var k=a._root.group(a._chartGroup,'yAxisLabels',$.extend({text_anchor:'end'},h._labelFormat));a._root.line(j,f[a.X],f[a.Y],f[a.X],f[a.Y]+f[a.H]);if(h._ticks.major){var l=a._getTickOffsets(h,false);for(var i=1;i<c;i++){var y=f[a.Y]+g*(e/2+i*(b*d+e));a._root.line(j,f[a.X]+l[0]*h._ticks.size,y,f[a.X]+l[1]*h._ticks.size,y)}for(var i=0;i<c;i++){var y=f[a.Y]+g*(e/2+(i+0.5)*(b*d+e));a._root.text(k,f[a.X]-h._ticks.size,y,(h._labels?h._labels[i]:''+i))}}}});function SVGStackedRowChart(){}$.extend(SVGStackedRowChart.prototype,{title:function(){return'Stacked row chart'},description:function(){return'Compare sets of values as horizontal bars showing '+'relative contributions to the whole for each category.'},options:function(){return D},drawGraph:function(a){var b=a._drawChartBackground(true,true);var c=a._getDims();if(a._gridlines[0]&&a.xAxis._ticks.major){a._drawGridlines(b,a._getPercentageAxis(),false,c,a._gridlines[0])}var d=a._chartOptions.barWidth||10;var e=a._chartOptions.barGap||10;var f=a._series.length;var g=(f?(a._series[0])._values.length:0);var h=c[a.W];var i=c[a.H]/((d+e)*g+e);this._chart=a._root.group(a._chartGroup,'chart');this._drawRows(a,f,g,d,e,c,h,i);a._drawTitle();a._root.text(a._chartGroup,c[a.X]+c[a.W]/2,c[a.Y]+c[a.H]+a.xAxis._titleOffset,svgGraphing.region.percentageText,{text_anchor:'middle'});a._drawAxis(a._getPercentageAxis(),'xAxis',c[a.X],c[a.Y]+c[a.H],c[a.X]+c[a.W],c[a.Y]+c[a.H]);this._drawYAxis(a,g,d,e,c,i);a._drawLegend()},_drawRows:function(a,b,c,d,e,f,h,j){var k=a._getTotals();var l=[];for(var i=0;i<c;i++){l[i]=0}for(var s=0;s<b;s++){var m=a._series[s];var g=a._root.group(this._chart,'series'+s,$.extend({stroke:m._stroke,stroke_width:m._strokeWidth},m._settings||{}));for(var i=0;i<m._values.length;i++){a._root.rect(g,f[a.X]+h*l[i]/k[i],f[a.Y]+j*(e+i*(d+e)),h*m._values[i]/k[i],j*d,$.extend({fill:m._fill},a._showStatus(m._name+' '+roundNumber(m._values[i]/k[i]*100,2)+'%')));l[i]+=m._values[i]}}},_drawYAxis:function(a,b,c,d,e,f){var g=a.xAxis;if(g._title){a._root.text(a._chartGroup,0,0,g._title,{text_anchor:'middle',transform:'translate('+(e[a.X]-g._titleOffset)+','+(e[a.Y]+e[a.H]/2)+') rotate(-90)'})}var h=a._root.group(a._chartGroup,'yAxis',g._lineFormat);var j=a._root.group(a._chartGroup,'yAxisLabels',$.extend({text_anchor:'end'},g._labelFormat));a._root.line(h,e[a.X],e[a.Y],e[a.X],e[a.Y]+e[a.H]);if(g._ticks.major){var k=a._getTickOffsets(g,false);for(var i=1;i<b;i++){var y=e[a.Y]+f*(d/2+i*(c+d));a._root.line(h,e[a.X]+k[0]*g._ticks.size,y,e[a.X]+k[1]*g._ticks.size,y)}for(var i=0;i<b;i++){var y=e[a.Y]+f*(d/2+(i+0.5)*(c+d));a._root.text(j,e[a.X]-g._ticks.size,y,(g._labels?g._labels[i]:''+i))}}}});function SVGLineChart(){}$.extend(SVGLineChart.prototype,{title:function(){return'Basic line chart'},description:function(){return'Compare sets of values as continuous lines.'},options:function(){return[]},drawGraph:function(a){a._drawChartBackground();var b=a._getDims();var c=b[a.W]/(a.xAxis._scale.max-a.xAxis._scale.min);var d=b[a.H]/(a.yAxis._scale.max-a.yAxis._scale.min);this._chart=a._root.group(a._chartGroup,'chart');for(var i=0;i<a._series.length;i++){this._drawSeries(a,i,b,c,d)}a._drawTitle();a._drawAxes();a._drawLegend()},_drawSeries:function(a,b,c,d,e){var f=a._series[b];var g=a._root.createPath();for(var i=0;i<f._values.length;i++){var x=c[a.X]+i*d;var y=c[a.Y]+(a.yAxis._scale.max-f._values[i])*e;if(i==0){g.moveTo(x,y)}else{g.lineTo(x,y)}}a._root.path(this._chart,g,$.extend($.extend({id:'series'+b,fill:'none',stroke:f._stroke,stroke_width:f._strokeWidth},a._showStatus(f._name),f._settings||{})))}});function SVGPieChart(){}$.extend(SVGPieChart.prototype,{_options:['explode (number[]) - indexes of sections to explode out of the pie','explodeDist (number) - the distance to move an exploded section','pieGap (number) - the distance between pies for multiple values'],title:function(){return'Pie chart'},description:function(){return'Compare relative sizes of values as contributions to the whole.'},options:function(){return this._options},drawGraph:function(a){a._drawChartBackground(true,true);this._chart=a._root.group(a._chartGroup,'chart');var b=a._getDims();this._drawSeries(a,b);a._drawTitle();a._drawLegend()},_drawSeries:function(a,b){var c=a._getTotals();var d=a._series.length;var e=(d?(a._series[0])._values.length:0);var f=a._root.createPath();var g=a._chartOptions.explode||[];var h=a._chartOptions.explodeDist||10;var l=(e<=1?0:a._chartOptions.pieGap||10);var m=(b[a.W]-(e*l)-l)/e/2;var n=b[a.H]/2;var o=Math.min(m,n)-(g.length>0?h:0);var p=a._root.group(a._chartGroup,'xAxisLabels',$.extend({text_anchor:'middle'},a.xAxis._labelFormat));var q=[];for(var i=0;i<e;i++){var r=b[a.X]+m+(i*(2*Math.min(m,n)+l))+l;var s=b[a.Y]+n;var t=0;for(var j=0;j<d;j++){var u=a._series[j];if(i==0){q[j]=a._root.group(this._chart,'series'+j,$.extend({stroke:u._stroke,stroke_width:u._strokeWidth},u._settings||{}))}if(u._values[i]==0){continue}var v=(t/c[i])*2*Math.PI;t+=u._values[i];var w=(t/c[i])*2*Math.PI;var z=false;for(var k=0;k<g.length;k++){if(g[k]==j){z=true;break}}var x=r+(z?h*Math.cos((v+w)/2):0);var y=s+(z?h*Math.sin((v+w)/2):0);var A=u._name+' '+roundNumber((w-v)/2/Math.PI*100,2)+'%';a._root.path(q[j],f.reset().moveTo(x,y).lineTo(x+o*Math.cos(v),y+o*Math.sin(v)).arcTo(o,o,0,(w-v<Math.PI?0:1),1,x+o*Math.cos(w),y+o*Math.sin(w)).close(),$.extend({fill:u._fill},a._showStatus(A)))}if(a.xAxis){a._root.text(p,r,b[a.Y]+b[a.H]+a.xAxis._titleOffset,a.xAxis._labels[i])}}}});function isArray(a){return(a.constructor&&a.constructor.toString().match(/\Array\(\)/))}svgGraphing.addChartType('column',new SVGColumnChart());svgGraphing.addChartType('stackedColumn',new SVGStackedColumnChart());svgGraphing.addChartType('row',new SVGRowChart());svgGraphing.addChartType('stackedRow',new SVGStackedRowChart());svgGraphing.addChartType('line',new SVGLineChart());svgGraphing.addChartType('pie',new SVGPieChart())})(jQuery)
\ No newline at end of file
diff --git a/src/public/javascripts/jquery-svg/jquery.svggraph.pack.js b/src/public/javascripts/jquery-svg/jquery.svggraph.pack.js
deleted file mode 100644
index cc571b1..0000000
--- a/src/public/javascripts/jquery-svg/jquery.svggraph.pack.js
+++ /dev/null
@@ -1,7 +0,0 @@
-/* http://keith-wood.name/svg.html
-   SVG graphing extension for jQuery v1.0.1.
-   Written by Keith Wood (kbwood@iprimus.com.au) August 2007.
-   Dual licensed under the GPL (http://dev.jquery.com/browser/trunk/jquery/GPL-LICENSE.txt) and 
-   MIT (http://dev.jquery.com/browser/trunk/jquery/MIT-LICENSE.txt) licenses. 
-   Please attribute the author if you use it. */
-eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('6 1e=1a;(7($){43.3M(\'3E\',36);1e=1k 2Z();7 2Z(){4.2P=[];4.2P[\'\']={28:\'3K\'};4.2m=4.2P[\'\']}$.K(2Z.1r,{23:[],1U:7(a,b){4.23[a]=b},49:7(){F 4.23}});7 36(a){4.E=a;4.2r=17;O(6 b 2J 1e.23){4.2s=1e.23[b];3c}4.1g={};4.Q={35:\'\',2h:25,2B:{19:\'1j\'}};4.1G=[0.1,0.1,0.8,0.9];4.2u={1u:\'3s\',1c:\'2T\'};4.1l=[];4.U=[];4.2k=1a;4.M=4.E.Z(1a,\'3E\');4.V=1k 29();4.V.1q(\'\',40);4.11=1k 29();4.11.1q(\'\',40);4.1L=1a;4.1N=1a;4.1t=1k 2Y()}$.K(36.1r,{X:0,Y:1,W:2,H:3,L:0,T:1,R:2,B:3,31:1k 29(1e.2m.28,0,2g,10,0),4l:7(a,b){G(18.J==0){F 4.2s}6 c=1e.23[a];G(c){4.2s=c;4.1g=$.K({},b||{})}4.1A();F 4},4k:7(a){G(18.J==0){F 4.1g}4.1g=$.K({},a);4.1A();F 4},4j:7(a,b,c){G(18.J==0){F 4.2u}G(1v b==\'1S\'){c=b;b=1a}4.2u=$.K($.K({1u:a},(b?{1c:b}:{})),c||{});4.1A();F 4},4g:7(a,b,c,d){G(18.J==0){F 4.1G}4.1G=(2v(a)?a:[a,b,c,d]);4.1A();F 4},4b:7(a,b){G(18.J==0){F 4.1l}4.1l=[(1v a==\'2W\'?{1c:a}:a),(1v b==\'2W\'?{1c:b}:b)];4.1A();F 4},1q:7(a,b,c){G(18.J==0){F 4.Q}G(1v b==\'1S\'){c=b;b=1a}4.Q={35:a,2h:b||4.Q.2h,2B:$.K({19:\'1j\'},c||{})};4.1A();F 4},48:7(a,b,c,d,e,f){G(1v e==\'1S\'){f=e;e=1a}4.U[4.U.J]=1k 2V(a,b,c,d,e,f||{});4.1A();F 4},1P:7(){F 4.U},3Z:7(){4.2r=1O;F 4},3V:7(){4.2r=17;4.1A();F 4},3T:7(a){4.2k=a;F 4},1A:7(){G(!4.2r){F}2S(4.M.3p){4.M.3R(4.M.3p)}G(!4.M.2Q){4.E.3O.3N(4.M)}4.2s.1R(4)},1M:7(){4.E.14(4.M,4.E.2p()/2,4.Q.2h,4.Q.35,4.Q.2B)},1x:7(a){a=a||4.1G;6 b=(a[4.L]>1?a[4.L]:4.E.2p()*a[4.L]);6 c=(a[4.T]>1?a[4.T]:4.E.2M()*a[4.T]);6 d=(a[4.R]>1?a[4.R]:4.E.2p()*a[4.R])-b;6 e=(a[4.B]>1?a[4.B]:4.E.2M()*a[4.B])-c;F[b,c,d,e]},1K:7(a,b){6 c=4.E.Z(4.M,\'3L\');6 d=4.1x();4.E.1J(c,d[4.X],d[4.Y],d[4.W],d[4.H],4.2u);G(4.1l[0]&&4.11.I.16&&!b){4.1X(c,4.11,17,d,4.1l[0])}G(4.1l[1]&&4.V.I.16&&!a){4.1X(c,4.V,1O,d,4.1l[1])}F c},1X:7(a,b,c,d,e){6 g=4.E.Z(a,e);6 f=(c?d[4.H]:d[4.W])/(b.N.1b-b.N.12);6 h=13.39(b.N.12/b.I.16)*b.I.16;h=(h<b.N.12?h+b.I.16:h);2S(h<=b.N.1b){6 v=(c?b.N.1b-h:h-b.N.12)*f+(c?d[4.Y]:d[4.X]);4.E.1h(g,(c?d[4.X]:v),(c?v:d[4.Y]),(c?d[4.X]+d[4.W]:v),(c?v:d[4.Y]+d[4.H]));h+=b.I.16}},2n:7(a){6 b=4.1x();G(4.V&&!a){G(4.V.Q){4.E.14(4.M,b[4.X]+b[4.W]/2,b[4.Y]+b[4.H]+4.V.1d,4.V.Q)}4.1I(4.V,\'V\',b[4.X],b[4.Y]+b[4.H],b[4.X]+b[4.W],b[4.Y]+b[4.H])}G(4.11){G(4.11.Q){4.E.14(4.M,0,0,4.11.Q,{19:\'1j\',2l:\'2d(\'+(b[4.X]-4.11.1d)+\',\'+(b[4.Y]+b[4.H]/2)+\') 2j(-2i)\'})}4.1I(4.11,\'11\',b[4.X],b[4.Y],b[4.X],b[4.Y]+b[4.H])}G(4.1L&&!a){G(4.1L.Q){4.E.14(4.M,b[4.X]+b[4.W]/2,b[4.X]-4.1L.1d,4.1L.Q)}4.1I(4.1L,\'1L\',b[4.X],b[4.Y],b[4.X]+b[4.W],b[4.Y])}G(4.1N){G(4.1N.Q){4.E.14(4.M,0,0,4.1N.Q,{19:\'1j\',2l:\'2d(\'+(b[4.X]+b[4.W]+4.1N.1d)+\',\'+(b[4.Y]+b[4.H]/2)+\') 2j(-2i)\'})}4.1I(4.1N,\'1N\',b[4.X]+b[4.W],b[4.Y],b[4.X]+b[4.W],b[4.Y]+b[4.H])}},1I:7(a,b,c,d,e,f){6 g=(d==f);6 h=4.E.Z(4.M,b,a.1D);6 i=4.E.Z(4.M,b+\'4u\',$.K({19:(g?\'1j\':\'34\')},a.1C));4.E.1h(h,c,d,e,f);G(a.I.16){6 j=(e>(4.E.2p()/2)&&f>(4.E.2M()/2));6 k=(g?e-c:f-d)/(a.N.1b-a.N.12);6 l=a.I.1f;6 m=13.39(a.N.12/a.I.16)*a.I.16;m=(m<a.N.12?m+a.I.16:m);6 n=(!a.I.1Q?a.N.1b+1:13.39(a.N.12/a.I.1Q)*a.I.1Q);n=(n<a.N.12?n+a.I.1Q:n);6 o=4.22(a,j);2S(m<=a.N.1b||n<=a.N.1b){6 p=13.12(m,n);6 q=(p==m?l:l/2);6 v=(g?c:d)+(g?p-a.N.12:a.N.1b-p)*k;4.E.1h(h,(g?v:c+q*o[0]),(g?d+q*o[0]:v),(g?v:c+q*o[1]),(g?d+q*o[1]:v));G(p==m){4.E.14(i,(g?v:c-l),(g?d+2*l:v),(a.1i?a.1i[p]:\'\'+p))}m+=(p==m?a.I.16:0);n+=(p==n?a.I.1Q:0)}}},22:7(a,b){F[(a.I.21==(b?\'2J\':\'2f\')||a.I.21==\'3x\'?-1:0),(a.I.21==(b?\'2f\':\'2J\')||a.I.21==\'3x\'?+1:0),]},2e:7(){4.31.Q=1e.2m.28;F 4.31},2A:7(){6 a=[];6 b=(4.U.J?4.U[0].P.J:0);O(6 i=0;i<b;i++){a[i]=0;O(6 j=0;j<4.U.J;j++){a[i]+=4.U[j].P[i]}}F a},1W:7(){G(!4.1t.2z){F}6 g=4.E.Z(4.M,\'1t\');6 a=4.1x(4.1t.1G);4.E.1J(g,a[4.X],a[4.Y],a[4.W],a[4.H],4.1t.2y);6 b=a[4.W]>a[4.H];6 c=4.U.J;6 d=(b?a[4.W]:a[4.H])/c;6 e=a[4.X]+5;6 f=a[4.Y]+(b?a[4.H]/2:d/2);O(6 i=0;i<c;i++){6 h=4.U[i];4.E.1J(g,e+(b?i*d:0),f+(b?0:i*d)-4.1t.1V,4.1t.1V,4.1t.1V,{1u:h.1B,1c:h.1p,1y:1});4.E.14(g,e+(b?i*d:0)+4.1t.1V+5,f+(b?0:i*d),h.1n,4.1t.2x)}},1T:7(a){6 b=(!4.2k?\'\':4.2k.3v().4i(/7 (.*)\\([\\s\\S]*/m,\'$1\'));F(!4.2k?{}:{4h:\'3u.2Q.\'+b+\'(\\\'\'+a+\'\\\');\',4f:\'3u.2Q.\'+b+\'(\\\'\\\');\'})}});7 29(a,b,c,d,e){4.Q=a||\'\';4.2w={};4.1d=0;4.1i=1a;4.1C={};4.1D={1c:\'2T\'};4.I={16:d||10,1Q:e||0,1f:10,21:\'2f\'};4.N={12:b||0,1b:c||2g};4.4e=0}$.K(29.1r,{4d:7(a,b){G(18.J==0){F 4.N}4.N.12=a;4.N.1b=b;F 4},4c:7(a,b,c,d){G(18.J==0){F 4.I}G(1v c==\'2W\'){d=c;c=1a}4.I.16=a;4.I.1Q=b;4.I.1f=c||10;4.I.21=d||\'2f\';F 4},1q:7(a,b,c){G(18.J==0){F{1q:4.Q,2h:4.1d,2X:4.2w}}G(1v b==\'1S\'){c=b;b=1a}4.Q=a;G(b!=1a){4.1d=b}G(c){4.2w=c}F 4},3t:7(a,b){G(18.J==0){F{3t:4.1i,2X:4.1C}}4.1i=a;G(b){4.1C=b}F 4},1h:7(a,b,c){G(18.J==0){F 4.1D}G(1v b==\'1S\'){c=b;b=1a}$.K(4.1D,{1c:a,1y:b||1});$.K(4.1D,c||{});F 4}});6 B=\'4a\';6 C=\'2T\';7 2V(a,b,c,d,e,f){4.1n=a||\'\';4.P=b||[];4.47=1;4.1B=c||B;4.1p=d||C;4.1w=e||1;4.1z=f||{}}$.K(2V.1r,{46:7(a){G(18.J==0){F 4.1n}4.1n=a;F 4},1F:7(a,b){G(18.J==0){F 4.P}G(2v(a)){45=a;a=1a}4.1n=a||4.1n;4.P=b;F 4},2X:7(a,b,c,d){G(18.J==0){F $.K({1u:4.1B,1c:4.1p,1y:4.1w},4.1z)}G(1v c==\'1S\'){d=c;c=1a}4.1B=a||B;4.1p=b||4.1p;4.1w=c||4.1w;$.K(4.1z,d||{});F 4}});7 2Y(a,b){4.2z=17;4.1G=[0.9,0.1,1.0,0.9];4.1V=15;4.2y=a||{1c:\'44\'};4.2x=b||{}}$.K(2Y.1r,{42:7(a){G(18.J==0){F 4.2z}4.2z=a;F 4},41:7(a,b,c,d){G(18.J==0){F 4.1G}4.1G=(2v(a)?a:[a,b,c,d]);F 4},2B:7(a,b,c){G(18.J==0){F{3Y:4.1V,3X:4.2y,3W:4.2x}}G(1v a==\'1S\'){c=b;b=a;a=1a}G(a){4.1V=a}4.2y=b;G(c){4.2x=c}F 4}});7 2t(a,b){F 13.3U(a*13.3q(10,b))/13.3q(10,b)}6 D=[\'27 (2b) - 1E 3S 1s 2R 3Q\',\'2a (2b) - 1E 3P 3o 20 1s 2q\'];7 2O(){}$.K(2O.1r,{1q:7(){F\'2N 30 1m\'},1Z:7(){F\'1Y 20 1s 1F 26 3n 2q 3m 3l 3B.\'},24:7(){F D},1R:7(a){a.1K(17);6 b=a.1g.27||10;6 c=a.1g.2a||10;6 d=a.U.J;6 e=(d?(a.U[0]).P.J:0);6 f=a.1x();6 g=f[a.W]/((d*b+c)*e+c);6 h=f[a.H]/(a.11.N.1b-a.11.N.12);4.1o=a.E.Z(a.M,\'1m\');O(6 i=0;i<d;i++){4.1H(a,i,d,b,c,f,g,h)}a.1M();a.2n(17);4.2o(a,d,e,b,c,f,g);a.1W()},1H:7(a,b,c,d,e,f,h,j){6 k=a.U[b];6 g=a.E.Z(4.1o,\'1P\'+b,$.K({1c:k.1p,1y:k.1w},k.1z||{}));O(6 i=0;i<k.P.J;i++){a.E.1J(g,f[a.X]+h*(e+i*(c*d+e)+(b*d)),f[a.Y]+j*(a.11.N.1b-k.P[i]),h*d,j*k.P[i],$.K({1u:k.1B},a.1T(k.1n+\' \'+k.P[i])))}},2o:7(a,b,c,d,e,f,g){6 h=a.V;G(h.Q){a.E.14(a.M,f[a.X]+f[a.W]/2,f[a.Y]+f[a.H]+h.1d,h.Q,{19:\'1j\'})}6 j=a.E.Z(a.M,\'V\',h.1D);6 k=a.E.Z(a.M,\'2L\',$.K({19:\'1j\'},h.1C));a.E.1h(j,f[a.X],f[a.Y]+f[a.H],f[a.X]+f[a.W],f[a.Y]+f[a.H]);G(h.I.16){6 l=a.22(h,17);O(6 i=1;i<c;i++){6 x=f[a.X]+g*(e/2+i*(b*d+e));a.E.1h(j,x,f[a.Y]+f[a.H]+l[0]*h.I.1f,x,f[a.Y]+f[a.H]+l[1]*h.I.1f)}O(6 i=0;i<c;i++){6 x=f[a.X]+g*(e/2+(i+0.5)*(b*d+e));a.E.14(k,x,f[a.Y]+f[a.H]+2*h.I.1f,(h.1i?h.1i[i]:\'\'+i))}}}});7 2K(){}$.K(2K.1r,{1q:7(){F\'3k 30 1m\'},1Z:7(){F\'1Y 20 1s 1F 26 3n 2q 3j \'+\'2F 2I 2c 1E 2H O 2R 3i.\'},24:7(){F D},1R:7(a){6 b=a.1K(17,17);6 c=a.1x();G(a.1l[0]&&a.V.I.16){a.1X(b,a.2e(),17,c,a.1l[0])}6 d=a.1g.27||10;6 e=a.1g.2a||10;6 f=a.U.J;6 g=(f?(a.U[0]).P.J:0);6 h=c[a.W]/((d+e)*g+e);6 i=c[a.H];4.1o=a.E.Z(a.M,\'1m\');4.3h(a,f,g,d,e,c,h,i);a.1M();a.E.14(a.M,0,0,1e.2m.28,{19:\'1j\',2l:\'2d(\'+(c[a.X]-a.11.1d)+\',\'+(c[a.Y]+c[a.H]/2)+\') 2j(-2i)\'});a.1I(a.2e(),\'11\',c[a.X],c[a.Y],c[a.X],c[a.Y]+c[a.H]);4.2o(a,g,d,e,c,h);a.1W()},3h:7(a,b,c,d,e,f,h,j){6 k=a.2A();6 l=[];O(6 i=0;i<c;i++){l[i]=0}O(6 s=0;s<b;s++){6 m=a.U[s];6 g=a.E.Z(4.1o,\'1P\'+s,$.K({1c:m.1p,1y:m.1w},m.1z||{}));O(6 i=0;i<m.P.J;i++){l[i]+=m.P[i];a.E.1J(g,f[a.X]+h*(e+i*(d+e)),f[a.Y]+j*(k[i]-l[i])/k[i],h*d,j*m.P[i]/k[i],$.K({1u:m.1B},a.1T(m.1n+\' \'+2t(m.P[i]/k[i]*2g,2)+\'%\')))}}},2o:7(a,b,c,d,e,f){6 g=a.V;G(g.Q){a.E.14(a.M,e[a.X]+e[a.W]/2,e[a.Y]+e[a.H]+g.1d,g.Q,{19:\'1j\'})}6 h=a.E.Z(a.M,\'V\',g.1D);6 j=a.E.Z(a.M,\'2L\',$.K({19:\'1j\'},g.1C));a.E.1h(h,e[a.X],e[a.Y]+e[a.H],e[a.X]+e[a.W],e[a.Y]+e[a.H]);G(g.I.16){6 k=a.22(g,17);O(6 i=1;i<b;i++){6 x=e[a.X]+f*(d/2+i*(c+d));a.E.1h(h,x,e[a.Y]+e[a.H]+k[0]*g.I.1f,x,e[a.Y]+e[a.H]+k[1]*g.I.1f)}O(6 i=0;i<b;i++){6 x=e[a.X]+f*(d/2+(i+0.5)*(c+d));a.E.14(j,x,e[a.Y]+e[a.H]+2*g.I.1f,(g.1i?g.1i[i]:\'\'+i))}}}});7 2U(){}$.K(2U.1r,{1q:7(){F\'2N 2G 1m\'},1Z:7(){F\'1Y 20 1s 1F 26 3g 3J 3m 3l 3B.\'},24:7(){F D},1R:7(a){6 b=a.1K(17,17);6 c=a.1x();a.1X(b,a.11,1O,c,a.1l[0]);6 d=a.1g.27||10;6 e=a.1g.2a||10;6 f=a.U.J;6 g=(f?(a.U[0]).P.J:0);6 h=c[a.W]/(a.11.N.1b-a.11.N.12);6 j=c[a.H]/((f*d+e)*g+e);4.1o=a.E.Z(a.M,\'1m\');O(6 i=0;i<f;i++){4.1H(a,i,f,d,e,c,h,j)}a.1M();4.2n(a,f,g,d,e,c,j);a.1W()},1H:7(a,b,c,d,e,f,h,j){6 k=a.U[b];6 g=a.E.Z(4.1o,\'1P\'+b,$.K({1c:k.1p,1y:k.1w},k.1z||{}));O(6 i=0;i<k.P.J;i++){a.E.1J(g,f[a.X]+h*(0-a.11.N.12),f[a.Y]+j*(e+i*(c*d+e)+(b*d)),h*k.P[i],j*d,$.K({1u:k.1B},a.1T(k.1n+\' \'+k.P[i])))}},2n:7(a,b,c,d,e,f,g){6 h=a.11;G(h){G(h.Q){a.E.14(a.M,f[a.X]+f[a.W]/2,f[a.Y]+f[a.H]+h.1d,h.Q,h.2w)}a.1I(h,\'V\',f[a.X],f[a.Y]+f[a.H],f[a.X]+f[a.W],f[a.Y]+f[a.H])}6 h=a.V;G(h.Q){a.E.14(a.M,0,0,h.Q,{19:\'1j\',2l:\'2d(\'+(f[a.X]-h.1d)+\',\'+(f[a.Y]+f[a.H]/2)+\') 2j(-2i)\'})}6 j=a.E.Z(a.M,\'11\',h.1D);6 k=a.E.Z(a.M,\'3f\',$.K({19:\'34\'},h.1C));a.E.1h(j,f[a.X],f[a.Y],f[a.X],f[a.Y]+f[a.H]);G(h.I.16){6 l=a.22(h,1O);O(6 i=1;i<c;i++){6 y=f[a.Y]+g*(e/2+i*(b*d+e));a.E.1h(j,f[a.X]+l[0]*h.I.1f,y,f[a.X]+l[1]*h.I.1f,y)}O(6 i=0;i<c;i++){6 y=f[a.Y]+g*(e/2+(i+0.5)*(b*d+e));a.E.14(k,f[a.X]-h.I.1f,y,(h.1i?h.1i[i]:\'\'+i))}}}});7 2E(){}$.K(2E.1r,{1q:7(){F\'3k 2G 1m\'},1Z:7(){F\'1Y 20 1s 1F 26 3g 2q 3j \'+\'2F 2I 2c 1E 2H O 2R 3i.\'},24:7(){F D},1R:7(a){6 b=a.1K(17,17);6 c=a.1x();G(a.1l[0]&&a.V.I.16){a.1X(b,a.2e(),1O,c,a.1l[0])}6 d=a.1g.27||10;6 e=a.1g.2a||10;6 f=a.U.J;6 g=(f?(a.U[0]).P.J:0);6 h=c[a.W];6 i=c[a.H]/((d+e)*g+e);4.1o=a.E.Z(a.M,\'1m\');4.3e(a,f,g,d,e,c,h,i);a.1M();a.E.14(a.M,c[a.X]+c[a.W]/2,c[a.Y]+c[a.H]+a.V.1d,1e.2m.28,{19:\'1j\'});a.1I(a.2e(),\'V\',c[a.X],c[a.Y]+c[a.H],c[a.X]+c[a.W],c[a.Y]+c[a.H]);4.3d(a,g,d,e,c,i);a.1W()},3e:7(a,b,c,d,e,f,h,j){6 k=a.2A();6 l=[];O(6 i=0;i<c;i++){l[i]=0}O(6 s=0;s<b;s++){6 m=a.U[s];6 g=a.E.Z(4.1o,\'1P\'+s,$.K({1c:m.1p,1y:m.1w},m.1z||{}));O(6 i=0;i<m.P.J;i++){a.E.1J(g,f[a.X]+h*l[i]/k[i],f[a.Y]+j*(e+i*(d+e)),h*m.P[i]/k[i],j*d,$.K({1u:m.1B},a.1T(m.1n+\' \'+2t(m.P[i]/k[i]*2g,2)+\'%\')));l[i]+=m.P[i]}}},3d:7(a,b,c,d,e,f){6 g=a.V;G(g.Q){a.E.14(a.M,0,0,g.Q,{19:\'1j\',2l:\'2d(\'+(e[a.X]-g.1d)+\',\'+(e[a.Y]+e[a.H]/2)+\') 2j(-2i)\'})}6 h=a.E.Z(a.M,\'11\',g.1D);6 j=a.E.Z(a.M,\'3f\',$.K({19:\'34\'},g.1C));a.E.1h(h,e[a.X],e[a.Y],e[a.X],e[a.Y]+e[a.H]);G(g.I.16){6 k=a.22(g,1O);O(6 i=1;i<b;i++){6 y=e[a.Y]+f*(d/2+i*(c+d));a.E.1h(h,e[a.X]+k[0]*g.I.1f,y,e[a.X]+k[1]*g.I.1f,y)}O(6 i=0;i<b;i++){6 y=e[a.Y]+f*(d/2+(i+0.5)*(c+d));a.E.14(j,e[a.X]-g.I.1f,y,(g.1i?g.1i[i]:\'\'+i))}}}});7 2D(){}$.K(2D.1r,{1q:7(){F\'2N 1h 1m\'},1Z:7(){F\'1Y 20 1s 1F 26 3I 3H.\'},24:7(){F[]},1R:7(a){a.1K();6 b=a.1x();6 c=b[a.W]/(a.V.N.1b-a.V.N.12);6 d=b[a.H]/(a.11.N.1b-a.11.N.12);4.1o=a.E.Z(a.M,\'1m\');O(6 i=0;i<a.U.J;i++){4.1H(a,i,b,c,d)}a.1M();a.2n();a.1W()},1H:7(a,b,c,d,e){6 f=a.U[b];6 g=a.E.3w();O(6 i=0;i<f.P.J;i++){6 x=c[a.X]+i*d;6 y=c[a.Y]+(a.11.N.1b-f.P[i])*e;G(i==0){g.3b(x,y)}3G{g.3a(x,y)}}a.E.3r(4.1o,g,$.K($.K({4F:\'1P\'+b,1u:\'3s\',1c:f.1p,1y:f.1w},a.1T(f.1n),f.1z||{})))}});7 38(){}$.K(38.1r,{3F:[\'37 (2b[]) - 4E 1s 4D 2c 37 2f 1s 1E 3D\',\'3C (2b) - 1E 3z 2c 4C 4B 4A 4z\',\'3y (2b) - 1E 3z 3o 4y O 4x 1F\'],1q:7(){F\'4w 1m\'},1Z:7(){F\'1Y 2F 4v 1s 1F 26 2I 2c 1E 2H.\'},24:7(){F 4.3F},1R:7(a){a.1K(17,17);4.1o=a.E.Z(a.M,\'1m\');6 b=a.1x();4.1H(a,b);a.1M();a.1W()},1H:7(a,b){6 c=a.2A();6 d=a.U.J;6 e=(d?(a.U[0]).P.J:0);6 f=a.E.3w();6 g=a.1g.37||[];6 h=a.1g.3C||10;6 l=(e<=1?0:a.1g.3y||10);6 m=(b[a.W]-(e*l)-l)/e/2;6 n=b[a.H]/2;6 o=13.12(m,n)-(g.J>0?h:0);6 p=a.E.Z(a.M,\'2L\',$.K({19:\'1j\'},a.V.1C));6 q=[];O(6 i=0;i<e;i++){6 r=b[a.X]+m+(i*(2*13.12(m,n)+l))+l;6 s=b[a.Y]+n;6 t=0;O(6 j=0;j<d;j++){6 u=a.U[j];G(i==0){q[j]=a.E.Z(4.1o,\'1P\'+j,$.K({1c:u.1p,1y:u.1w},u.1z||{}))}G(u.P[i]==0){4t}6 v=(t/c[i])*2*13.2C;t+=u.P[i];6 w=(t/c[i])*2*13.2C;6 z=1O;O(6 k=0;k<g.J;k++){G(g[k]==j){z=17;3c}}6 x=r+(z?h*13.33((v+w)/2):0);6 y=s+(z?h*13.32((v+w)/2):0);6 A=u.1n+\' \'+2t((w-v)/2/13.2C*2g,2)+\'%\';a.E.3r(q[j],f.4s().3b(x,y).3a(x+o*13.33(v),y+o*13.32(v)).4r(o,o,0,(w-v<13.2C?0:1),1,x+o*13.33(w),y+o*13.32(w)).4q(),$.K({1u:u.1B},a.1T(A)))}G(a.V){a.E.14(p,r,b[a.Y]+b[a.H]+a.V.1d,a.V.1i[i])}}}});7 2v(a){F(a.3A&&a.3A.3v().4p(/\\4o\\(\\)/))}1e.1U(\'30\',1k 2O());1e.1U(\'4n\',1k 2K());1e.1U(\'2G\',1k 2U());1e.1U(\'4m\',1k 2E());1e.1U(\'1h\',1k 2D());1e.1U(\'3D\',1k 38())})(4G)',62,291,'||||this||var|function|||||||||||||||||||||||||||||||||_root|return|if||_ticks|length|extend||_chartGroup|_scale|for|_values|_title||||_series|xAxis||||group||yAxis|min|Math|text||major|true|arguments|text_anchor|null|max|stroke|_titleOffset|svgGraphing|size|_chartOptions|line|_labels|middle|new|_gridlines|chart|_name|_chart|_stroke|title|prototype|of|legend|fill|typeof|_strokeWidth|_getDims|stroke_width|_settings|_drawGraph|_fill|_labelFormat|_lineFormat|the|values|_area|_drawSeries|_drawAxis|rect|_drawChartBackground|x2Axis|_drawTitle|y2Axis|false|series|minor|drawGraph|object|_showStatus|addChartType|_sampleSize|_drawLegend|_drawGridlines|Compare|description|sets|position|_getTickOffsets|_chartTypes|options||as|barWidth|percentageText|SVGGraphAxis|barGap|number|to|translate|_getPercentageAxis|out|100|offset|90|rotate|_onstatus|transform|region|_drawAxes|_drawXAxis|_width|bars|_drawNow|_chartType|roundNumber|_chartFormat|isArray|_titleFormat|_textSettings|_bgSettings|_show|_getTotals|settings|PI|SVGLineChart|SVGStackedRowChart|relative|row|whole|contributions|in|SVGStackedColumnChart|xAxisLabels|_height|Basic|SVGColumnChart|regional|parent|each|while|black|SVGRowChart|SVGGraphSeries|string|format|SVGGraphLegend|SVGGraphing|column|_percentageAxis|sin|cos|end|value|SVGGraph|explode|SVGPieChart|floor|lineTo|moveTo|break|_drawYAxis|_drawRows|yAxisLabels|horizontal|_drawColumns|category|showing|Stacked|grouped|with|vertical|between|firstChild|pow|path|none|labels|window|toString|createPath|both|pieGap|distance|constructor|categories|explodeDist|pie|graph|_options|else|lines|continuous|rows|Percentage|background|addExtension|appendChild|_svg|gap|bar|removeChild|width|status|round|redraw|textSettings|bgSettings|sampleSize|noDraw||area|show|svgManager|gray|valus|name|_axis|addSeries|chartTypes|green|gridlines|ticks|scale|_crossAt|onmouseout|chartArea|onmouseover|replace|chartFormat|chartOptions|chartType|stackedRow|stackedColumn|Array|match|close|arcTo|reset|continue|Labels|sizes|Pie|multiple|pies|section|exploded|an|move|sections|indexes|id|jQuery'.split('|'),0,{}))
\ No newline at end of file
diff --git a/src/public/javascripts/jquery-svg/lion.svg b/src/public/javascripts/jquery-svg/lion.svg
deleted file mode 100644
index 9414c8d..0000000
--- a/src/public/javascripts/jquery-svg/lion.svg
+++ /dev/null
@@ -1,161 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
-         "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg"
-     xmlns:xlink="http://www.w3.org/1999/xlink"
-     width="15cm" height="15cm">
-  <g transform="translate(100,10)">
-    <polygon fill="#f2cc99"
-             points=" 69,18 82,8 99,3 118,5 135,12 149,21 156,13 165,9 177,13 183,28 180,50 164,91 155,107 154,114 151,121 141,127 139,136 155,206 157,251 126,342 133,357 128,376 83,376 75,368 67,350 61,350 53,369 4,369 2,361 5,354 12,342 16,321 4,257 4,244 7,218 9,179 26,127 43,93 32,77 30,70 24,67 16,49 17,35 18,23 30,12 40,7 53,7 62,12"/>
-    <polygon fill="#e5b27f"
-             points=" 142,79 136,74 138,82 133,78 133,84 127,78 128,85 124,80 125,87 119,82 119,90 125,99 125,96 128,100 128,94 131,98 132,93 135,97 136,93 138,97 139,94 141,98 143,94 144,85"/>
-    <polygon fill="#eb8080"
-             points=" 127,101 132,100 137,99 144,101 143,105 135,110"/>
-    <polygon fill="#f2cc99"
-             points=" 178,229 157,248 139,296 126,349 137,356 158,357 183,342 212,332 235,288 235,261 228,252 212,250 188,251"/>
-    <g fill="#9c826b">
-      <polygon points=" 56,229 48,241 48,250 57,281 63,325 71,338 81,315 76,321 79,311 83,301 75,308 80,298 73,303 76,296 71,298 74,292 69,293 74,284 78,278 71,278 74,274 68,273 70,268 66,267 68,261 60,266 62,259 65,253 57,258 59,251 55,254 55,248 60,237 54,240 58,234 54,236"/>
-      <polygon points=" 74,363 79,368 81,368 85,362 89,363 92,370 96,373 101,372 108,361 110,371 113,373 116,371 120,358 122,363 123,371 126,371 129,367 132,357 135,361 130,376 127,377 94,378 84,376 76,371"/>
-      <polygon points=" 212,250 219,251 228,258 236,270 235,287 225,304 205,332 177,343 171,352 158,357 166,352 168,346 168,339 165,333 155,327 155,323 161,320 165,316 169,316 167,312 171,313 168,308 173,309 170,306 177,306 175,308 177,311 174,311 176,316 171,315 174,319 168,320 168,323 175,327 179,332 183,326 184,332 189,323 190,328 194,320 194,325 199,316 201,320 204,313 206,316 208,310 211,305 219,298 226,288 229,279 228,266 224,259 217,253"/>
-      <polygon points=" 151,205 151,238 149,252 141,268 128,282 121,301 130,300 126,313 118,324 116,337 120,346 133,352 133,340 137,333 145,329 156,327 153,319 153,291 157,271 170,259 178,277 193,250 174,216"/>
-      <polygon points=" 78,127 90,142 95,155 108,164 125,167 139,175 150,206 152,191 141,140 121,148 100,136"/>
-      <polygon points=" 21,58 35,63 38,68 32,69 42,74 40,79 47,80 54,83 45,94 34,81 32,73 24,66"/>
-      <polygon points=" 71,34 67,34 66,27 59,24 54,17 48,17 39,22 30,26 28,31 31,39 38,46 29,45 36,54 41,61 41,70 50,69 54,71 55,58 67,52 76,43 76,39 68,44"/>
-      <polygon points=" 139,74 141,83 143,89 144,104 148,104 155,106 154,86 157,77 155,72 150,77 144,77"/>
-      <polygon points=" 105,44 102,53 108,58 111,62 112,55"/>
-      <polygon points=" 141,48 141,54 144,58 139,62 137,66 136,59 137,52"/>
-      <polygon points=" 98,135 104,130 105,134 108,132 108,135 112,134 113,137 116,136 116,139 119,139 124,141 128,140 133,138 140,133 139,140 126,146 104,144"/>
-      <polygon points=" 97,116 103,119 103,116 111,118 116,117 122,114 127,107 135,111 142,107 141,114 145,118 149,121 145,125 140,124 127,121 113,125 100,124"/>
-      <polygon points=" 147,33 152,35 157,34 153,31 160,31 156,28 161,28 159,24 163,25 163,21 165,22 170,23 167,17 172,21 174,18 175,23 176,22 177,28 177,33 174,37 176,39 174,44 171,49 168,53 164,57 159,68 156,70 154,60 150,51 146,43 144,35"/>
-      <polygon points=" 85,72 89,74 93,75 100,76 105,75 102,79 94,79 88,76"/>
-      <polygon points=" 86,214 79,221 76,232 82,225 78,239 82,234 78,245 81,243 79,255 84,250 84,267 87,254 90,271 90,257 95,271 93,256 95,249 92,252 93,243 89,253 89,241 86,250 87,236 83,245 87,231 82,231 90,219 84,221"/>
-    </g>
-    <g fill="#ffcc7f">
-      <polygon points=" 93,68 96,72 100,73 106,72 108,66 105,63 100,62"/>
-      <polygon points=" 144,64 142,68 142,73 146,74 150,73 154,64 149,62"/>
-    </g>
-    <g fill="#9c826b">
-      <polygon points=" 57,91 42,111 52,105 41,117 53,112 46,120 53,116 50,124 57,119 55,127 61,122 60,130 67,126 66,134 71,129 72,136 77,130 76,137 80,133 82,138 86,135 96,135 94,129 86,124 83,117 77,123 79,117 73,120 75,112 68,116 71,111 65,114 69,107 63,110 68,102 61,107 66,98 61,103 63,97 57,99"/>
-      <polygon points=" 83,79 76,79 67,82 75,83 65,88 76,87 65,92 76,91 68,96 77,95 70,99 80,98 72,104 80,102 76,108 85,103 92,101 87,98 93,96 86,94 91,93 85,91 93,89 99,89 105,93 107,85 102,82 92,80"/>
-      <polygon points=" 109,77 111,83 109,89 113,94 117,90 117,81 114,78"/>
-      <polygon points=" 122,128 127,126 134,127 136,129 134,130 130,128 124,129"/>
-      <polygon points=" 78,27 82,32 80,33 82,36 78,37 82,40 78,42 81,46 76,47 78,49 74,50 82,52 87,50 83,48 91,46 86,45 91,42 88,40 92,37 86,34 90,31 86,29 89,26"/>
-      <polygon points=" 82,17 92,20 79,21 90,25 81,25 94,28 93,26 101,30 101,26 107,33 108,28 111,40 113,34 115,45 117,39 119,54 121,46 124,58 126,47 129,59 130,49 134,58 133,44 137,48 133,37 137,40 133,32 126,20 135,26 132,19 138,23 135,17 142,18 132,11 116,6 94,6 78,11 92,12 80,14 90,16"/>
-      <polygon points=" 142,234 132,227 124,223 115,220 110,225 118,224 127,229 135,236 122,234 115,237 113,242 121,238 139,243 121,245 111,254 95,254 102,244 104,235 110,229 100,231 104,224 113,216 122,215 132,217 141,224 145,230 149,240"/>
-      <polygon points=" 115,252 125,248 137,249 143,258 134,255 125,254"/>
-      <polygon points=" 114,212 130,213 140,219 147,225 144,214 137,209 128,207"/>
-      <polygon points=" 102,263 108,258 117,257 131,258 116,260 109,265"/>
-      <polygon points=" 51,241 35,224 40,238 23,224 31,242 19,239 28,247 17,246 25,250 37,254 39,263 44,271 47,294 48,317 51,328 60,351 60,323 53,262 47,246"/>
-      <polygon points=" 2,364 9,367 14,366 18,355 20,364 26,366 31,357 35,364 39,364 42,357 47,363 53,360 59,357 54,369 7,373"/>
-      <polygon points=" 7,349 19,345 25,339 18,341 23,333 28,326 23,326 27,320 23,316 25,311 20,298 15,277 12,264 9,249 10,223 3,248 5,261 15,307 17,326 11,343"/>
-      <polygon points=" 11,226 15,231 25,236 18,227"/>
-      <polygon points=" 13,214 19,217 32,227 23,214 16,208 15,190 24,148 31,121 24,137 14,170 8,189"/>
-      <polygon points=" 202,254 195,258 199,260 193,263 197,263 190,268 196,268 191,273 188,282 200,272 194,272 201,266 197,265 204,262 200,258 204,256"/>
-    </g>
-    <g fill="#845433">
-      <polygon points=" 151,213 165,212 179,225 189,246 187,262 179,275 176,263 177,247 171,233 163,230 165,251 157,264 146,298 145,321 133,326 143,285 154,260 153,240"/>
-      <polygon points=" 91,132 95,145 97,154 104,148 107,155 109,150 111,158 115,152 118,159 120,153 125,161 126,155 133,164 132,154 137,163 137,152 142,163 147,186 152,192 148,167 141,143 124,145 105,143"/>
-    </g>
-    <g fill="#9c826b">
-      <polygon points=" 31,57 23,52 26,51 20,44 23,42 21,36 22,29 25,23 24,32 30,43 26,41 30,50 26,48"/>
-      <polygon points=" 147,21 149,28 155,21 161,16 167,14 175,15 173,11 161,9"/>
-      <polygon points=" 181,39 175,51 169,57 171,65 165,68 165,75 160,76 162,91 171,71 180,51"/>
-      <polygon points=" 132,346 139,348 141,346 142,341 147,342 143,355 133,350"/>
-      <polygon points=" 146,355 151,352 155,348 157,343 160,349 151,356 147,357"/>
-      <polygon points=" 99,266 100,281 94,305 86,322 78,332 72,346 73,331 91,291"/>
-      <polygon points=" 20,347 32,342 45,340 54,345 45,350 42,353 38,350 31,353 29,356 23,350 19,353 15,349"/>
-      <polygon points=" 78,344 86,344 92,349 88,358 84,352"/>
-      <polygon points=" 93,347 104,344 117,345 124,354 121,357 116,351 112,351 108,355 102,351"/>
-    </g>
-    <g fill="#000000">
-      <polygon points=" 105,12 111,18 113,24 113,29 119,34 116,23 112,16"/>
-      <polygon points=" 122,27 125,34 127,43 128,34 125,29"/>
-      <polygon points=" 115,13 122,19 122,15 113,10"/>
-    </g>
-    <g fill="#ffe5b2">
-      <polygon points=" 116,172 107,182 98,193 98,183 90,199 89,189 84,207 88,206 87,215 95,206 93,219 91,230 98,216 97,226 104,214 112,209 104,208 113,202 126,200 139,207 132,198 142,203 134,192 142,195 134,187 140,185 130,181 136,177 126,177 125,171 116,180"/>
-      <polygon points=" 74,220 67,230 67,221 59,235 63,233 60,248 70,232 65,249 71,243 67,256 73,250 69,262 73,259 71,267 76,262 72,271 78,270 76,275 82,274 78,290 86,279 86,289 92,274 88,275 87,264 82,270 82,258 77,257 78,247 73,246 77,233 72,236"/>
-      <polygon points=" 133,230 147,242 148,250 145,254 138,247 129,246 142,245 138,241 128,237 137,238"/>
-      <polygon points=" 133,261 125,261 116,263 111,267 125,265"/>
-      <polygon points=" 121,271 109,273 103,279 99,305 92,316 85,327 83,335 89,340 97,341 94,336 101,336 96,331 103,330 97,327 108,325 99,322 109,321 100,318 110,317 105,314 110,312 107,310 113,308 105,306 114,303 105,301 115,298 107,295 115,294 108,293 117,291 109,289 117,286 109,286 118,283 112,281 118,279 114,278 119,276 115,274"/>
-      <polygon points=" 79,364 74,359 74,353 76,347 80,351 83,356 82,360"/>
-      <polygon points=" 91,363 93,356 97,353 103,355 105,360 103,366 99,371 94,368"/>
-      <polygon points=" 110,355 114,353 118,357 117,363 113,369 111,362"/>
-      <polygon points=" 126,354 123,358 124,367 126,369 129,361 129,357"/>
-      <polygon points=" 30,154 24,166 20,182 23,194 29,208 37,218 41,210 41,223 46,214 46,227 52,216 52,227 61,216 59,225 68,213 73,219 70,207 77,212 69,200 77,202 70,194 78,197 68,187 76,182 64,182 58,175 58,185 53,177 50,186 46,171 44,182 39,167 36,172 36,162 30,166"/>
-      <polygon points=" 44,130 41,137 45,136 43,150 48,142 48,157 53,150 52,164 60,156 61,169 64,165 66,175 70,167 74,176 77,168 80,183 85,172 90,182 93,174 98,181 99,173 104,175 105,169 114,168 102,163 95,157 94,166 90,154 87,162 82,149 75,159 72,148 68,155 67,143 62,148 62,138 58,145 56,133 52,142 52,128 49,134 47,125"/>
-      <polygon points=" 13,216 19,219 36,231 22,223 16,222 22,227 12,224 13,220 16,220"/>
-      <polygon points=" 10,231 14,236 25,239 27,237 19,234"/>
-      <polygon points=" 9,245 14,242 25,245 13,245"/>
-      <polygon points=" 33,255 26,253 18,254 25,256 18,258 27,260 18,263 27,265 19,267 29,270 21,272 29,276 21,278 30,281 22,283 31,287 24,288 32,292 23,293 34,298 26,299 37,303 32,305 39,309 33,309 39,314 34,314 40,318 34,317 40,321 34,321 41,326 33,326 40,330 33,332 39,333 33,337 42,337 54,341 49,337 52,335 47,330 50,330 45,325 49,325 45,321 48,321 45,316 46,306 45,286 43,274 36,261"/>
-      <polygon points=" 7,358 9,351 14,351 17,359 11,364"/>
-      <polygon points=" 44,354 49,351 52,355 49,361"/>
-      <polygon points=" 32,357 37,353 40,358 36,361"/>
-      <polygon points=" 139,334 145,330 154,330 158,334 154,341 152,348 145,350 149,340 147,336 141,339 139,345 136,342 136,339"/>
-      <polygon points=" 208,259 215,259 212,255 220,259 224,263 225,274 224,283 220,292 208,300 206,308 203,304 199,315 197,309 195,318 193,313 190,322 190,316 185,325 182,318 180,325 172,321 178,320 176,313 186,312 180,307 188,307 184,303 191,302 186,299 195,294 187,290 197,288 192,286 201,283 194,280 203,277 198,275 207,271 200,269 209,265 204,265 212,262"/>
-      <polygon points=" 106,126 106,131 109,132 111,134 115,132 115,135 119,133 118,137 123,137 128,137 133,134 136,130 136,127 132,124 118,128 112,128 106,126 106,126 106,126"/>
-      <polygon points=" 107,114 101,110 98,102 105,97 111,98 119,102 121,108 118,112 113,115"/>
-      <polygon points=" 148,106 145,110 146,116 150,118 152,111 151,107"/>
-      <polygon points=" 80,55 70,52 75,58 63,57 72,61 57,61 67,66 57,67 62,69 54,71 61,73 54,77 63,78 53,85 60,84 56,90 69,84 63,82 75,76 70,75 77,72 72,71 78,69 72,66 81,67 78,64 82,63 80,60 86,62"/>
-      <polygon points=" 87,56 91,52 96,50 102,56 98,56 92,60"/>
-      <polygon points=" 85,68 89,73 98,76 106,74 96,73 91,70"/>
-      <polygon points=" 115,57 114,64 111,64 115,75 122,81 122,74 126,79 126,74 131,78 130,72 133,77 131,68 126,61 119,57"/>
-      <polygon points=" 145,48 143,53 147,59 151,59 150,55"/>
-      <polygon points=" 26,22 34,15 43,10 52,10 59,16 47,15 32,22"/>
-      <polygon points=" 160,19 152,26 149,34 154,33 152,30 157,30 155,26 158,27 157,23 161,23"/>
-    </g>
-    <g fill="#000000">
-      <polygon points=" 98,117 105,122 109,122 105,117 113,120 121,120 130,112 128,108 123,103 123,99 128,101 132,106 135,109 142,105 142,101 145,101 145,91 148,101 145,105 136,112 135,116 143,124 148,120 150,122 142,128 133,122 121,125 112,126 103,125 100,129 96,124"/>
-      <polygon points=" 146,118 152,118 152,115 149,115"/>
-      <polygon points=" 148,112 154,111 154,109 149,109"/>
-      <polygon points=" 106,112 108,115 114,116 118,114"/>
-      <polygon points=" 108,108 111,110 116,110 119,108"/>
-      <polygon points=" 106,104 109,105 117,106 115,104"/>
-      <polygon points=" 50,25 41,26 34,33 39,43 49,58 36,51 47,68 55,69 54,59 61,57 74,46 60,52 67,42 57,48 61,40 54,45 60,36 59,29 48,38 52,30 47,32"/>
-      <polygon points=" 147,34 152,41 155,49 161,53 157,47 164,47 158,43 168,44 159,40 164,37 169,37 164,33 169,34 165,28 170,30 170,25 173,29 175,27 176,32 173,36 175,39 172,42 172,46 168,49 170,55 162,57 158,63 155,58 153,50 149,46"/>
-      <polygon points=" 155,71 159,80 157,93 157,102 155,108 150,101 149,93 154,101 152,91 151,83 155,79"/>
-      <polygon points=" 112,78 115,81 114,91 112,87 113,82"/>
-      <polygon points=" 78,28 64,17 58,11 47,9 36,10 28,16 21,26 18,41 20,51 23,61 33,65 28,68 37,74 36,81 43,87 48,90 43,100 40,98 39,90 31,80 30,72 22,71 17,61 14,46 16,28 23,17 33,9 45,6 54,6 65,12"/>
-      <polygon points=" 67,18 76,9 87,5 101,2 118,3 135,8 149,20 149,26 144,19 132,12 121,9 105,7 89,8 76,14 70,20"/>
-      <polygon points=" 56,98 48,106 56,103 47,112 56,110 52,115 57,113 52,121 62,115 58,123 65,119 63,125 69,121 68,127 74,125 74,129 79,128 83,132 94,135 93,129 85,127 81,122 76,126 75,121 71,124 71,117 66,121 66,117 62,117 64,112 60,113 60,110 57,111 61,105 57,107 60,101 55,102"/>
-      <polygon points=" 101,132 103,138 106,134 106,139 112,136 111,142 115,139 114,143 119,142 125,145 131,142 135,138 140,134 140,129 143,135 145,149 150,171 149,184 145,165 141,150 136,147 132,151 131,149 126,152 125,150 121,152 117,148 111,152 110,148 105,149 104,145 98,150 96,138 94,132 94,130 98,132"/>
-      <polygon points=" 41,94 32,110 23,132 12,163 6,190 7,217 5,236 3,247 9,230 12,211 12,185 18,160 26,134 35,110 43,99"/>
-      <polygon points=" 32,246 41,250 50,257 52,267 53,295 53,323 59,350 54,363 51,365 44,366 42,360 40,372 54,372 59,366 62,353 71,352 75,335 73,330 66,318 68,302 64,294 67,288 63,286 63,279 59,275 58,267 56,262 50,247 42,235 44,246 32,236 35,244"/>
-      <polygon points=" 134,324 146,320 159,322 173,327 179,337 179,349 172,355 158,357 170,350 174,343 170,333 163,328 152,326 134,329"/>
-      <polygon points=" 173,339 183,334 184,338 191,329 194,332 199,323 202,325 206,318 209,320 213,309 221,303 228,296 232,289 234,279 233,269 230,262 225,256 219,253 208,252 198,252 210,249 223,250 232,257 237,265 238,277 238,291 232,305 221,323 218,335 212,342 200,349 178,348"/>
-      <polygon points=" 165,296 158,301 156,310 156,323 162,324 159,318 162,308 162,304"/>
-      <polygon points=" 99,252 105,244 107,234 115,228 121,228 131,235 122,233 113,235 109,246 121,239 133,243 121,243 110,251"/>
-      <polygon points=" 117,252 124,247 134,249 136,253 126,252"/>
-      <polygon points=" 117,218 132,224 144,233 140,225 132,219 117,218 117,218 117,218"/>
-      <polygon points=" 122,212 134,214 143,221 141,213 132,210"/>
-      <polygon points=" 69,352 70,363 76,373 86,378 97,379 108,379 120,377 128,378 132,373 135,361 133,358 132,366 127,375 121,374 121,362 119,367 117,374 110,376 110,362 107,357 106,371 104,375 97,376 90,375 90,368 86,362 83,364 86,369 85,373 78,370 73,362 71,351"/>
-      <polygon points=" 100,360 96,363 99,369 102,364"/>
-      <polygon points=" 115,360 112,363 114,369 117,364"/>
-      <polygon points=" 127,362 125,364 126,369 128,365"/>
-      <polygon points=" 5,255 7,276 11,304 15,320 13,334 6,348 2,353 0,363 5,372 12,374 25,372 38,372 44,369 42,367 36,368 31,369 30,360 27,368 20,370 16,361 15,368 10,369 3,366 3,359 6,352 11,348 17,331 19,316 12,291 9,274"/>
-      <polygon points=" 10,358 7,362 10,366 11,362"/>
-      <polygon points=" 25,357 22,360 24,366 27,360"/>
-      <polygon points=" 37,357 34,361 36,365 38,361"/>
-      <polygon points=" 49,356 46,359 47,364 50,360"/>
-      <polygon points=" 130,101 132,102 135,101 139,102 143,103 142,101 137,100 133,100"/>
-      <polygon points=" 106,48 105,52 108,56 109,52"/>
-      <polygon points=" 139,52 139,56 140,60 142,58 141,56"/>
-      <polygon points=" 25,349 29,351 30,355 33,350 37,348 42,351 45,347 49,345 44,343 36,345"/>
-      <polygon points=" 98,347 105,351 107,354 109,349 115,349 120,353 118,349 113,346 104,346"/>
-      <polygon points=" 83,348 87,352 87,357 89,351 87,348"/>
-      <polygon points=" 155,107 163,107 170,107 186,108 175,109 155,109"/>
-      <polygon points=" 153,114 162,113 175,112 192,114 173,114 154,115"/>
-      <polygon points=" 152,118 164,120 180,123 197,129 169,123 151,120"/>
-      <polygon points=" 68,109 87,106 107,106 106,108 88,108"/>
-      <polygon points=" 105,111 95,112 79,114 71,116 85,115 102,113"/>
-      <polygon points=" 108,101 98,99 87,99 78,99 93,100 105,102"/>
-      <polygon points=" 85,63 91,63 97,60 104,60 108,62 111,69 112,75 110,74 108,71 103,73 106,69 105,65 103,64 103,67 102,70 99,70 97,66 94,67 97,72 88,67 84,66"/>
-      <polygon points=" 140,74 141,66 144,61 150,61 156,62 153,70 150,73 152,65 150,65 151,68 149,71 146,71 144,66 143,70 143,74"/>
-      <polygon points=" 146,20 156,11 163,9 172,9 178,14 182,18 184,32 182,42 182,52 177,58 176,67 171,76 165,90 157,105 160,92 164,85 168,78 167,73 173,66 172,62 175,59 174,55 177,53 180,46 181,29 179,21 173,13 166,11 159,13 153,18 148,23"/>
-      <polygon points=" 150,187 148,211 150,233 153,247 148,267 135,283 125,299 136,292 131,313 122,328 122,345 129,352 133,359 133,367 137,359 148,356 140,350 131,347 129,340 132,332 140,328 137,322 140,304 154,265 157,244 155,223 161,220 175,229 186,247 185,260 176,275 178,287 185,277 188,261 196,253 189,236 174,213"/>
-      <polygon points=" 147,338 142,341 143,345 141,354 147,343"/>
-      <polygon points=" 157,342 156,349 150,356 157,353 163,346 162,342"/>
-      <polygon points=" 99,265 96,284 92,299 73,339 73,333 87,300"/>
-    </g>
-  </g>
-</svg>
diff --git a/src/public/javascripts/jquery-svg/test.js b/src/public/javascripts/jquery-svg/test.js
deleted file mode 100644
index 27f0dda..0000000
--- a/src/public/javascripts/jquery-svg/test.js
+++ /dev/null
@@ -1,714 +0,0 @@
-// Demonstrate an onLoad callback to initialise a canvas
-function drawIntro() {
-	var svg = svgManager.getSVGFor('#cool_graph');
-	svg.circle(null, 75, 75, 50, {fill: 'none', stroke: 'red', stroke_width: 3});
-	var g = svg.group(null, {stroke: 'black', stroke_width: 2});
-	svg.line(g, 15, 75, 135, 75);
-	svg.line(g, 75, 15, 75, 135);
-}
-
-// -----------------------------------------------------------------------------
-
-var svgSpec = 'http://www.w3c.org/TR/SVG11/';
-// SVG examples
-var examples = [
-	['Basic shapes', basicShapesDemo,
-	'SVG provides for the creation of several basic shapes, including ' +
-	'rectangles, rectangles with rounded corners, circles, ellipses, ' +
-	'lines segments, polygonal lines, and closed polygons. ' +
-	'Each shape may be drawn with its own fill and border colourings. ' +
-	'Shapes may be moved and rotated via the transformation abilities of SVG. ' +
-	'Grouping elements allows common attributes to be easily applied.<br/>' +
-	'See the original documents: <a href="http://www.w3.org/TR/SVG11/images/shapes/rect01.svg" target="_blank">rectangle</a>, ' +
-	'<a href="http://www.w3.org/TR/SVG11/images/shapes/rect02.svg" target="_blank">rounded rectangle</a>, ' +
-	'<a href="http://www.w3.org/TR/SVG11/images/shapes/circle01.svg" target="_blank">circle</a>, ' +
-	'<a href="http://www.w3.org/TR/SVG11/images/shapes/ellipse01.svg" target="_blank">ellipse</a>, ' +
-	'<a href="http://www.w3.org/TR/SVG11/images/shapes/line01.svg" target="_blank">line</a>, ' +
-	'<a href="http://www.w3.org/TR/SVG11/images/shapes/polyline01.svg" target="_blank">polyline</a>, ' +
-	'and <a href="http://www.w3.org/TR/SVG11/images/shapes/polygon01.svg" target="_blank">polygon</a>.',
-	'<rect x="20" y="50" width="100" height="50"\r\n' +
-	'    fill="yellow" stroke="navy" stroke-width="5"  />\r\n' +
-	'<rect x="150" y="50" width="100" height="50" rx="10"\r\n' +
-	'    fill="green" />\r\n' +
-	'<g transform="translate(270 80) rotate(-30)">\r\n' +
-	'  <rect x="0" y="0" width="100" height="500" rx="10"\r\n' +
-	'      fill="none" stroke="purple" stroke-width="3" />\r\n' +
-	'</g>\r\n' +
-	'<circle cx="70" cy="220" r="50"\r\n' +
-	'    fill="red" stroke="blue" stroke-width="5"  />\r\n' +
-	'<g transform="translate(175 220)">\r\n' +
-	'  <ellipse rx="75" ry="50" fill="red"  />\r\n' +
-	'</g>\r\n' +
-	'<ellipse transform="translate(300 220) rotate(-30)"\r\n' +
-	'    rx="75" ry="50" fill="none" stroke="blue" stroke-width="10"  />\r\n' +
-	'<g stroke="green" >\r\n' +
-	'  <line x1="450" y1="120" x2="550" y2="20" stroke-width="5"  />\r\n' +
-	'  <line x1="550" y1="120" x2="650" y2="20" stroke-width="10"  />\r\n' +
-	'  <line x1="650" y1="120" x2="750" y2="20" stroke-width="15"  />\r\n' +
-	'  <line x1="750" y1="120" x2="850" y2="20" stroke-width="20"  />\r\n' +
-	'  <line x1="850" y1="120" x2="950" y2="20" stroke-width="25"  />\r\n' +
-	'</g>\r\n' +
-	'<polyline fill="none" stroke="blue" stroke-width="5" \r\n' +
-	'    points="450,250\r\n' +
-	'            475,250 475,220 500,220 500,250\r\n' +
-	'            525,250 525,200 550,200 550,250\r\n' +
-	'            575,250 575,180 600,180 600,250\r\n' +
-	'            625,250 625,160 650,160 650,250\r\n' +
-	'            675,250" />\r\n' +
-	'<polygon fill="lime" stroke="blue" stroke-width="10" \r\n' +
-	'    points="800,150 900,180 900,240 800,270 700,240 700,180" />'],
-	
-	['Filters', filterDemo,
-	'This example relies on the <i>filter</i> extension for the SVG plugin.<br/>' +
-	'1.  Filter primitive \'feGaussianBlur\' takes input SourceAlpha, ' +
-	'which is the alpha channel of the source graphic. The result is ' +
-	'stored in a temporary buffer named "blur". Note that "blur" is ' +
-	'used as input to both filter primitives 2 and 3.<br/>' +
-	'2. Filter primitive \'feOffset\' takes buffer "blur", shifts the ' +
-	'result in a positive direction in both x and y, and creates a new ' +
-	'buffer named "offsetBlur". The effect is that of a drop shadow.<br/>' +
-	'3. Filter primitive \'feSpecularLighting\', uses buffer "blur" as a ' +
-	'model of a surface elevation and generates a lighting effect from a ' +
-	'single point source. The result is stored in buffer "specOut".<br/>' +
-	'4. Filter primitive \'feComposite\' masks out the result of filter ' +
-	'primitive 3 by the original source graphics alpha channel so that ' +
-	'the intermediate result is no bigger than the original source graphic.<br/>' +
-	'5. Filter primitive \'feComposite\' composites the result of the ' +
-	'specular lighting with the original source graphic.<br/>' +
-	'6. Filter primitive \'feMerge\' composites two layers together. ' +
-	'The lower layer consists of the drop shadow result from filter primitive 2. ' +
-	'The upper layer consists of the specular lighting result from filter primitive 5.<br/>' +
-	'See the <a href="http://www.w3.org/TR/SVG11/images/filters/filters01.svg" target="_blank">original document</a>.',
-	'<desc>An example which combines multiple filter primitives\r\n' +
-	'    to produce a 3D lighting effect on a graphic consisting\r\n' +
-	'    of the string "SVG" sitting on top of oval filled in red\r\n' +
-	'    and surrounded by an oval outlined in red.</desc>\r\n' +
-	'<defs>\r\n' +
-	'  <filter id="MyFilter" filterUnits="userSpaceOnUse" x="0" y="0" width="200" height="120">\r\n' +
-	'    <feGaussianBlur in="SourceAlpha" stdDeviation="4" result="blur"/>\r\n' +
-	'    <feOffset in="blur" dx="4" dy="4" result="offsetBlur"/>\r\n' +
-	'    <feSpecularLighting in="blur" surfaceScale="5" specularConstant=".75" \r\n' +
-	'        specularExponent="20" lighting-color="#bbbbbb"  \r\n' +
-	'        result="specOut">\r\n' +
-	'      <fePointLight x="-5000" y="-10000" z="20000"/>\r\n' +
-	'    </feSpecularLighting>\r\n' +
-	'    <feComposite in="specOut" in2="SourceAlpha" operator="in" result="specOut"/>\r\n' +
-	'    <feComposite in="SourceGraphic" in2="specOut" operator="arithmetic" \r\n' +
-	'        k1="0" k2="1" k3="1" k4="0" result="litPaint"/>\r\n' +
-	'    <feMerge>\r\n' +
-	'      <feMergeNode in="offsetBlur"/>\r\n' +
-	'      <feMergeNode in="litPaint"/>\r\n' +
-	'    </feMerge>\r\n' +
-	'  </filter>\r\n' +
-	'</defs>\r\n' +
-	'<rect x="1" y="1" width="198" height="118" fill="#888888" stroke="blue" />\r\n' +
-	'<g filter="url(#MyFilter)" >\r\n' +
-	'  <g>\r\n' +
-	'    <path fill="none" stroke="#D90000" stroke-width="10" \r\n' +
-	'        d="M50,90 C0,90 0,30 50,30 L150,30 C200,30 200,90 150,90 z" />\r\n' +
-	'    <path fill="#D90000" \r\n' +
-	'        d="M60,80 C30,80 30,40 60,40 L140,40 C170,40 170,80 140,80 z" />\r\n' +
-	'    <g fill="#FFFFFF" stroke="black" font-size="45" font-family="Verdana" >\r\n' +
-	'      <text x="52" y="76">SVG</text>\r\n' +
-	'    </g>\r\n' +
-	'  </g>\r\n' +
-	'</g>'],
-	
-	['Gradients and Patterns', gradientPatternDemo,
-	'Shows how to fill a rectangle by referencing a radial gradient paint server.<br/>' +
-	'Shows how to fill a rectangle by referencing a pattern paint server. ' +
-	'Note how the blue stroke of each triangle has been clipped at the top and the left. ' +
-	'This is due to SVG\'s user agent style sheet setting the \'overflow\' property ' +
-	'for \'pattern\' elements to hidden, which causes the pattern to be clipped to ' +
-	'the bounds of the pattern tile.<br/>' +
-	'See the original documents: <a href="http://www.w3.org/TR/SVG11/images/pservers/radgrad01.svg" target="_blank">gradient</a> ' +
-	'and <a href="http://www.w3.org/TR/SVG11/images/pservers/pattern01.svg" target="_blank">pattern</a>.',
-	'<desc>Example radgrad01 - fill a rectangle by referencing a\r\n' +
-	'    radial gradient paint server</desc>\r\n' +
-	'<g>\r\n' +
-	'  <defs>\r\n' +
-	'    <radialGradient id="MyGradient" gradientUnits="userSpaceOnUse"\r\n' +
-	'        cx="200" cy="100" r="150" fx="200" fy="100">\r\n' +
-	'      <stop offset="0%" stop-color="red" />\r\n' +
-	'      <stop offset="50%" stop-color="blue" />\r\n' +
-	'      <stop offset="100%" stop-color="red" />\r\n' +
-	'    </radialGradient>\r\n' +
-	'  </defs>\r\n' +
-	'  <!-- The rectangle is filled using a radial gradient paint server -->\r\n' +
-	'  <rect fill="url(#MyGradient)" stroke="black" stroke-width="5"\r\n' +
-	'      x="50" y="50" width="300" height="100"/>\r\n' +
-	'</g>\r\n' + 
-	'<g>\r\n' +
-	'  <defs>\r\n' +
-	'    <pattern id="TrianglePattern" patternUnits="userSpaceOnUse"\r\n' +
-	'        x="0" y="0" width="100" height="100" viewBox="0 0 10 10" >\r\n' +
-	'      <path d="M 0 0 L 7 0 L 3.5 7 z" fill="red" stroke="blue" />\r\n' +
-	'    </pattern> \r\n' +
-	'  </defs>\r\n' +
-	'  <!-- The ellipse is filled using a triangle pattern paint server\r\n' +
-	'       and stroked with black -->\r\n' +
-	'  <ellipse fill="url(#TrianglePattern)" stroke="black" stroke-width="5"  \r\n' +
-	'      cx="550" cy="100" rx="175" ry="75" />\r\n' +
-	'</g>'],
-	
-	['Interactivity', interactiveDemo,
-	'This example defines a function <code>circle_click</code> which is called ' +
-	'by the onclick event attribute on the \'circle\' element. Each click toggles ' +
-	'the circle\'s size between small and large.<br/>' +
-	'See the <a href="http://www.w3.org/TR/SVG11/images/script/script01.svg" target="_blank">original document</a>.',
-	'<desc>Example script01 - invoke an ECMAScript function from an onclick event\r\n' +
-	'</desc>\r\n' +
-	'<!-- ECMAScript to change the radius with each click -->\r\n' +
-	'<script type="text/ecmascript"> <![CDATA[\r\n' +
-	'  function circle_click(evt) {\r\n' +
-	'    var circle = evt.target;\r\n' +
-	'    var currentRadius = circle.getAttribute("r");\r\n' +
-	'    if (currentRadius == 100)\r\n' +
-	'      circle.setAttribute("r", currentRadius*2);\r\n' +
-	'    else\r\n' +
-	'      circle.setAttribute("r", currentRadius*0.5);\r\n' +
-	'  }\r\n' +
-	']]> </script>\r\n' +
-	'<!-- Act on each click event -->\r\n' +
-	'<circle onclick="circle_click(evt)" cx="300" cy="150" r="100"\r\n' +
-	'    fill="red"/>\r\n' +
-	'<text x="300" y="280" \r\n' +
-	'    font-family="Verdana" font-size="35" text-anchor="middle">\r\n' +
-	'  Click on circle to change its size\r\n' +
-	'</text>'],
-	
-	['Masking', maskingDemo,
-	'In SVG, you can specify that any other graphics object or \'g\' element ' +
-	'can be used as an alpha mask for compositing the current object into the background.<br/>' +
-	'See the <a href="http://www.w3.org/TR/SVG11/images/masking/mask01.svg" target="_blank">original document</a>.',
-	'<desc>Example mask01 - blue text masked with gradient against red background\r\n' +
-	'</desc>\r\n' +
-	'<defs>\r\n' +
-	'  <linearGradient id="Gradient" gradientUnits="userSpaceOnUse"\r\n' +
-	'      x1="0" y1="0" x2="800" y2="0">\r\n' +
-	'    <stop offset="0" stop-color="white" stop-opacity="0" />\r\n' +
-	'    <stop offset="1" stop-color="white" stop-opacity="1" />\r\n' +
-	'  </linearGradient>\r\n' +
-	'  <mask id="Mask" maskUnits="userSpaceOnUse"\r\n' +
-	'       x="0" y="0" width="800" height="300">\r\n' +
-	'    <rect x="0" y="0" width="800" height="300" fill="url(#Gradient)"  />\r\n' +
-	'  </mask>\r\n' +
-	'  <text id="Text" x="400" y="200" \r\n' +
-	'      font-family="Verdana" font-size="100" text-anchor="middle" >\r\n' +
-	'    Masked text\r\n' +
-	'  </text>\r\n' +
-	'</defs>\r\n' +
-	'<!-- Draw a pale red rectangle in the background -->\r\n' +
-	'<rect x="0" y="0" width="800" height="300" fill="#FF8080" />\r\n' +
-	'<!-- Draw the text string twice. First, filled blue, with the mask applied.\r\n' +
-	'     	Second, outlined in black without the mask. -->\r\n' +
-	'<use xlink:href="#Text" fill="blue" mask="url(#Mask)" />\r\n' +
-	'<use xlink:href="#Text" fill="none" stroke="black" stroke-width="2" />'],
-	
-	['Styles and References', useStyleDemo,
-	'Illustrates a \'use\' element with various methods of applying CSS styling.<br/>' +
-	'See the <a href="http://www.w3.org/TR/SVG11/images/struct/Use04.svg" target="_blank">original document</a>.', 
-	'<desc>Example Use04 - \'use\' with CSS styling</desc>\r\n' +
-	'<defs style=" /* rule 9 */ stroke-miterlimit: 10" >\r\n' +
-	'  <path id="MyPath" d="M100 50 L700 50 L700 250 L100 250"\r\n' +
-	'    class="MyPathClass" style=" /* rule 10 */ stroke-dasharray:300,100" />\r\n' +
-	'</defs>\r\n' +
-	'<style type="text/css">\r\n' +
-	'  <![CDATA[\r\n' +
-	'    /* rule 1 */ #MyUse { fill: blue }\r\n' +
-	'    /* rule 2 */ #MyPath { stroke: red }\r\n' +
-	'    /* rule 3 */ use { fill-opacity: .5 }\r\n' +
-	'    /* rule 4 */ path { stroke-opacity: .5 }\r\n' +
-	'    /* rule 5 */ .MyUseClass { stroke-linecap: round }\r\n' +
-	'    /* rule 6 */ .MyPathClass { stroke-linejoin: bevel }\r\n' +
-	'    /* rule 7 */ use > path { shape-rendering: optimizeQuality }\r\n' +
-	'    /* rule 8 */ g > path { visibility: hidden }\r\n' +
-	'  ]]>\r\n' +
-	'</style>\r\n' +
-	'<g style=" /* rule 11 */ stroke-width:40">\r\n' +
-	'  <use id="MyUse" xlink:href="#MyPath" \r\n' +
-	'    class="MyUseClass" style="/* rule 12 */ stroke-dashoffset:50" />\r\n' +
-	'</g>'],
-	
-	['Text', textDemo,
-	'Shows how \'tspan\' elements can be included within \'textPath\' ' +
-	'elements to adjust styling attributes and adjust the current text ' +
-	'position before rendering a particular glyph. The first occurrence ' +
-	'of the word "up" is filled with the color red. Attribute dy is used ' +
-	'to lift the word "up" from the baseline.<br/>' +
-	'See the <a href="http://www.w3.org/TR/SVG11/images/text/toap02.svg" target="_blank">original document</a>.',
-	'<defs>\r\n' +
-	'  <path id="MyPath"\r\n' +
-	'      d="M 100 200 \r\n' +
-	'         C 200 100 300   0 400 100\r\n' +
-	'         C 500 200 600 300 700 200\r\n' +
-	'         C 800 100 900 100 900 100" />\r\n' +
-	'</defs>\r\n' +
-	'<desc>Example toap02 - tspan within textPath</desc>\r\n' +
-	'<use xlink:href="#MyPath" fill="none" stroke="red"  />\r\n' +
-	'<text font-family="Verdana" font-size="42.5" fill="blue" >\r\n' +
-	'  <textPath xlink:href="#MyPath">\r\n' +
-	'    We go \r\n' +
-	'    <tspan dy="-30" fill="red" >\r\n' +
-	'      up\r\n' +
-	'    </tspan>\r\n' +
-	'    <tspan dy="30">\r\n' +
-	'      ,\r\n' +
-	'    </tspan>\r\n' +
-	'    then we go down, then up again\r\n' +
-	'  </textPath>\r\n' +
-	'</text>'],
-	
-	['Transformations', transformDemo,
-	'Defines two coordinate systems which are skewed ' +
-	'relative to the origin coordinate system.<br/>' +
-	'Transformations can be nested to any level. The effect of nested ' +
-	'transformations is to post-multiply (i.e., concatenate) the subsequent ' +
-	'transformation matrices onto previously defined transformations.<br/>' +
-	'See the original documents: <a href="http://www.w3.org/TR/SVG11/images/coords/Skew.svg" target="_blank">skew</a> ' +
-	'and <a href="http://www.w3.org/TR/SVG11/images/coords/Nested.svg" target="_blank">nesting</a>.',
-	'<desc>Example Skew - Show effects of skewX and skewY</desc>\r\n' +
-	'<!-- Establish a new coordinate system whose origin is at (30,100)\r\n' +
-	'     in the initial coord. system and which is skewed in X by 30 degrees. -->\r\n' +
-	'<g transform="translate(30,100)">\r\n' +
-	'  <g transform="skewX(30)">\r\n' +
-	'    <g fill="none" stroke="red" stroke-width="3" >\r\n' +
-	'      <line x1="0" y1="0" x2="50" y2="0" />\r\n' +
-	'      <line x1="0" y1="0" x2="0" y2="50" />\r\n' +
-	'    </g>\r\n' +
-	'    <text x="0" y="0" font-size="20" font-family="Verdana" fill="blue" >\r\n' +
-	'      ABC (skewX)\r\n' +
-	'    </text>\r\n' +
-	'  </g>\r\n' +
-	'</g>\r\n' +
-	'<!-- Establish a new coordinate system whose origin is at (200,100)\r\n' +
-	'     in the initial coord. system and which is skewed in Y by 30 degrees. -->\r\n' +
-	'<g transform="translate(200,100)">\r\n' +
-	'  <g transform="skewY(30)">\r\n' +
-	'    <g fill="none" stroke="red" stroke-width="3" >\r\n' +
-	'      <line x1="0" y1="0" x2="50" y2="0" />\r\n' +
-	'      <line x1="0" y1="0" x2="0" y2="50" />\r\n' +
-	'    </g>\r\n' +
-	'    <text x="0" y="0" font-size="20" font-family="Verdana" fill="blue" >\r\n' +
-	'      ABC (skewY)\r\n' +
-	'    </text>\r\n' +
-	'  </g>\r\n' +
-	'</g>\r\n' +
-	'<!-- First, a translate -->\r\n' +
-	'<g transform="translate(450,150)">\r\n' +
-	'  <g fill="none" stroke="red" stroke-width="3" >\r\n' +
-	'    <line x1="0" y1="0" x2="50" y2="0" />\r\n' +
-	'    <line x1="0" y1="0" x2="0" y2="50" />\r\n' +
-	'  </g>\r\n' +
-	'  <text x="0" y="0" font-size="16" font-family="Verdana" >\r\n' +
-	'    ....Translate(1)\r\n' +
-	'  </text>\r\n' +
-	'  <!-- Second, a rotate -->\r\n' +
-	'  <g transform="rotate(-45)">\r\n' +
-	'    <g fill="none" stroke="green" stroke-width="3" >\r\n' +
-	'      <line x1="0" y1="0" x2="50" y2="0" />\r\n' +
-	'      <line x1="0" y1="0" x2="0" y2="50" />\r\n' +
-	'    </g>\r\n' +
-	'    <text x="0" y="0" font-size="16" font-family="Verdana" >\r\n' +
-	'      ....Rotate(2)\r\n' +
-	'    </text>\r\n' +
-	'    <!-- Third, another translate -->\r\n' +
-	'    <g transform="translate(130,160)">\r\n' +
-	'      <g fill="none" stroke="blue" stroke-width="3" >\r\n' +
-	'        <line x1="0" y1="0" x2="50" y2="0" />\r\n' +
-	'        <line x1="0" y1="0" x2="0" y2="50" />\r\n' +
-	'      </g>\r\n' +
-	'      <text x="0" y="0" font-size="16" font-family="Verdana" >\r\n' +
-	'        ....Translate(3)\r\n' +
-	'      </text>\r\n' +
-	'    </g>\r\n' +
-	'  </g>\r\n' +
-	'</g>']];
-
-// Populate the examples drop-down
-function initExamples() {
-	var html = '<option value=""></option>';
-	for (var i = 0; i < examples.length; i++) {
-		html += '<option value="' + i + '">' + examples[i][0] + '</option>';
-	}
-	$('#example').html(html).change(pickExample)[0].selectedIndex = 0;
-}
-
-// Display the selected example
-function pickExample() {
-	var ex = $('#example').val();
-	if (!ex) {
-		return;
-	}
-	$('#exampledesc').html(examples[ex][2]);
-	$('#svgsource pre').text(examples[ex][3]);
-	$('#svgcode pre').text(codeFormat(examples[ex][1].toString()));
-	var svg = svgManager.getSVGFor('#svgexample');
-	svg.clear();
-	examples[ex][1](svg);
-}
-
-// Format the JavaScript SVG code for display
-function codeFormat(code) {
-	var lines = code.split('\n');
-	var formatted = '';
-	for (var i = 0; i < lines.length; i++) {
-		var line = $.trim(lines[i]);
-		if (!line || line.length == 1 || line.substring(0, 9) == 'function ') {
-			continue;
-		}
-		while (line.length > 50) {
-			var pos = line.substr(0, 50).lastIndexOf(' ');
-			if (pos == -1) {
-				break;
-			}
-			formatted += line.substr(0, pos) + '\r\n  ' + ($.browser.msie ? '  ' : '');
-			line = line.substr(pos + 1);
-		}
-		formatted += line + '\r\n';
-	}
-	return formatted;
-}
-
-// Demonstrate basic SVG shapes and constructs
-function basicShapesDemo(svg) {
-	svg.rect(null, 20, 50, 100, 50, 
-		{fill: 'yellow', stroke: 'navy', stroke_width: 5});
-	svg.roundrect(null, 150, 50, 100, 50, 10, 10, {fill: 'green'});
-	var g = svg.group(null, {transform: 'translate(270 80) rotate(-30)'});
-	svg.roundrect(g, 0, 0, 100, 50, 10, 10, {fill: 'none', stroke: 'purple', stroke_width: 3});
-	svg.circle(null, 70, 220, 50, {fill: 'red', stroke: 'blue', stroke_width: 5});
-	var g = svg.group(null, {transform: 'translate(175 220)'});
-	svg.ellipse(g, '', '', 75, 50, {fill: 'yellow'});
-	svg.ellipse(null, '', '', 75, 50, {transform: 'translate(300 220) rotate(-30)', 
-		fill: 'none', stroke: 'blue', stroke_width: 10});
-	var g = svg.group(null, {stroke: 'green'});
-	svg.line(g, 450, 120, 550, 20, {stroke_width: 5});
-	svg.line(g, 550, 120, 650, 20, {stroke_width: 10});
-	svg.line(g, 650, 120, 750, 20, {stroke_width: 15});
-	svg.line(g, 750, 120, 850, 20, {stroke_width: 20});
-	svg.line(g, 850, 120, 950, 20, {stroke_width: 25});
-	svg.polyline(null, [[450,250],
-		[475,250],[475,220],[500,220],[500,250],
-		[525,250],[525,200],[550,200],[550,250],
-		[575,250],[575,180],[600,180],[600,250],
-		[625,250],[625,160],[650,160],[650,250],[675,250]],
-		{fill: 'none', stroke: 'blue', stroke_width: 5});
-	svg.polygon(null, [[800,150],[900,180],[900,240],[800,270],[700,240],[700,180]], 
-		{fill: 'lime', stroke: 'blue', stroke_width: 10});
-}
-
-// Demonstrate SVG filter effects
-function filterDemo(svg) {
-	svg.describe(null, 'An example which combines multiple filter primitives ' +
-		'to produce a 3D lighting effect on a graphic consisting ' +
-		'of the string "SVG" sitting on top of oval filled in red ' +
-		'and surrounded by an oval outlined in red.');
-	var defs = svg.defs();
-	var filter = svg.filter(defs, 'MyFilter', 0, 0, 200, 120, 
-		{filterUnits: 'userSpaceOnUse'});
-	svg.filters.gaussianBlur(filter, 'blur', 'SourceAlpha', 4);
-	svg.filters.offset(filter, 'offsetBlur', 'blur', 4, 4);
-	var spec = svg.filters.specularLighting(filter, 'specOut', 'blur', 
-		5, 0.75, 20, {lighting_color: '#bbbbbb'});
-	svg.filters.pointLight(spec, '', -5000, -10000, 20000);
-	svg.filters.composite(filter, 'specOut', 'in', 'specOut', 'SourceAlpha');
-	svg.filters.composite(filter, 'litPaint', 'arithmetic', 'SourceGraphic', 
-		'specOut', 0, 1, 1, 0);
-	var merge = svg.filters.merge(filter, '', ['offsetBlur', 'litPaint']);
-	var g1 = svg.group(null, {filter: 'url(#MyFilter)'});
-	var g2 = svg.group(g1);
-	var path = svg.createPath();
-	svg.path(g2, path.moveTo(50, 90).curveCTo(0, 90, 0, 30, 50, 30).
-		lineTo(150, 30).curveCTo(200, 30, 200, 90, 150, 90).close(), 
-		{fill: 'none', stroke: '#D90000', stroke_width: 10});
-	svg.path(g2, path.reset().moveTo(60, 80).curveCTo(30, 80, 30, 40, 60, 40).
-		lineTo(140, 40).curveCTo(170, 40, 170, 80, 140, 80).close(), 
-		{fill: '#D90000'});
-	var g3 = svg.group(g2, {fill: '#FFFFFF', stroke: 'black', 
-		font_size: 45, font_family: 'Verdana'});
-	svg.text(g3, 52, 76, 'SVG');
-}
-
-// Demonstrate SVG gradient and pattern fills
-function gradientPatternDemo(svg) {
-	svg.describe(null, 'Example radgrad01 - fill a rectangle by ' +
-		'referencing a radial gradient paint server');
-	var g = svg.group();
-	var defs = svg.defs(g);
-	svg.radialGradient(defs, 'MyGradient', 
-		[['0%', 'red'], ['50%', 'blue'], ['100%', 'red']],
-		200, 100, 150, 200, 100, {gradientUnits: 'userSpaceOnUse'});
-	svg.rect(g, 50, 50, 300, 100, 
-		{fill: 'url(#MyGradient)', stroke: 'black', stroke_width: 5});
-	g = svg.group();
-	defs = svg.defs(g);
-	var ptn = svg.pattern(defs, 'TrianglePattern', 0, 0, 100, 100, 
-		0, 0, 10, 10, {patternUnits: 'userSpaceOnUse'});
-	var path = svg.createPath();
-	svg.path(ptn, path.moveTo(0, 0).lineTo([[7, 0], [3.5, 7]]).close(), 
-		{fill: 'red', stroke: 'blue'});
-	svg.ellipse(g, 550, 100, 175, 75, 
-		{fill: 'url(#TrianglePattern)', stroke: 'black', stroke_width: 5});
-}
-
-// Demonstrate SVG interactivity
-function interactiveDemo(svg) {
-	svg.describe(null, 'Example script01 - invoke an ECMAScript function from an onclick event');
-	svg.script(null, 'function circle_click(evt) {\n' +
-		'  var circle = evt.target;\n' +
-		'  var currentRadius = circle.getAttribute("r");\n' +
-		'  if (currentRadius == 100)\n' +
-		'    circle.setAttribute("r", currentRadius*2);\n' +
-		'  else\n' +
-		'    circle.setAttribute("r", currentRadius*0.5);\n' +
-		'}', 'text/ecmascript');
-	svg.circle(null, 300, 150, 100, {onclick: 'circle_click(evt)', fill: 'red'});
-	svg.text(null, 300, 280, 'Click on circle to change its size', 
-		{font_family: 'Verdana', font_size: 35,  text_anchor: 'middle'});
-}
-
-// Demonstrate SVG masking operations
-function maskingDemo(svg) {
-	svg.describe(null, 'Example mask01 - blue text masked with gradient against red background');
-	var defs = svg.defs();
-	svg.linearGradient(defs, 'Gradient', [[0, 'white', 0], [1, 'white', 1]], 
-		0, 0, 800, 0, {gradientUnits: 'userSpaceOnUse'});
-	var mask = svg.mask(defs, 'Mask', 0, 0, 800, 300, {maskUnits: 'userSpaceOnUse'});
-	svg.rect(mask, 0, 0, 800, 300, {fill: 'url(#Gradient)'});
-	svg.text(defs, 400, 200, 'Masked text', {id: 'Text', 
-		font_family: 'Verdana', font_size: 100, text_anchor: 'middle'});
-	svg.rect(null, 0, 0, 800, 300, {fill: '#FF8080'});
-	svg.use(null, '#Text', {fill: 'blue', mask: 'url(#Mask)'});
-	svg.use(null, '#Text', {fill: 'none', stroke: 'black', stroke_width: 2});
-}
-
-// Demonstrate SVG text rendering
-function textDemo(svg) {
-	var defs = svg.defs();
-	var path = svg.createPath();
-	svg.path(defs, path.moveTo(100, 200).curveCTo([[200, 100, 300, 0, 400, 100], 
-		[500, 200, 600, 300, 700, 200], [800, 100, 900, 100, 900, 100]]), 
-		{id: 'MyPath'});
-	svg.describe(null, 'Example toap02 - tspan within textPath');
-	svg.use(null, '#MyPath', {fill: 'none', stroke: 'red'});
-	var text = svg.text(null, '', 
-		{font_family: 'Verdana', font_size: '42.5', fill: 'blue'});
-	var texts = svg.createText();
-	svg.textpath(text, '#MyPath', texts.string('We go ').span('up', {dy: -30, fill: 'red'}).
-		span(',', {dy: 30}).string(' then we go down, then up again'));
-}
-
-// Demonstrate SVG transformation support
-function transformDemo(svg) {
-	svg.describe(null, 'Example Skew - Show effects of skewX and skewY');
-	var g1 = svg.group(null, {transform: 'translate(30,100)'});
-	var g2 = svg.group(g1, {transform: 'skewX(30)'});
-	var g3 = svg.group(g2, {fill: 'none', stroke: 'red', stroke_width: 3});
-	svg.line(g3, 0, 0, 50, 0);
-	svg.line(g3, 0, 0, 0, 50);
-	svg.text(g2, 0, 0, 'ABC (skewX)', 
-		{font_size: 20, font_family: 'Verdana', fill: 'blue'});
-	g1 = svg.group(null, {transform: 'translate(200,100)'});
-	g2 = svg.group(g1, {transform: 'skewY(30)'});
-	g3 = svg.group(g2, {fill: 'none', stroke: 'red', stroke_width: 3});
-	svg.line(g3, 0, 0, 50, 0);
-	svg.line(g3, 0, 0, 0, 50);
-	svg.text(g2, 0, 0, 'ABC (skewY)', 
-		{font_size: 20, font_family: 'Verdana', fill: 'blue'});
-		
-	g1 = svg.group(null, {transform: 'translate(450,150)'});
-	g2 = svg.group(g1, {fill: 'none', stroke: 'red', stroke_width: 3});
-	svg.line(g2, 0, 0, 50, 0);
-	svg.line(g2, 0, 0, 0, 50);
-	svg.text(g1, 0, 0, '....Translate(1)',
-		{font_size: 16, font_family: 'Verdana'});
-	g2 = svg.group(g1, {transform: 'rotate(-45)'});
-	g3 = svg.group(g2, {fill: 'none', stroke: 'green', stroke_width: 3});
-	svg.line(g3, 0, 0, 50, 0);
-	svg.line(g3, 0, 0, 0, 50);
-	svg.text(g2, 0, 0, '....Rotate(2)', 
-		{font_size: 16, font_family: 'Verdana'});
-	g3 = svg.group(g2, {transform: 'translate(130,160)'});
-	var g4 = svg.group(g3, {fill: 'none', stroke: 'blue', stroke_width: 3});
-	svg.line(g4, 0, 0, 50, 0);
-	svg.line(g4, 0, 0, 0, 50);
-	svg.text(g3, 0, 0, '....Translate(3)', 
-		{font_size: 16, font_family: 'Verdana'});
-}
-
-// Demonstrate SVG referencing and CSS styling
-function useStyleDemo(svg) {
-	svg.describe(null, 'Example Use04 - \'use\' with CSS styling');
-	var defs = svg.defs(null, '', {style: ' /* rule 9 */ stroke-miterlimit: 10'});
-	var path = svg.createPath();
-	svg.path(defs, path.moveTo(100, 50).lineTo([[700, 50], [700, 250], [100, 250]]),
-		{id: 'MyPath', _class: 'MyPathClass', style: ' /* rule 10 */ stroke-dasharray: 300,100'});
-	svg.style(null, '/* rule 1 */ #MyUse { fill: blue } ' +
-		'/* rule 2 */ #MyPath { stroke: red } ' +
-		'/* rule 3 */ use { fill-opacity: .5 } ' +
-		'/* rule 4 */ path { stroke-opacity: .5 } ' +
-		'/* rule 5 */ .MyUseClass { stroke-linecap: round } ' +
-		'/* rule 6 */ .MyPathClass { stroke-linejoin: bevel } ' +
-		'/* rule 7 */ use > path { shape-rendering: optimizeQuality } ' +
-		'/* rule 8 */ g > path { visibility: hidden }');
-	var g = svg.group(null, {style: ' /* rule 11 */ stroke-width: 40'});
-	svg.use(g, '#MyPath', {id: 'MyUse', _class: 'MyUseClass', 
-		style: '/* rule 12 */ stroke-dashoffset: 50'});
-}
-
-// -----------------------------------------------------------------------------
-
-// Add a node defined inline
-function addInline() {
-	var svg = svgManager.getSVGFor('#svgload');
-	svg.add(null, '#svg1');
-}
-
-// Load an external document
-function loadExternal() {
-	var svg = svgManager.getSVGFor('#svgload');
-	svg.load($('#loadURL').val());
-}
-
-// -----------------------------------------------------------------------------
-
-// Synchronise the drawing section with user selection
-function setDrawOptions() {
-	showHide = function(id, show) {
-		if (show) {
-			$(id).show();
-		}
-		else {
-			$(id).hide();
-		}
-	}
-	var shape = $('#shape').val();
-	showHide('#getRect', (shape == 'rect' || shape == 'roundrect'));
-	showHide('#getRounded', shape == 'roundrect');
-	showHide('#getCentre', (shape == 'circle' || shape == 'ellipse'));
-	showHide('#getRadius', (shape == 'circle'));
-	showHide('#getRadii', (shape == 'ellipse'));
-	showHide('#getLine', (shape == 'line'));
-	showHide('#getFill', (shape != 'line'));
-}
-
-var drawNodes = [];
-var sketchpad = null;
-
-$(document).ready(function() {
-	sketchpad = $('#svgsketch')[0];
-});
-
-// Draw the selected element on the canvas
-function draw() {
-	var svg = svgManager.getSVGFor(sketchpad);
-	var rotate = $('#rotate').val();
-	var settings = $.extend({fill: $('#fill').val(), 
-		stroke: $('#stroke').val(), stroke_width: $('#swidth').val()}, 
-		(rotate ? {transform: 'rotate(' + rotate + ')'} : {}));
-	var shape = $('#shape').val();
-	var node = null;
-	if (shape == 'rect') {
-		node = svg.rect(null, $('#left').val(), $('#top').val(), 
-			$('#width').val(), $('#height').val(), settings);
-	}
-	else if (shape == 'roundrect') {
-		node = svg.roundrect(null, $('#left').val(), $('#top').val(), 
-			$('#width').val(), $('#height').val(), 
-			$('#roundX').val(), $('#roundY').val(), settings);
-	}
-	else if (shape == 'circle') {
-		node = svg.circle(null, $('#centreX').val(), $('#centreY').val(), 
-			$('#radius').val(), settings);
-	}
-	else if (shape == 'ellipse') {
-		node = svg.ellipse(null, $('#centreX').val(), $('#centreY').val(), 
-			$('#radiusX').val(), $('#radiusY').val(), settings);
-	}
-	else if (shape == 'line') {
-		node = svg.line(null, $('#startX').val(), $('#startY').val(), 
-			$('#endX').val(), $('#endY').val(), settings);
-	}
-	drawNodes[drawNodes.length] = node;
-}
-
-// Remove the last drawn element
-function undo() {
-	if (!drawNodes.length) {
-		return;
-	}
-	var svg = svgManager.getSVGFor(sketchpad);
-	svg.remove(drawNodes[drawNodes.length - 1]);
-	drawNodes.splice(drawNodes.length - 1, 1);
-}
-
-// Clear the canvas
-function erase(name) {
-	svgManager.getSVGFor($(name)).clear();
-	drawNodes = [];
-}
-
-// -----------------------------------------------------------------------------
-
-// Initialise the graphing options
-function setGraphOptions() {
-	var html = '';
-	var chartTypes = svgGraphing.chartTypes();
-	for (var id in chartTypes) {
-		html += '<option value="' + id + '">' + chartTypes[id].title() + '</option>';
-	}
-	$('#chartType').html(html)[0].selectedIndex = 0;
-}
-
-var firstGraph = true;
-var chartArea = [[0.1, 0.1, 0.95, 0.9], [0.2, 0.1, 0.95, 0.9],
-	[0.1, 0.1, 0.8, 0.9], [0.1, 0.25, 0.9, 0.9], [0.1, 0.1, 0.9, 0.8]];
-var legendArea = [[0.0, 0.0, 0.0, 0.0], [0.005, 0.1, 0.125, 0.5],
-	[0.875, 0.1, 0.995, 0.5], [0.2, 0.1, 0.8, 0.2], [0.2, 0.9, 0.8, 0.995]];
-var fills = [['lightblue', 'url(#fadeBlue)'], ['pink', 'url(#fadeRed)'],
-	['lightgreen', 'url(#fadeGreen)']];
-
-// Draw a new graph with the selected options
-function graphIt() {
-	var svg = svgManager.getSVGFor('#svggraph');
-	if (firstGraph) {
-		var defs = svg.defs();
-		svg.linearGradient(defs, 'fadeBlue', [[0, 'lightblue'], [1, 'blue']]);
-		svg.linearGradient(defs, 'fadeRed', [[0, 'pink'], [1, 'red']]);
-		svg.linearGradient(defs, 'fadeGreen', [[0, 'lightgreen'], [1, 'green']]);
-		svg.graph.noDraw().title('Browser Usage').
-			addSeries('IE', [95.97, 91.80, 88.16, 86.64], 'lightblue', 'blue', 3).
-			addSeries('Netscape', [3.39, 2.83, 1.61, 0.00], 'pink', 'red', 3).
-			addSeries('Firefox', [0.00, 4.06, 8.13, 9.95], 'lightgreen', 'green', 3).
-			chartFormat('lightyellow', 'gray').
-			gridlines({stroke: 'gray', stroke_dasharray: '2,2'}, 'gray').
-			status(setStatus);
-		svg.graph.xAxis.title('Year').scale(0, 3).
-			ticks(1, 0).labels(['2002', '2004', '2005', '2006']);
-		svg.graph.yAxis.title('Percentage').scale(-5, 105).ticks(10, 5);
-		svg.graph.legend.settings({fill: 'lightgoldenrodyellow', stroke: 'gray'});
-		firstGraph = false;
-	}
-	var chartType = $('#chartType').val();
-	var legendPos = $('#legendPos').val() - 0;
-	var seriesFill = ($('#seriesFill').val() == 'plain' ? 0 : 1);
-	svg.graph.legend.show(legendPos).area(legendArea[legendPos]);
-	for (var i = 0; i < 3; i++) {
-		svg.graph.series()[i].format((fills[i])[seriesFill]);
-	}
-	svg.graph.noDraw().chartArea(chartArea[legendPos]).
-		chartType(chartType, {explode: [2], explodeDist: 10}).redraw();
-	chartType = svgGraphing.chartTypes()[chartType];
-	$('#graphDesc').text(chartType.description());
-	var options = '';
-	for (var i = 0; i < chartType.options().length; i++) {
-		options += '<li>' + chartType.options()[i] + '</li>';
-	}
-	$('#graphOptions').html(options || '<li>None</li>');
-}
-
-// Show the status values in a callback from the graph
-function setStatus(value) {
-	window.status = value;
-}
\ No newline at end of file
-- 
1.7.6.5

