diff --git a/app/views/navigator/index.html.erb b/app/views/navigator/index.html.erb
index 430f1d64..4b91e446 100644
--- a/app/views/navigator/index.html.erb
+++ b/app/views/navigator/index.html.erb
@@ -1,9 +1,9 @@
-
-
+
+
-
-
-
+
+
+
<%# Root note: the universe %>
diff --git a/public/navigator/js-mindmap.css b/public/navigator/js-mindmap.css
new file mode 100644
index 00000000..4aea2448
--- /dev/null
+++ b/public/navigator/js-mindmap.css
@@ -0,0 +1,60 @@
+#debug1 {
+ display:block;
+}
+.js-mindmap-active h1 {
+ display:none;
+}
+.js-mindmap-active section h1 {
+ display:block;
+}
+.js-mindmap-active .node {
+ position:absolute;
+ top:0;
+ left:0;
+ font-family:verdana;
+ font-size:11px;
+ color: #003258;
+ opacity:0.9;
+ padding:0 7px;
+ cursor:pointer;
+ cursor:hand;
+ z-index:100;
+ list-style:none;
+}
+.js-mindmap-active a.node {
+ font: 30px/34px Arial, sans-serif;
+ font-size:1em;
+ letter-spacing: 0;
+ display:block;
+ color: white;
+ text-align:center;
+ text-decoration:none;
+}
+.js-mindmap-active .node.active{
+ font-size:1.5em;
+}
+.js-mindmap-active .node.active a{
+ color:#003258;
+}
+.js-mindmap-active .node.activeparent a{
+ color:#001228;
+}
+.js-mindmap-active img.line {
+ position:absolute;
+ width:200px;
+ height:133px;
+ top:0;
+ left:0;
+ display:block;
+ z-index:0;
+}
+.ui-draggable {
+ position:absolute;
+}
+.js-mindmap-active .node .node-action {
+ position:absolute;
+ right:-2em;
+ bottom:-1px;
+ text-align:center;
+ vertical-align:super;
+}
\ No newline at end of file
diff --git a/public/navigator/js-mindmap.js b/public/navigator/js-mindmap.js
new file mode 100644
index 00000000..b9d4381b
--- /dev/null
+++ b/public/navigator/js-mindmap.js
@@ -0,0 +1,586 @@
+/*
+ js-mindmap
+
+ Copyright (c) 2008/09/10 Kenneth Kufluk http://kenneth.kufluk.com/
+
+ MIT (X11) license
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in
+ all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ THE SOFTWARE.
+
+*/
+
+/*
+ Things to do:
+ - remove Lines - NO - they seem harmless enough!
+ - add better "make active" methods
+ - remove the "root node" concept. Tie nodes to elements better, so we can check if a parent element is root
+
+ - allow progressive exploration
+ - allow easy supplying of an ajax param for loading new kids and a loader anim
+ - allow easy exploration of a ul or ol to find nodes
+ - limit to an area
+ - allow more content (div instead of an a)
+ - test multiple canvases
+ - Hidden children should not be bounded
+ - Layout children in circles
+ - Add/Edit nodes
+ - Resize event
+ - incorporate widths into the forces, so left boundaries push on right boundaries
+
+
+ Make demos:
+ - amazon explore
+ - directgov explore
+ - thesaurus
+ - themes
+
+*/
+
+(function ($) {
+ 'use strict';
+
+ var TIMEOUT = 4, // movement timeout in seconds
+ CENTRE_FORCE = 3, // strength of attraction to the centre by the active node
+ Node,
+ Line;
+
+ // Define all Node related functions.
+ Node = function (obj, name, parent, opts) {
+ this.obj = obj;
+ this.options = obj.options;
+
+ this.name = name;
+ this.href = opts.href;
+ if (opts.url) {
+ this.url = opts.url;
+ }
+
+ // create the element for display
+ this.el = $('' + this.name + '').addClass('node');
+ $('body').prepend(this.el);
+
+ if (!parent) {
+ obj.activeNode = this;
+ this.el.addClass('active root');
+ } else {
+ obj.lines[obj.lines.length] = new Line(obj, this, parent);
+ }
+ this.parent = parent;
+ this.children = [];
+ if (this.parent) {
+ this.parent.children.push(this);
+ }
+
+ // animation handling
+ this.moving = false;
+ this.moveTimer = 0;
+ this.obj.movementStopped = false;
+ this.visible = true;
+ this.x = 1;
+ this.y = 1;
+ this.dx = 0;
+ this.dy = 0;
+ this.hasPosition = false;
+
+ this.content = []; // array of content elements to display onclick;
+
+ this.el.css('position', 'absolute');
+
+ var thisnode = this;
+
+ this.el.draggable({
+ drag: function () {
+ obj.root.animateToStatic();
+ }
+ });
+
+ this.el.click(function () {
+ if (obj.activeNode) {
+ obj.activeNode.el.removeClass('active');
+ if (obj.activeNode.parent) {
+ obj.activeNode.parent.el.removeClass('activeparent');
+ }
+ }
+ if (typeof opts.onclick === 'function') {
+ opts.onclick(thisnode);
+ }
+ obj.activeNode = thisnode;
+ obj.activeNode.el.addClass('active');
+ if (obj.activeNode.parent) {
+ obj.activeNode.parent.el.addClass('activeparent');
+ }
+ obj.root.animateToStatic();
+ return false;
+ });
+
+ };
+
+ // ROOT NODE ONLY: control animation loop
+ Node.prototype.animateToStatic = function () {
+
+ clearTimeout(this.moveTimer);
+ // stop the movement after a certain time
+ var thisnode = this;
+ this.moveTimer = setTimeout(function () {
+ //stop the movement
+ thisnode.obj.movementStopped = true;
+ }, TIMEOUT * 1000);
+
+ if (this.moving) {
+ return;
+ }
+ this.moving = true;
+ this.obj.movementStopped = false;
+ this.animateLoop();
+ };
+
+ // ROOT NODE ONLY: animate all nodes (calls itself recursively)
+ Node.prototype.animateLoop = function () {
+ var i, len, mynode = this;
+ this.obj.canvas.clear();
+ for (i = 0, len = this.obj.lines.length; i < len; i++) {
+ this.obj.lines[i].updatePosition();
+ }
+ if (this.findEquilibrium() || this.obj.movementStopped) {
+ this.moving = false;
+ return;
+ }
+ setTimeout(function () {
+ mynode.animateLoop();
+ }, 10);
+ };
+
+ // find the right position for this node
+ Node.prototype.findEquilibrium = function () {
+ var i, len, stable = true;
+ stable = this.display() && stable;
+ for (i = 0, len = this.children.length; i < len; i++) {
+ stable = this.children[i].findEquilibrium() && stable;
+ }
+ return stable;
+ };
+
+ //Display this node, and its children
+ Node.prototype.display = function (depth) {
+ var parent = this,
+ stepAngle,
+ angle;
+
+ depth = depth || 0;
+
+ if (this.visible) {
+ // if: I'm not active AND my parent's not active AND my children aren't active ...
+ if (this.obj.activeNode !== this && this.obj.activeNode !== this.parent && this.obj.activeNode.parent !== this) {
+ // TODO hide me!
+ this.el.hide();
+ this.visible = false;
+ }
+ } else {
+ if (this.obj.activeNode === this || this.obj.activeNode === this.parent || this.obj.activeNode.parent === this) {
+ this.el.show();
+ this.visible = true;
+ }
+ }
+ this.drawn = true;
+ // am I positioned? If not, position me.
+ if (!this.hasPosition) {
+ this.x = this.options.mapArea.x / 2;
+ this.y = this.options.mapArea.y / 2;
+ this.el.css({'left': this.x + "px", 'top': this.y + "px"});
+ this.hasPosition = true;
+ }
+ // are my children positioned? if not, lay out my children around me
+ stepAngle = Math.PI * 2 / this.children.length;
+ $.each(this.children, function (index) {
+ if (!this.hasPosition) {
+ if (!this.options.showProgressive || depth <= 1) {
+ angle = index * stepAngle;
+ this.x = (50 * Math.cos(angle)) + parent.x;
+ this.y = (50 * Math.sin(angle)) + parent.y;
+ this.hasPosition = true;
+ this.el.css({'left': this.x + "px", 'top': this.y + "px"});
+ }
+ }
+ });
+ // update my position
+ return this.updatePosition();
+ };
+
+ // updatePosition returns a boolean stating whether it's been static
+ Node.prototype.updatePosition = function () {
+ var forces, showx, showy;
+
+ if (this.el.hasClass("ui-draggable-dragging")) {
+ this.x = parseInt(this.el.css('left'), 10) + (this.el.width() / 2);
+ this.y = parseInt(this.el.css('top'), 10) + (this.el.height() / 2);
+ this.dx = 0;
+ this.dy = 0;
+ return false;
+ }
+
+ //apply accelerations
+ forces = this.getForceVector();
+ this.dx += forces.x * this.options.timeperiod;
+ this.dy += forces.y * this.options.timeperiod;
+
+ // damp the forces
+ this.dx = this.dx * this.options.damping;
+ this.dy = this.dy * this.options.damping;
+
+ //ADD MINIMUM SPEEDS
+ if (Math.abs(this.dx) < this.options.minSpeed) {
+ this.dx = 0;
+ }
+ if (Math.abs(this.dy) < this.options.minSpeed) {
+ this.dy = 0;
+ }
+ if (Math.abs(this.dx) + Math.abs(this.dy) === 0) {
+ return true;
+ }
+ //apply velocity vector
+ this.x += this.dx * this.options.timeperiod;
+ this.y += this.dy * this.options.timeperiod;
+ this.x = Math.min(this.options.mapArea.x, Math.max(1, this.x));
+ this.y = Math.min(this.options.mapArea.y, Math.max(1, this.y));
+ // display
+ showx = this.x - (this.el.width() / 2);
+ showy = this.y - (this.el.height() / 2) - 10;
+ this.el.css({'left': showx + "px", 'top': showy + "px"});
+ return false;
+ };
+
+ Node.prototype.getForceVector = function () {
+ var i, x1, y1, xsign, dist, theta, f,
+ xdist, rightdist, bottomdist, otherend,
+ fx = 0,
+ fy = 0,
+ nodes = this.obj.nodes,
+ lines = this.obj.lines;
+
+ // Calculate the repulsive force from every other node
+ for (i = 0; i < nodes.length; i++) {
+ if (nodes[i] === this) {
+ continue;
+ }
+ if (!nodes[i].visible) {
+ continue;
+ }
+ // Repulsive force (coulomb's law)
+ x1 = (nodes[i].x - this.x);
+ y1 = (nodes[i].y - this.y);
+ //adjust for variable node size
+// var nodewidths = (($(nodes[i]).width() + this.el.width())/2);
+ dist = Math.sqrt((x1 * x1) + (y1 * y1));
+// var myrepulse = this.options.repulse;
+// if (this.parent==nodes[i]) myrepulse=myrepulse*10; //parents stand further away
+ if (Math.abs(dist) < 500) {
+ if (x1 === 0) {
+ theta = Math.PI / 2;
+ xsign = 0;
+ } else {
+ theta = Math.atan(y1 / x1);
+ xsign = x1 / Math.abs(x1);
+ }
+ // force is based on radial distance
+ f = (this.options.repulse * 500) / (dist * dist);
+ fx += -f * Math.cos(theta) * xsign;
+ fy += -f * Math.sin(theta) * xsign;
+ }
+ }
+
+ // add repulsive force of the "walls"
+ //left wall
+ xdist = this.x + this.el.width();
+ f = (this.options.wallrepulse * 500) / (xdist * xdist);
+ fx += Math.min(2, f);
+ //right wall
+ rightdist = (this.options.mapArea.x - xdist);
+ f = -(this.options.wallrepulse * 500) / (rightdist * rightdist);
+ fx += Math.max(-2, f);
+ //top wall
+ f = (this.options.wallrepulse * 500) / (this.y * this.y);
+ fy += Math.min(2, f);
+ //bottom wall
+ bottomdist = (this.options.mapArea.y - this.y);
+ f = -(this.options.wallrepulse * 500) / (bottomdist * bottomdist);
+ fy += Math.max(-2, f);
+
+ // for each line, of which I'm a part, add an attractive force.
+ for (i = 0; i < lines.length; i++) {
+ otherend = null;
+ if (lines[i].start === this) {
+ otherend = lines[i].end;
+ } else if (lines[i].end === this) {
+ otherend = lines[i].start;
+ } else {
+ continue;
+ }
+ // Ignore the pull of hidden nodes
+ if (!otherend.visible) {
+ continue;
+ }
+ // Attractive force (hooke's law)
+ x1 = (otherend.x - this.x);
+ y1 = (otherend.y - this.y);
+ dist = Math.sqrt((x1 * x1) + (y1 * y1));
+ if (Math.abs(dist) > 0) {
+ if (x1 === 0) {
+ theta = Math.PI / 2;
+ xsign = 0;
+ }
+ else {
+ theta = Math.atan(y1 / x1);
+ xsign = x1 / Math.abs(x1);
+ }
+ // force is based on radial distance
+ f = (this.options.attract * dist) / 10000;
+ fx += f * Math.cos(theta) * xsign;
+ fy += f * Math.sin(theta) * xsign;
+ }
+ }
+
+ // if I'm active, attract me to the centre of the area
+ if (this.obj.activeNode === this) {
+ // Attractive force (hooke's law)
+ otherend = this.options.mapArea;
+ x1 = ((otherend.x / 2) - this.options.centreOffset - this.x);
+ y1 = ((otherend.y / 2) - this.y);
+ dist = Math.sqrt((x1 * x1) + (y1 * y1));
+ if (Math.abs(dist) > 0) {
+ if (x1 === 0) {
+ theta = Math.PI / 2;
+ xsign = 0;
+ } else {
+ xsign = x1 / Math.abs(x1);
+ theta = Math.atan(y1 / x1);
+ }
+ // force is based on radial distance
+ f = (0.1 * this.options.attract * dist * CENTRE_FORCE) / 1000;
+ fx += f * Math.cos(theta) * xsign;
+ fy += f * Math.sin(theta) * xsign;
+ }
+ }
+
+ if (Math.abs(fx) > this.options.maxForce) {
+ fx = this.options.maxForce * (fx / Math.abs(fx));
+ }
+ if (Math.abs(fy) > this.options.maxForce) {
+ fy = this.options.maxForce * (fy / Math.abs(fy));
+ }
+ return {
+ x: fx,
+ y: fy
+ };
+ };
+
+ Node.prototype.removeNode = function () {
+ var i,
+ oldnodes = this.obj.nodes,
+ oldlines = this.obj.lines;
+
+ for (i = 0; i < this.children.length; i++) {
+ this.children[i].removeNode();
+ }
+
+ this.obj.nodes = [];
+ for (i = 0; i < oldnodes.length; i++) {
+ if (oldnodes[i] === this) {
+ continue;
+ }
+ this.obj.nodes.push(oldnodes[i]);
+ }
+
+ this.obj.lines = [];
+ for (i = 0; i < oldlines.length; i++) {
+ if (oldlines[i].start === this) {
+ continue;
+ } else if (oldlines[i].end === this) {
+ continue;
+ }
+ this.obj.lines.push(oldlines[i]);
+ }
+
+ this.el.remove();
+ };
+
+
+
+ // Define all Line related functions.
+ Line = function (obj, startNode, endNode) {
+ this.obj = obj;
+ this.options = obj.options;
+ this.start = startNode;
+ this.colour = "blue";
+ this.size = "thick";
+ this.end = endNode;
+ };
+
+ Line.prototype.updatePosition = function () {
+ if (!this.options.showSublines && (!this.start.visible || !this.end.visible)) {
+ return;
+ }
+ this.size = (this.start.visible && this.end.visible) ? "thick" : "thin";
+ this.color = (this.obj.activeNode.parent === this.start || this.obj.activeNode.parent === this.end) ? "red" : "blue";
+ this.strokeStyle = "#FFF";
+
+ this.obj.canvas.path("M" + this.start.x + ' ' + this.start.y + "L" + this.end.x + ' ' + this.end.y).attr({'stroke': this.strokeStyle, 'opacity': 0.2, 'stroke-width': '5px'});
+ };
+
+ $.fn.addNode = function (parent, name, options) {
+ var obj = this[0],
+ node = obj.nodes[obj.nodes.length] = new Node(obj, name, parent, options);
+ console.log(obj.root);
+ obj.root.animateToStatic();
+ return node;
+ };
+
+ $.fn.addRootNode = function (name, opts) {
+ var node = this[0].nodes[0] = new Node(this[0], name, null, opts);
+ this[0].root = node;
+ return node;
+ };
+
+ $.fn.removeNode = function (name) {
+ return this.each(function () {
+// if (!!this.mindmapInit) return false;
+ //remove a node matching the anme
+// alert(name+' removed');
+ });
+ };
+
+ $.fn.mindmap = function (options) {
+ // Define default settings.
+ options = $.extend({
+ attract: 15,
+ repulse: 6,
+ damping: 0.55,
+ timeperiod: 10,
+ wallrepulse: 0.4,
+ mapArea: {
+ x: -1,
+ y: -1
+ },
+ canvasError: 'alert',
+ minSpeed: 0.05,
+ maxForce: 0.1,
+ showSublines: false,
+ updateIterationCount: 20,
+ showProgressive: true,
+ centreOffset: 100,
+ timer: 0
+ }, options);
+
+ var $window = $(window);
+
+ return this.each(function () {
+ var mindmap = this;
+
+ this.mindmapInit = true;
+ this.nodes = [];
+ this.lines = [];
+ this.activeNode = null;
+ this.options = options;
+ this.animateToStatic = function () {
+ this.root.animateToStatic();
+ };
+ $window.resize(function () {
+ mindmap.animateToStatic();
+ });
+
+ //canvas
+ if (options.mapArea.x === -1) {
+ options.mapArea.x = $window.width();
+ }
+ if (options.mapArea.y === -1) {
+ options.mapArea.y = $window.height();
+ }
+ //create drawing area
+ this.canvas = Raphael(0, 0, options.mapArea.x, options.mapArea.y);
+
+ // Add a class to the object, so that styles can be applied
+ $(this).addClass('js-mindmap-active');
+
+ // Add keyboard support (thanks to wadefs)
+ $(this).keyup(function (event) {
+ var newNode, i, activeParent = mindmap.activeNode.parent;
+ switch (event.which) {
+ case 33: // PgUp
+ case 38: // Up, move to parent
+ if (activeParent) {
+ activeParent.el.click();
+ }
+ break;
+ case 13: // Enter (change to insert a sibling)
+ case 34: // PgDn
+ case 40: // Down, move to first child
+ if (mindmap.activeNode.children.length) {
+ mindmap.activeNode.children[0].el.click();
+ }
+ break;
+ case 37: // Left, move to previous sibling
+ if (activeParent) {
+ newNode = null;
+ if (activeParent.children[0] === mindmap.activeNode) {
+ newNode = activeParent.children[activeParent.children.length - 1];
+ } else {
+ for (i = 1; i < activeParent.children.length; i++) {
+ if (activeParent.children[i] === mindmap.activeNode) {
+ newNode = activeParent.children[i - 1];
+ }
+ }
+ }
+ if (newNode) {
+ newNode.el.click();
+ }
+ }
+ break;
+ case 39: // Right, move to next sibling
+ if (activeParent) {
+ newNode = null;
+ if (activeParent.children[activeParent.children.length - 1] === mindmap.activeNode) {
+ newNode = activeParent.children[0];
+ } else {
+ for (i = activeParent.children.length - 2; i >= 0; i--) {
+ if (activeParent.children[i] === mindmap.activeNode) {
+ newNode = activeParent.children[i + 1];
+ }
+ }
+ }
+ if (newNode) {
+ newNode.el.click();
+ }
+ }
+ break;
+ case 45: // Ins, insert a child
+ break;
+ case 46: // Del, delete this node
+ break;
+ case 27: // Esc, cancel insert
+ break;
+ case 83: // 'S', save
+ break;
+ }
+ return false;
+ });
+
+ });
+ };
+}(jQuery));
+
+/*jslint devel: true, browser: true, continue: true, plusplus: true, indent: 2 */
\ No newline at end of file
diff --git a/public/navigator/raphael-min.js b/public/navigator/raphael-min.js
new file mode 100644
index 00000000..4a99e3ee
--- /dev/null
+++ b/public/navigator/raphael-min.js
@@ -0,0 +1,113 @@
+/*
+ * Raphael 1.4.3 - JavaScript Vector Library
+ *
+ * Copyright (c) 2010 Dmitry Baranovskiy (http://raphaeljs.com)
+ * Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license.
+ */
+Raphael=function(){function m(){if(m.is(arguments[0],U)){for(var a=arguments[0],b=Aa[K](m,a.splice(0,3+m.is(a[0],O))),c=b.set(),d=0,f=a[o];d
";if(ha.childNodes[o]!=2)return m.type=null;ha=null}m.svg=!(m.vml=m.type=="VML");G[p]=m[p];m._id=0;m._oid=0;m.fn={};m.is=function(a,b){b=ca.call(b);return b=="object"&&a===Object(a)||b=="undefined"&&typeof a==b||b=="null"&&a==null||ca.call(ob.call(a).slice(8,-1))==b};m.setWindow=function(a){X=a;C=X.document};function ra(a){if(m.vml){var b=/^\s+|\s+$/g;ra=T(function(d){var f;d=(d+s)[I](b,
+s);try{var e=new X.ActiveXObject("htmlfile");e.write("");e.close();f=e.body}catch(g){f=X.createPopup().document.body}e=f.createTextRange();try{f.style.color=d;var h=e.queryCommandValue("ForeColor");h=(h&255)<<16|h&65280|(h&16711680)>>>16;return"#"+("000000"+h[N](16)).slice(-6)}catch(i){return"none"}})}else{var c=C.createElement("i");c.title="Rapha\u00ebl Colour Picker";c.style.display="none";C.body[y](c);ra=T(function(d){c.style.color=d;return C.defaultView.getComputedStyle(c,s).getPropertyValue("color")})}return ra(a)}
+function qb(){return"hsb("+[this.h,this.s,this.b]+")"}function rb(){return this.hex}m.hsb2rgb=T(function(a,b,c){if(m.is(a,"object")&&"h"in a&&"s"in a&&"b"in a){c=a.b;b=a.s;a=a.h}var d;if(c==0)return{r:0,g:0,b:0,hex:"#000"};if(a>1||b>1||c>1){a/=255;b/=255;c/=255}d=~~(a*6);a=a*6-d;var f=c*(1-b),e=c*(1-b*a),g=c*(1-b*(1-a));a=[c,e,f,f,g,c,c][d];b=[g,c,c,e,f,f,g][d];d=[f,f,g,c,c,e,f][d];a*=255;b*=255;d*=255;c={r:a,g:b,b:d,toString:rb};a=(~~a)[N](16);b=(~~b)[N](16);d=(~~d)[N](16);a=a[I](ga,"0");b=b[I](ga,
+"0");d=d[I](ga,"0");c.hex="#"+a+b+d;return c},m);m.rgb2hsb=T(function(a,b,c){if(m.is(a,"object")&&"r"in a&&"g"in a&&"b"in a){c=a.b;b=a.g;a=a.r}if(m.is(a,ea)){var d=m.getRGB(a);a=d.r;b=d.g;c=d.b}if(a>1||b>1||c>1){a/=255;b/=255;c/=255}var f=Y(a,b,c),e=$(a,b,c);d=f;if(e==f)return{h:0,s:0,b:f};else{var g=f-e;e=g/f;a=a==f?(b-c)/g:b==f?2+(c-a)/g:4+(a-b)/g;a/=6;a<0&&a++;a>1&&a--}return{h:a,s:e,b:d,toString:qb}},m);var sb=/,?([achlmqrstvxz]),?/gi,sa=/\s*,\s*/,tb={hs:1,rg:1};m._path2string=function(){return this.join(",")[I](sb,
+"$1")};function T(a,b,c){function d(){var f=Array[p].slice.call(arguments,0),e=f[Q]("\u25ba"),g=d.cache=d.cache||{},h=d.count=d.count||[];if(g[z](e))return c?c(g[e]):g[e];h[o]>=1000&&delete g[h.shift()];h[E](e);g[e]=a[K](b,f);return c?c(g[e]):g[e]}return d}m.getRGB=T(function(a){if(!a||(a+=s).indexOf("-")+1)return{r:-1,g:-1,b:-1,hex:"none",error:1};if(a=="none")return{r:-1,g:-1,b:-1,hex:"none"};!(tb[z](a.substring(0,2))||a.charAt()=="#")&&(a=ra(a));var b,c,d,f,e;if(a=a.match(pb)){if(a[2]){d=da(a[2].substring(5),
+16);c=da(a[2].substring(3,5),16);b=da(a[2].substring(1,3),16)}if(a[3]){d=da((e=a[3].charAt(3))+e,16);c=da((e=a[3].charAt(2))+e,16);b=da((e=a[3].charAt(1))+e,16)}if(a[4]){a=a[4][H](sa);b=A(a[0]);c=A(a[1]);d=A(a[2]);f=A(a[3])}if(a[5]){a=a[5][H](sa);b=A(a[0])*2.55;c=A(a[1])*2.55;d=A(a[2])*2.55;f=A(a[3])}if(a[6]){a=a[6][H](sa);b=A(a[0]);c=A(a[1]);d=A(a[2]);return m.hsb2rgb(b,c,d)}if(a[7]){a=a[7][H](sa);b=A(a[0])*2.55;c=A(a[1])*2.55;d=A(a[2])*2.55;return m.hsb2rgb(b,c,d)}a={r:b,g:c,b:d};b=(~~b)[N](16);
+c=(~~c)[N](16);d=(~~d)[N](16);b=b[I](ga,"0");c=c[I](ga,"0");d=d[I](ga,"0");a.hex="#"+b+c+d;isFinite(A(f))&&(a.o=f);return a}return{r:-1,g:-1,b:-1,hex:"none",error:1}},m);m.getColor=function(a){a=this.getColor.start=this.getColor.start||{h:0,s:1,b:a||0.75};var b=this.hsb2rgb(a.h,a.s,a.b);a.h+=0.075;if(a.h>1){a.h=0;a.s-=0.2;a.s<=0&&(this.getColor.start={h:0,s:1,b:a.b})}return b.hex};m.getColor.reset=function(){delete this.start};var ub=/([achlmqstvz])[\s,]*((-?\d*\.?\d*(?:e[-+]?\d+)?\s*,?\s*)+)/ig,
+vb=/(-?\d*\.?\d*(?:e[-+]?\d+)?)\s*,?\s*/ig;m.parsePathString=T(function(a){if(!a)return null;var b={a:7,c:6,h:1,l:2,m:2,q:4,s:4,t:2,v:1,z:0},c=[];if(m.is(a,U)&&m.is(a[0],U))c=ta(a);c[o]||(a+s)[I](ub,function(d,f,e){var g=[];d=ca.call(f);e[I](vb,function(h,i){i&&g[E](+i)});if(d=="m"&&g[o]>2){c[E]([f][M](g.splice(0,2)));d="l";f=f=="m"?"l":"L"}for(;g[o]>=b[d];){c[E]([f][M](g.splice(0,b[d])));if(!b[d])break}});c[N]=m._path2string;return c});m.findDotsAtSegment=function(a,b,c,d,f,e,g,h,i){var j=1-i,l=
+D(j,3)*a+D(j,2)*3*i*c+j*3*i*i*f+D(i,3)*g;j=D(j,3)*b+D(j,2)*3*i*d+j*3*i*i*e+D(i,3)*h;var n=a+2*i*(c-a)+i*i*(f-2*c+a),r=b+2*i*(d-b)+i*i*(e-2*d+b),q=c+2*i*(f-c)+i*i*(g-2*f+c),k=d+2*i*(e-d)+i*i*(h-2*e+d);a=(1-i)*a+i*c;b=(1-i)*b+i*d;f=(1-i)*f+i*g;e=(1-i)*e+i*h;h=90-w.atan((n-q)/(r-k))*180/w.PI;(n>q||r1){B=w.sqrt(B);c=B*c;d=B*d}B=c*c;var L=d*d;B=(e==g?-1:1)*w.sqrt(w.abs((B*L-B*x*x-L*k*k)/(B*x*x+L*k*k)));e=B*c*x/d+(a+h)/2;var B=
+B*-d*k/c+(b+i)/2,x=w.asin(((b-B)/d).toFixed(7));k=w.asin(((i-B)/d).toFixed(7));x=ak)x-=l*2;if(!g&&k>x)k-=l*2}l=k-x;if(w.abs(l)>n){q=k;l=h;L=i;k=x+n*(g&&k>x?1:-1);h=e+c*w.cos(k);i=B+d*w.sin(k);q=Qa(h,i,c,d,f,0,g,l,L,[k,q,e,B])}l=k-x;f=w.cos(x);e=w.sin(x);g=w.cos(k);k=w.sin(k);l=w.tan(l/4);c=4/3*c*l;l=4/3*d*l;d=[a,b];a=[a+c*e,b-l*f];b=[h+c*k,i-l*g];h=[h,i];a[0]=2*d[0]-a[0];a[1]=2*d[1]-a[1];if(j)return[a,b,h][M](q);else{q=[a,b,h][M](q)[Q]()[H](",");
+j=[];h=0;for(i=q[o];h1000000000000&&(n=0.5);w.abs(i)>1000000000000&&(i=0.5);if(n>0&&n<1){n=la(a,b,c,d,f,e,g,h,n);q[E](n.x);r[E](n.y)}if(i>
+0&&i<1){n=la(a,b,c,d,f,e,g,h,i);q[E](n.x);r[E](n.y)}i=e-2*d+b-(h-2*e+d);j=2*(d-b)-2*(e-d);l=b-d;n=(-j+w.sqrt(j*j-4*i*l))/2/i;i=(-j-w.sqrt(j*j-4*i*l))/2/i;w.abs(n)>1000000000000&&(n=0.5);w.abs(i)>1000000000000&&(i=0.5);if(n>0&&n<1){n=la(a,b,c,d,f,e,g,h,n);q[E](n.x);r[E](n.y)}if(i>0&&i<1){n=la(a,b,c,d,f,e,g,h,i);q[E](n.x);r[E](n.y)}return{min:{x:$[K](0,q),y:$[K](0,r)},max:{x:Y[K](0,q),y:Y[K](0,r)}}}),ua=T(function(a,b){var c=ka(a),d=b&&ka(b);a={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null};b={x:0,y:0,
+bx:0,by:0,X:0,Y:0,qx:null,qy:null};function f(q,k){var t;if(!q)return["C",k.x,k.y,k.x,k.y,k.x,k.y];!(q[0]in{T:1,Q:1})&&(k.qx=k.qy=null);switch(q[0]){case "M":k.X=q[1];k.Y=q[2];break;case "A":q=["C"][M](Qa[K](0,[k.x,k.y][M](q.slice(1))));break;case "S":t=k.x+(k.x-(k.bx||k.x));k=k.y+(k.y-(k.by||k.y));q=["C",t,k][M](q.slice(1));break;case "T":k.qx=k.x+(k.x-(k.qx||k.x));k.qy=k.y+(k.y-(k.qy||k.y));q=["C"][M](Pa(k.x,k.y,k.qx,k.qy,q[1],q[2]));break;case "Q":k.qx=q[1];k.qy=q[2];q=["C"][M](Pa(k.x,k.y,q[1],
+q[2],q[3],q[4]));break;case "L":q=["C"][M](wa(k.x,k.y,q[1],q[2]));break;case "H":q=["C"][M](wa(k.x,k.y,q[1],k.y));break;case "V":q=["C"][M](wa(k.x,k.y,k.x,q[1]));break;case "Z":q=["C"][M](wa(k.x,k.y,k.X,k.Y));break}return q}function e(q,k){if(q[k][o]>7){q[k].shift();for(var t=q[k];t[o];)q.splice(k++,0,["C"][M](t.splice(0,6)));q.splice(k,1);i=Y(c[o],d&&d[o]||0)}}function g(q,k,t,L,B){if(q&&k&&q[B][0]=="M"&&k[B][0]!="M"){k.splice(B,0,["M",L.x,L.y]);t.bx=0;t.by=0;t.x=q[B][1];t.y=q[B][2];i=Y(c[o],d&&
+d[o]||0)}}for(var h=0,i=Y(c[o],d&&d[o]||0);h0.5)*2-1;D(f-0.5,2)+D(e-0.5,2)>0.25&&(e=w.sqrt(0.25-D(f-0.5,2))*l+0.5)&&e!=0.5&&(e=e.toFixed(5)-1.0E-5*l)}return s});b=b[H](/\s*\-\s*/);if(d=="linear"){var h=b.shift();h=-A(h);if(isNaN(h))return null;h=[0,0,w.cos(h*w.PI/180),w.sin(h*w.PI/180)];var i=1/(Y(w.abs(h[2]),w.abs(h[3]))||1);h[2]*=i;h[3]*=i;if(h[2]<0){h[0]=-h[2];h[2]=0}if(h[3]<0){h[1]=-h[3];h[3]=0}}b=Ra(b);if(!b)return null;
+i=a.getAttribute(aa);(i=i.match(/^url\(#(.*)\)$/))&&c.defs.removeChild(C.getElementById(i[1]));i=v(d+"Gradient");i.id="r"+(m._id++)[N](36);v(i,d=="radial"?{fx:f,fy:e}:{x1:h[0],y1:h[1],x2:h[2],y2:h[3]});c.defs[y](i);c=0;for(h=b[o];cb.height&&(b.height=e.y+e.height-b.y);e.x+e.width-b.x>b.width&&(b.width=e.x+e.width-b.x)}}a&&this.hide();return b};u[p].attr=function(a,b){if(this.removed)return this;if(a==null){a={};for(var c in this.attrs)if(this.attrs[z](c))a[c]=this.attrs[c];this._.rt.deg&&(a.rotation=this.rotate());(this._.sx!=1||this._.sy!=
+1)&&(a.scale=this.scale());a.gradient&&a.fill=="none"&&(a.fill=a.gradient)&&delete a.gradient;return a}if(b==null&&m.is(a,ea)){if(a=="translation")return ya.call(this);if(a=="rotation")return this.rotate();if(a=="scale")return this.scale();if(a==aa&&this.attrs.fill=="none"&&this.attrs.gradient)return this.attrs.gradient;return this.attrs[a]}if(b==null&&m.is(a,U)){b={};c=0;for(var d=a.length;c1&&(a=1);f.opacity=a}b.fill&&(f.on=true);if(f.on==null||b.fill=="none")f.on=false;if(f.on&&b.fill)if(a=b.fill.match(Na)){f.src=a[1];f.type="tile"}else{f.color=m.getRGB(b.fill).hex;f.src=
+s;f.type="solid";if(m.getRGB(b.fill).error&&(g.type in{circle:1,ellipse:1}||(b.fill+s).charAt()!="r")&&ma(g,b.fill)){d.fill="none";d.gradient=b.fill}}e&&c[y](f);f=c.getElementsByTagName("stroke")&&c.getElementsByTagName("stroke")[0];e=false;!f&&(e=f=R("stroke"));if(b.stroke&&b.stroke!="none"||b["stroke-width"]||b["stroke-opacity"]!=null||b["stroke-dasharray"]||b["stroke-miterlimit"]||b["stroke-linejoin"]||b["stroke-linecap"])f.on=true;(b.stroke=="none"||f.on==null||b.stroke==0||b["stroke-width"]==
+0)&&(f.on=false);a=m.getRGB(b.stroke);f.on&&b.stroke&&(f.color=a.hex);a=((+d["stroke-opacity"]+1||2)-1)*((+d.opacity+1||2)-1)*((+a.o+1||2)-1);h=(A(b["stroke-width"])||1)*0.75;a<0&&(a=0);a>1&&(a=1);b["stroke-width"]==null&&(h=d["stroke-width"]);b["stroke-width"]&&(f.weight=h);h&&h<1&&(a*=h)&&(f.weight=1);f.opacity=a;b["stroke-linejoin"]&&(f.joinstyle=b["stroke-linejoin"]||"miter");f.miterlimit=b["stroke-miterlimit"]||8;b["stroke-linecap"]&&(f.endcap=b["stroke-linecap"]=="butt"?"flat":b["stroke-linecap"]==
+"square"?"square":"round");if(b["stroke-dasharray"]){a={"-":"shortdash",".":"shortdot","-.":"shortdashdot","-..":"shortdashdotdot",". ":"dot","- ":"dash","--":"longdash","- .":"dashdot","--.":"longdashdot","--..":"longdashdotdot"};f.dashstyle=a[z](b["stroke-dasharray"])?a[b["stroke-dasharray"]]:s}e&&c[y](f)}if(g.type=="text"){f=g.paper.span.style;d.font&&(f.font=d.font);d["font-family"]&&(f.fontFamily=d["font-family"]);d["font-size"]&&(f.fontSize=d["font-size"]);d["font-weight"]&&(f.fontWeight=d["font-weight"]);
+d["font-style"]&&(f.fontStyle=d["font-style"]);g.node.string&&(g.paper.span.innerHTML=(g.node.string+s)[I](/"));g.W=d.w=g.paper.span.offsetWidth;g.H=d.h=g.paper.span.offsetHeight;g.X=d.x;g.Y=d.y+F(g.H/2);switch(d["text-anchor"]){case "start":g.node.style["v-text-align"]="left";g.bbx=F(g.W/2);break;case "end":g.node.style["v-text-align"]="right";g.bbx=-F(g.W/2);break;default:g.node.style["v-text-align"]="center";break}}};ma=function(a,b){a.attrs=a.attrs||
+{};var c="linear",d=".5 .5";a.attrs.gradient=b;b=(b+s)[I](Ya,function(i,j,l){c="radial";if(j&&l){j=A(j);l=A(l);D(j-0.5,2)+D(l-0.5,2)>0.25&&(l=w.sqrt(0.25-D(j-0.5,2))*((l>0.5)*2-1)+0.5);d=j+P+l}return s});b=b[H](/\s*\-\s*/);if(c=="linear"){var f=b.shift();f=-A(f);if(isNaN(f))return null}var e=Ra(b);if(!e)return null;a=a.shape||a.node;b=a.getElementsByTagName(aa)[0]||R(aa);!b.parentNode&&a.appendChild(b);if(e[o]){b.on=true;b.method="none";b.color=e[0].color;b.color2=e[e[o]-1].color;a=[];for(var g=0,
+h=e[o];g')}}catch(Kb){R=function(a){return C.createElement("<"+a+' xmlns="urn:schemas-microsoft.com:vml" class="rvml">')}}Aa=function(){var a=Sa[K](0,arguments),b=a.container,c=a.height,d=a.width,f=a.x;a=a.y;if(!b)throw new Error("VML container not found.");var e=new G,g=e.canvas=C.createElement("div"),h=g.style;f=f||0;a=a||0;d=d||512;
+c=c||342;d==+d&&(d+="px");c==+c&&(c+="px");e.width=1000;e.height=1000;e.coordsize=ja*1000+P+ja*1000;e.coordorigin="0 0";e.span=C.createElement("span");e.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;";g[y](e.span);h.cssText=m.format("width:{0};height:{1};display:inline-block;position:relative;clip:rect(0 {0} {1} 0);overflow:hidden",d,c);if(b==1){C.body[y](g);h.left=f+"px";h.top=a+"px";h.position="absolute"}else b.firstChild?b.insertBefore(g,
+b.firstChild):b[y](g);Fa.call(e,e,m.fn);return e};G[p].clear=function(){this.canvas.innerHTML=s;this.span=C.createElement("span");this.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;";this.canvas[y](this.span);this.bottom=this.top=null};G[p].remove=function(){this.canvas.parentNode.removeChild(this.canvas);for(var a in this)this[a]=Xa(a);return true}}G[p].safari=/^Apple|^Google/.test(X.navigator.vendor)&&(!(X.navigator.userAgent.indexOf("Version/4.0")+
+1)||X.navigator.platform.slice(0,2)=="iP")?function(){var a=this.rect(-99,-99,this.width+99,this.height+99);X.setTimeout(function(){a.remove()})}:function(){};function Db(){this.returnValue=false}function Eb(){return this.originalEvent.preventDefault()}function Fb(){this.cancelBubble=true}function Gb(){return this.originalEvent.stopPropagation()}var Hb=function(){if(C.addEventListener)return function(a,b,c,d){var f=Ba&&Ca[b]?Ca[b]:b;function e(g){if(Ba&&Ca[z](b))for(var h=0,i=g.targetTouches&&g.targetTouches.length;h<
+i;h++)if(g.targetTouches[h].target==a){i=g;g=g.targetTouches[h];g.originalEvent=i;g.preventDefault=Eb;g.stopPropagation=Gb;break}return c.call(d,g)}a.addEventListener(f,e,false);return function(){a.removeEventListener(f,e,false);return true}};else if(C.attachEvent)return function(a,b,c,d){function f(g){g=g||X.event;g.preventDefault=g.preventDefault||Db;g.stopPropagation=g.stopPropagation||Fb;return c.call(d,g)}a.attachEvent("on"+b,f);function e(){a.detachEvent("on"+b,f);return true}return e}}();for(ha=
+Ma[o];ha--;)(function(a){m[a]=u[p][a]=function(b){if(m.is(b,"function")){this.events=this.events||[];this.events.push({name:a,f:b,unbind:Hb(this.shape||this.node||C,a,b,this)})}return this};m["un"+a]=u[p]["un"+a]=function(b){for(var c=this.events,d=c[o];d--;)if(c[d].name==a&&c[d].f==b){c[d].unbind();c.splice(d,1);!c.length&&delete this.events;return this}return this}})(Ma[ha]);u[p].hover=function(a,b){return this.mouseover(a).mouseout(b)};u[p].unhover=function(a,b){return this.unmouseover(a).unmouseout(b)};
+u[p].drag=function(a,b,c){this._drag={};var d=this.mousedown(function(g){(g.originalEvent?g.originalEvent:g).preventDefault();this._drag.x=g.clientX;this._drag.y=g.clientY;this._drag.id=g.identifier;b&&b.call(this,g.clientX,g.clientY);Raphael.mousemove(f).mouseup(e)});function f(g){var h=g.clientX,i=g.clientY;if(Ba)for(var j=g.touches.length,l;j--;){l=g.touches[j];if(l.identifier==d._drag.id){h=l.clientX;i=l.clientY;(g.originalEvent?g.originalEvent:g).preventDefault();break}}else g.preventDefault();
+a&&a.call(d,h-d._drag.x,i-d._drag.y,h,i)}function e(){d._drag={};Raphael.unmousemove(f).unmouseup(e);c&&c.call(d)}return this};G[p].circle=function(a,b,c){return ab(this,a||0,b||0,c||0)};G[p].rect=function(a,b,c,d,f){return bb(this,a||0,b||0,c||0,d||0,f||0)};G[p].ellipse=function(a,b,c,d){return cb(this,a||0,b||0,c||0,d||0)};G[p].path=function(a){a&&!m.is(a,ea)&&!m.is(a[0],U)&&(a+=s);return Za(m.format[K](m,arguments),this)};G[p].image=function(a,b,c,d,f){return db(this,a||"about:blank",b||0,c||0,
+d||0,f||0)};G[p].text=function(a,b,c){return eb(this,a||0,b||0,c||s)};G[p].set=function(a){arguments[o]>1&&(a=Array[p].splice.call(arguments,0,arguments[o]));return new Z(a)};G[p].setSize=fb;G[p].top=G[p].bottom=null;G[p].raphael=m;function ib(){return this.x+P+this.y}u[p].resetScale=function(){if(this.removed)return this;this._.sx=1;this._.sy=1;this.attrs.scale="1 1"};u[p].scale=function(a,b,c,d){if(this.removed)return this;if(a==null&&b==null)return{x:this._.sx,y:this._.sy,toString:ib};b=b||a;!+b&&
+(b=a);var f,e,g=this.attrs;if(a!=0){var h=this.getBBox(),i=h.x+h.width/2,j=h.y+h.height/2;f=a/this._.sx;e=b/this._.sy;c=+c||c==0?c:i;d=+d||d==0?d:j;h=~~(a/w.abs(a));var l=~~(b/w.abs(b)),n=this.node.style,r=c+(i-c)*f;j=d+(j-d)*e;switch(this.type){case "rect":case "image":var q=g.width*h*f,k=g.height*l*e;this.attr({height:k,r:g.r*$(h*f,l*e),width:q,x:r-q/2,y:j-k/2});break;case "circle":case "ellipse":this.attr({rx:g.rx*h*f,ry:g.ry*l*e,r:g.r*$(h*f,l*e),cx:r,cy:j});break;case "text":this.attr({x:r,y:j});
+break;case "path":i=Oa(g.path);for(var t=true,L=0,B=i[o];L=i)return r;l=r}});function Ha(a,b){return function(c,d,f){c=ua(c);
+for(var e,g,h,i,j="",l={},n=0,r=0,q=c.length;rd){if(b&&!l.start){e=jb(e,g,h[1],h[2],h[3],h[4],h[5],h[6],d-n);j+=["C",e.start.x,e.start.y,e.m.x,e.m.y,e.x,e.y];if(f)return j;l.start=j;j=["M",e.x,e.y+"C",e.n.x,e.n.y,e.end.x,e.end.y,h[5],h[6]][Q]();n+=i;e=+h[5];g=+h[6];continue}if(!a&&!b){e=jb(e,g,h[1],h[2],h[3],h[4],h[5],h[6],d-n);return{x:e.x,y:e.y,alpha:e.alpha}}}n+=i;e=+h[5];g=+h[6]}j+=h}l.end=j;e=a?n:
+b?l:m.findDotsAtSegment(e,g,h[1],h[2],h[3],h[4],h[5],h[6],1);e.alpha&&(e={x:e.x,y:e.y,alpha:e.alpha});return e}}var Ib=T(function(a,b,c,d,f,e,g,h){for(var i={x:0,y:0},j=0,l=0;l<1.01;l+=0.01){var n=la(a,b,c,d,f,e,g,h,l);l&&(j+=D(D(i.x-n.x,2)+D(i.y-n.y,2),0.5));i=n}return j}),kb=Ha(1),za=Ha(),Ia=Ha(0,1);u[p].getTotalLength=function(){if(this.type=="path"){if(this.node.getTotalLength)return this.node.getTotalLength();return kb(this.attrs.path)}};u[p].getPointAtLength=function(a){if(this.type=="path")return za(this.attrs.path,
+a)};u[p].getSubpath=function(a,b){if(this.type=="path"){if(w.abs(this.getTotalLength()-b)<1.0E-6)return Ia(this.attrs.path,a).end;b=Ia(this.attrs.path,b,1);return a?Ia(b,a).end:b}};m.easing_formulas={linear:function(a){return a},"<":function(a){return D(a,3)},">":function(a){return D(a-1,3)+1},"<>":function(a){a*=2;if(a<1)return D(a,3)/2;a-=2;return(D(a,3)+2)/2},backIn:function(a){var b=1.70158;return a*a*((b+1)*a-b)},backOut:function(a){a-=1;var b=1.70158;return a*a*((b+1)*a+b)+1},elastic:function(a){if(a==
+0||a==1)return a;var b=0.3,c=b/4;return D(2,-10*a)*w.sin((a-c)*2*w.PI/b)+1},bounce:function(a){var b=7.5625,c=2.75;if(a<1/c)a=b*a*a;else if(a<2/c){a-=1.5/c;a=b*a*a+0.75}else if(a<2.5/c){a-=2.25/c;a=b*a*a+0.9375}else{a-=2.625/c;a=b*a*a+0.984375}return a}};var S={length:0};function lb(){var a=+new Date;for(var b in S)if(b!="length"&&S[z](b)){var c=S[b];if(c.stop||c.el.removed){delete S[b];S[o]--}else{var d=a-c.start,f=c.ms,e=c.easing,g=c.from,h=c.diff,i=c.to,j=c.t,l=c.prev||0,n=c.el,r=c.callback,q=
+{},k;if(dli').get(0).mynode = $('body').addRootNode($('#navigator>li>a').text(), {
+ href:'/',
+ url:'/',
+ onclick:function(node) {
+ $(node.obj.activeNode.content).each(function() {
+ this.hide();
+ });
+ }
+ });
+ $('#navigator>li').hide();
+ var addLI = function() {
+ var parentnode = $(this).parents('li').get(0);
+ if (typeof(parentnode)=='undefined') parentnode=root;
+ else parentnode=parentnode.mynode;
+
+ this.mynode = $('body').addNode(parentnode, $('a:eq(0)',this).text(), {
+// href:$('a:eq(0)',this).text().toLowerCase(),
+ href:$('a:eq(0)',this).attr('href'),
+ onclick:function(node) {
+ $(node.obj.activeNode.content).each(function() {
+ this.hide();
+ });
+ $(node.content).each(function() {
+ this.show();
+ });
+ }
+ });
+ $(this).hide();
+ $('>ul>li', this).each(addLI);
+ };
+ $('#navigator>li>ul').each(function() {
+ $('>li', this).each(addLI);
+ });
+
+});
\ No newline at end of file
diff --git a/public/navigator/style.css b/public/navigator/style.css
new file mode 100644
index 00000000..fa70caac
--- /dev/null
+++ b/public/navigator/style.css
@@ -0,0 +1,18 @@
+body {
+ background: #cccccc;
+}
+.js-mindmap-active a.node {
+ background: #03A9F4;
+ color: white;
+ border: 2px solid white;
+ border-radius: 20px;
+}
+.js-mindmap-active a.node.active {
+ padding: 5px 10px !important;
+ border-width: 5px !important;
+}
+.js-mindmap-active a.node.activeparent {
+ padding: 5px 10px !important;
+ border: 5px solid #222299;
+ background: #039BE5;
+}