1 /**
  2  * @namespace
  3  */
  4 mindmaps.Util = mindmaps.Util || {};
  5 
  6 /**
  7  * Creates a UUID in compliance with RFC4122.
  8  * 
  9  * @static
 10  * @returns {String} a unique id
 11  */
 12 mindmaps.Util.createUUID = function() {
 13 	// http://www.ietf.org/rfc/rfc4122.txt
 14 	return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
 15 		var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
 16 		return v.toString(16);
 17 	});
 18 };
 19 
 20 /**
 21  * Returns an ID used by model objects.
 22  * 
 23  * @returns {String} id
 24  */
 25 mindmaps.Util.getId = function() {
 26 	return mindmaps.Util.createUUID();
 27 };
 28 
 29 /**
 30  * Creates a random color.
 31  * 
 32  * @returns {String} color in hex format
 33  */
 34 mindmaps.Util.randomColor = function() {
 35 	// http://stackoverflow.com/questions/1484506/random-color-generator-in-javascript/5365036#5365036
 36 	// return "#"+((1<<24)*Math.random()|0).toString(16);
 37 
 38 	// http://paulirish.com/2009/random-hex-color-code-snippets/#comment-34808
 39 	// return '#'+~~(Math.random()*(1<<24)).toString(16);
 40 
 41 	// http://paulirish.com/2009/random-hex-color-code-snippets/#comment-34878
 42 	return (function(h) {
 43 		return '#000000'.substr(0, 7 - h.length) + h;
 44 	})((~~(Math.random() * (1 << 24))).toString(16));
 45 };
 46 
 47 function timeit(func, caption) {
 48 	var start = new Date().getTime();
 49 	func();
 50 	var stop = new Date().getTime();
 51 	var diff = stop - start;
 52 	console.log(caption || "", diff, "ms");
 53 }
 54 
 55 mindmaps.Util.distance = function(offsetX, offsetY) {
 56 	return Math.sqrt(offsetX * offsetX + offsetY * offsetY);
 57 };
 58 
 59 
 60 /**
 61  * test Default documents
 62  */
 63 
 64 function getBinaryMapWithDepth(depth) {
 65 	var mm = new mindmaps.MindMap();
 66 	var root = mm.root;
 67 
 68 	function createTwoChildren(node, depth) {
 69 		if (depth === 0) {
 70 			return;
 71 		}
 72 
 73 		var left = mm.createNode();
 74 		left.text.caption = "Node " + left.id;
 75 		node.addChild(left);
 76 		createTwoChildren(left, depth - 1);
 77 
 78 		var right = mm.createNode();
 79 		right.text.caption = "Node " + right.id;
 80 		node.addChild(right);
 81 		createTwoChildren(right, depth - 1);
 82 	}
 83 
 84 	// depth 10: about 400kb, 800kb in chrome
 85 	// depth 12: about 1600kb
 86 	// depth 16: 25mb
 87 	var depth = depth || 10;
 88 	createTwoChildren(root, depth);
 89 
 90 	// generate positions for all nodes.
 91 	// tree grows balanced from left to right
 92 	root.offset = new mindmaps.Point(400, 400);
 93 	// var offset = Math.pow(2, depth-1) * 10;
 94 	var offset = 80;
 95 	var c = root.children.values();
 96 	setOffset(c[0], 0, -offset);
 97 	setOffset(c[1], 0, offset);
 98 	function setOffset(node, depth, offsetY) {
 99 		node.offset = new mindmaps.Point((depth + 1) * 50, offsetY);
100 
101 		if (node.isLeaf()) {
102 			return;
103 		}
104 
105 		var c = node.children.values();
106 		var left = c[0];
107 		setOffset(left, depth + 1, offsetY - offsetY / 2);
108 
109 		var right = c[1];
110 		setOffset(right, depth + 1, offsetY + offsetY / 2);
111 	}
112 
113 	// color nodes
114 	c[0].branchColor = mindmaps.Util.randomColor();
115 	c[0].forEachDescendant(function(node) {
116 		node.branchColor = mindmaps.Util.randomColor();
117 	});
118 	c[1].branchColor = mindmaps.Util.randomColor();
119 	c[1].forEachDescendant(function(node) {
120 		node.branchColor = mindmaps.Util.randomColor();
121 	});
122 
123 	return mm;
124 }
125 
126 /**
127  * <pre>
128  * 		    r
129  *    /     |        \
130  *   0		1		  2
131  * 		   / \     / | \  \
132  *    	  10  11  20 21 22 23
133  *        |
134  *        100
135  *        |
136  *        1000
137  * </pre>
138  */
139 function getDefaultTestMap() {
140 	var mm = new mindmaps.MindMap();
141 	var root = mm.root;
142 
143 	var n0 = mm.createNode();
144 	var n1 = mm.createNode();
145 	var n2 = mm.createNode();
146 	root.addChild(n0);
147 	root.addChild(n1);
148 	root.addChild(n2);
149 
150 	var n10 = mm.createNode();
151 	var n11 = mm.createNode();
152 	n1.addChild(n10);
153 	n1.addChild(n11);
154 
155 	var n20 = mm.createNode();
156 	var n21 = mm.createNode();
157 	var n22 = mm.createNode();
158 	var n23 = mm.createNode();
159 	n2.addChild(n20);
160 	n2.addChild(n21);
161 	n2.addChild(n22);
162 	n2.addChild(n23);
163 
164 	var n100 = mm.createNode();
165 	n10.addChild(n100);
166 
167 	var n1000 = mm.createNode();
168 	n100.addChild(n1000);
169 
170 	return mm;
171 }
172 
173 function getDefaultTestDocument() {
174 	var doc = new mindmaps.Document();
175 	doc.title = "test document";
176 	doc.mindmap = getDefaultTestMap();
177 
178 	return doc;
179 }
180 
181 function getSimpleMap() {
182 	var mm = new mindmaps.MindMap();
183 	var root = mm.root;
184 
185 	var n0 = mm.createNode();
186 	var n1 = mm.createNode();
187 	root.addChild(n0);
188 	root.addChild(n1);
189 
190 	return mm;
191 }