Removed baked html files. Added menu highlighting.
1 var QUOTES_NUMBER = 39;
2 var SERVER = "http://" + window.location.hostname + ":" + window.location.port;
6 $(document).ready(function() {
7 simulation = new Simulation(document.getElementById("sim"),
8 670, 50, 6, green, background);
9 var image = new Image();
10 image.onload = init_logo;
11 image.src = "images/logobase.png";
12 $("#logo").click(handle_click);
13 $("#logo").hover(function(event) {
14 $(this).css("cursor", "pointer");
16 $(this).css("cursor", "auto");
18 $("#logo").mousemove(function(event) { handle_hover(event); });
19 $("#logo").mouseout(function(event) { handle_mouse_out(event); });
20 $("#sim").mousemove(function(event) { simulation.mouse_moved(mouse_pos(event, "#sim")); });
22 if (window.webkitRequestAnimationFrame) {
23 onEachFrame = function(cb) {
24 var _cb = function() { cb(); webkitRequestAnimationFrame(_cb); }
27 } else if (window.mozRequestAnimationFrame) {
28 onEachFrame = function(cb) {
29 var _cb = function() { cb(); mozRequestAnimationFrame(_cb); }
33 onEachFrame = function(cb) {
34 setInterval(cb, 1000 / 30);
37 window.onEachFrame = onEachFrame;
38 window.onEachFrame(update);
39 var pos = document.location.href.lastIndexOf("/") + 1;
40 var page = document.location.href.substr(pos);
41 if (page == "mandelbrot.html") {
43 } else if (page == "" || page == "index.html") {
44 init_gameoflife("ME73");
45 } else if (page == "gameoflife.html") {
50 $(document).keypress(function(event) {
51 if (event.which == 13) {
52 event.preventDefault();
58 var menu_height = 100;
59 var menu_splits = new Array(180, 350, 505);
61 var click_events = new Array();
62 click_events["logo"] = new Array();
63 click_events["logo"][0] = new Object();
64 click_events["logo"][0]["min_x"] = 0;
65 click_events["logo"][0]["max_x"] = menu_splits[0];
66 click_events["logo"][0]["min_y"] = 0;
67 click_events["logo"][0]["max_y"] = menu_height;
68 click_events["logo"][0]["func"] = switch_page;
69 click_events["logo"][0]["args"] = new Array("personalwork.html");
70 click_events["logo"][1] = new Object();
71 click_events["logo"][1]["min_x"] = menu_splits[0] + 1;
72 click_events["logo"][1]["max_x"] = menu_splits[1];
73 click_events["logo"][1]["min_y"] = 0;
74 click_events["logo"][1]["max_y"] = menu_height;
75 click_events["logo"][1]["func"] = switch_page;
76 click_events["logo"][1]["args"] = new Array("howiwork.html");
77 click_events["logo"][2] = new Object();
78 click_events["logo"][2]["min_x"] = menu_splits[1] + 1;
79 click_events["logo"][2]["max_x"] = menu_splits[2];
80 click_events["logo"][2]["min_y"] = 0;
81 click_events["logo"][2]["max_y"] = menu_height;
82 click_events["logo"][2]["func"] = switch_page;
83 click_events["logo"][2]["args"] = new Array("books.html");
84 click_events["logo"][3] = new Object();
85 click_events["logo"][3]["min_x"] = menu_splits[2] + 1;
86 click_events["logo"][3]["max_x"] = menu_width - 1;
87 click_events["logo"][3]["min_y"] = 0;
88 click_events["logo"][3]["max_y"] = menu_height;
89 click_events["logo"][3]["func"] = switch_page;
90 click_events["logo"][3]["args"] = new Array("links.html", "linksend.html");
92 function mouse_pos(event, id) {
93 var offset = $(id).offset();
94 return new Array(event.pageX - offset.left,
95 event.pageY - offset.top);
98 function handle_click(event) {
99 var xy = mouse_pos(event, "#logo");
102 for (var i in click_events[event.target.id]) {
103 var ces = click_events[event.target.id][i];
104 if (ces && x >= ces["min_x"] && x <= ces["max_x"]
105 && y >= ces["min_y"] && y <= ces["max_y"]) {
106 ces["func"](event.target.id, ces);
107 last_colours[0] = black;
113 function handle_hover(event) {
114 var xy = mouse_pos(event, "#logo");
117 for (var i in click_events[event.target.id]) {
118 var ces = click_events[event.target.id][i];
119 if (ces && x >= ces["min_x"] && x <= ces["max_x"]
120 && y >= ces["min_y"] && y <= ces["max_y"]) {
121 highlight_menu(event.target.id, ces);
127 function handle_mouse_out(event) {
128 highlight_menu(event.target.id, null);
131 function switch_page(id, params) {
132 var page = params["args"][0];
133 $("body").load(page);
134 document.location.href = page;
137 var last_colours = new Array();
138 function highlight_menu(id, p) {
139 if (last_highlight == p) {
142 var canvas = document.getElementById("logo");
143 var context = canvas.getContext("2d");
144 var image = context.getImageData(0, 0, menu_width, menu_height);
145 if (last_highlight && last_colours && last_colours[0] && last_colours[1]) {
146 page = last_highlight["args"][0];
147 min_x = last_highlight["min_x"];
148 max_x = last_highlight["max_x"];
149 min_y = last_highlight["min_y"];
150 max_y = last_highlight["max_y"];
151 colour_area(image, min_x + 10, max_x - 10, 0, 60,
153 colour_area(image, min_x + 10, max_x - 10, 60, max_y - 10,
157 var page = p["args"][0];
158 var min_x = p["min_x"];
159 var max_x = p["max_x"];
160 var min_y = p["min_y"];
161 var max_y = p["max_y"];
162 last_colours[0] = colour_area(image, min_x + 10, max_x - 10, 0, 60,
164 last_colours[1] = colour_area(image, min_x + 10, max_x - 10, 60, max_y - 10,
168 context.putImageData(image, 0, 0);
172 function colour_area(image, min_x, max_x, min_y, max_y, colour) {
173 var pixels = image.data;
175 for (var y = min_y; y <= max_y; y += 1) {
176 for (var x = min_x; x <= max_x; x += 1) {
177 var pix_colour = getPixel(image, x, y);
178 if (pix_colour.a > 0) {
179 colour.a = pix_colour.a;
180 setPixel(image, x, y, colour);
181 if (pix_colour.a == 255) {
182 old_colour = new Colour(pix_colour.r,
193 function init_logo(event) {
194 var canvas = document.getElementById("logo");
195 var context = canvas.getContext("2d");
196 canvas.width = menu_width;
197 canvas.height = menu_height;
198 context.drawImage(event.target, 0, 0);
199 var image = context.getImageData(0, 0, menu_width, menu_height);
200 for (var i in click_events["logo"]) {
201 var p = click_events["logo"][i];
202 var min_x = p["min_x"];
203 var max_x = p["max_x"];
204 var min_y = p["min_y"];
205 var max_y = p["max_y"];
206 var pos = document.location.href.lastIndexOf("/") + 1;
207 var page = document.location.href.substr(pos);
208 for (var j in p["args"]) {
209 if (page == p["args"][j]) {
210 colour_area(image, min_x, max_x, 0, 60, black);
211 colour_area(image, min_x, max_x, 60, max_y, white);
215 colour_area(image, min_x, max_x, 0, 60, white);
216 colour_area(image, min_x, max_x, 60, max_y, orange);
220 context.putImageData(image, 0, 0);
221 // context.fillStyle = green.str();
222 // console.log((found["max_x"] - found["min_x"]) / 2 + found["min_x"] - 2);
223 // context.fillRect((found["max_x"]-found["min_x"])/2+found["min_x"]-1, 95, 2, 5);
227 function draw_menu_lines() {
228 var canvas = document.getElementById("logo");
229 var context = canvas.getContext("2d");
230 var image = context.getImageData(0, 0, menu_width, menu_height);
231 var pixels = image.data;
232 context.lineCap = "round";
233 context.lineWidth = 1;
234 var colour1a = new Colour(0, 0, 0, 0.1);
236 context.moveTo(0, menu_height - 1);
237 context.lineTo(menu_width - 1, menu_height - 1);
239 context.strokeStyle = colour1a.str();
241 var colour1e = new Colour(0, 0, 0, 0.05);
243 context.moveTo(70, menu_height - 1);
244 context.lineTo(menu_width - 71, menu_height - 1);
246 context.strokeStyle = colour1e.str();
248 var colour1b = new Colour(0, 0, 0, 0.05);
250 context.moveTo(50, menu_height - 1);
251 context.lineTo(menu_width - 51, menu_height - 1);
253 context.strokeStyle = colour1b.str();
255 var colour1c = new Colour(0, 0, 0, 0.05);
257 context.moveTo(25, menu_height - 1);
258 context.lineTo(menu_width - 26, menu_height - 1);
260 context.strokeStyle = colour1c.str();
262 var colour1d = new Colour(0, 0, 0, 0.05);
264 context.moveTo(10, menu_height - 1);
265 context.lineTo(menu_width - 11, menu_height - 1);
267 context.strokeStyle = colour1d.str();
270 var colour2 = new Colour(0, 0, 0, 0.2);
272 context.moveTo(menu_splits[0], 0);
273 context.lineTo(menu_splits[0], menu_height - 1);
274 context.moveTo(menu_splits[1], 0);
275 context.lineTo(menu_splits[1], menu_height - 1);
276 context.moveTo(menu_splits[2], 0);
277 context.lineTo(menu_splits[2], menu_height - 1);
279 context.strokeStyle = colour2.str();
282 context.clearRect(menu_splits[0] - 1, menu_height - 1, 2, 2);
283 context.clearRect(menu_splits[1] - 1, menu_height - 1, 2, 2);
284 context.clearRect(menu_splits[2] - 1, menu_height - 1, 2, 2);
286 context.clearRect(menu_splits[0] - 1, menu_height - 2, 1, 1);
287 context.clearRect(menu_splits[1] - 1, menu_height - 2, 1, 1);
288 context.clearRect(menu_splits[2] - 1, menu_height - 2, 1, 1);
291 function clearMenuLines() {
292 var canvas = document.getElementById("logo");
293 var context = canvas.getContext("2d");
294 var image = context.getImageData(0, 0, menu_width, menu_height);
295 var pixels = image.data;
296 context.clearRect(0, menu_height - 2, menu_width - 1, 2);
297 context.clearRect(menu_splits[0] - 1, 0, 2, menu_height - 1);
298 context.clearRect(menu_splits[1] - 1, 0, 2, menu_height - 1);
299 context.clearRect(menu_splits[2] - 1, 0, 2, menu_height - 1);
302 function draw_sim_lines() {
305 var canvas = document.getElementById("sim");
306 var context = canvas.getContext("2d");
307 var image = context.getImageData(0, 0, w, h);
308 var pixels = image.data;
309 context.lineCap = "round";
310 context.lineWidth = 1;
311 var colour1a = new Colour(0, 0, 0, 0.1);
313 context.moveTo(0, h - 1);
314 context.lineTo(w - 1, h - 1);
316 context.strokeStyle = colour1a.str();
318 var colour1e = new Colour(0, 0, 0, 0.05);
320 context.moveTo(70, h - 1);
321 context.lineTo(w - 71, h - 1);
323 context.strokeStyle = colour1e.str();
325 var colour1b = new Colour(0, 0, 0, 0.05);
327 context.moveTo(50, h - 1);
328 context.lineTo(w - 51, h - 1);
330 context.strokeStyle = colour1b.str();
332 var colour1c = new Colour(0, 0, 0, 0.05);
334 context.moveTo(25, h - 1);
335 context.lineTo(w - 26, h - 1);
337 context.strokeStyle = colour1c.str();
339 var colour1d = new Colour(0, 0, 0, 0.05);
341 context.moveTo(10, h - 1);
342 context.lineTo(w - 11, h - 1);
344 context.strokeStyle = colour1d.str();
348 function update_logo() {
349 var canvas = document.getElementById("logo");
350 var context = canvas.getContext("2d");
351 var image = context.getImageData(0, 0, menu_width, menu_height);
352 var pixels = image.data;
353 var white = new Colour(255, 255, 255);
354 for (var y = 0; y < menu_height; y += 1) {
355 for (var x = 0; x < menu_width; x += 1) {
356 var pix_colour = getPixel(image, x, y);
357 if (pix_colour.a > 0) {
358 setPixel(image, x, y, new Colour(90, 215, 21, pix_colour.a));
362 context.putImageData(image, 0, 0);
365 var char_map = new Array();
366 char_map["A"] = new Array(new Array(0, 4), new Array(1, 3),
367 new Array(2, 2), new Array(3, 1),
368 new Array(4, 0), new Array(5, 1),
369 new Array(6, 2), new Array(7, 3),
370 new Array(8, 4), new Array(2, 3),
371 new Array(3, 3), new Array(4, 3),
372 new Array(5, 3), new Array(6, 3));
373 char_map["M"] = new Array(new Array(0, 4), new Array(0, 3),
374 new Array(0, 2), new Array(0, 1),
375 new Array(0, 0), new Array(0, 5),
376 new Array(5, 4), new Array(5, 3),
377 new Array(5, 2), new Array(5, 1),
378 new Array(5, 0), new Array(5, 5),
379 new Array(1, 1), new Array(2, 2),
380 new Array(4, 2), new Array(5, 1),
382 char_map["E"] = new Array(new Array(0, 4), new Array(0, 3),
383 new Array(0, 2), new Array(0, 1),
384 new Array(0, 0), new Array(0, 5),
385 new Array(1, 0), new Array(2, 0),
387 new Array(1, 3), new Array(2, 3),
388 new Array(1, 5), new Array(2, 5),
390 char_map["7"] = new Array(new Array(0, 0), new Array(1, 0),
392 new Array(0, 5), new Array(0, 4),
393 new Array(1, 3), new Array(2, 2));
394 char_map["3"] = new Array(new Array(2, 4), new Array(2, 3),
395 new Array(2, 2), new Array(2, 1),
396 new Array(0, 0), new Array(0, 5),
397 new Array(1, 0), new Array(2, 0),
398 new Array(1, 3), new Array(2, 3),
399 new Array(1, 5), new Array(2, 5))
401 function init_gameoflife(text) {
402 var canvas = document.getElementById("gameoflife");
405 gameoflife = new Simulation(canvas, 670, 670, cell_size,
407 $("#gameoflife").mousemove(function(event) {
408 gameoflife.mouse_moved(mouse_pos(event, "#gameoflife"));
410 var offset = new Array(13, 16);
411 for (var c in text) {
413 for (p in char_map[text[c]]) {
414 var x = char_map[text[c]][p][0];
415 var y = char_map[text[c]][p][1];
417 var pos = new Array((x + offset[0]) * cell_size,
418 (y + offset[1]) * cell_size);
419 gameoflife.activate_cell(pos);
426 function Colour(r, g, b, a) {
430 this.a = a == undefined ? 255 : a;
432 Colour.prototype.equals = function(rhs) {
434 if (typeof(rhs[p]) == undefined
435 || this[p] != rhs[p]) {
441 Colour.prototype.str = function() {
442 return "rgba(" + this.r + "," + this.g + "," + this.b + "," + this.a + ")";
445 var white = new Colour(255, 255, 255);
446 var black = new Colour(0, 0, 0, 255);
447 var orange = new Colour(201, 87, 35, 255);
448 var green = new Colour(90, 215, 21, 255);
449 var background = new Colour(34, 34, 34, 255);
451 function setPixel(image, x, y, colour) {
452 var index = 4 * (x + y * image.width);
453 image.data[index] = colour.r;
454 image.data[index + 1] = colour.g;
455 image.data[index + 2] = colour.b;
456 image.data[index + 3] = colour.a;
459 function getPixel(image, x, y) {
460 var index = 4 * (x + y * image.width);
461 var r = image.data[index];
462 var g = image.data[index + 1];
463 var b = image.data[index + 2];
464 var a = image.data[index + 3];
465 return new Colour(r, g, b, a);
468 function load_random_quote() {
469 var file = "/quotes/quote" + Math.floor(Math.random() * QUOTES_NUMBER + 1) + ".html";
470 $.ajax({url: SERVER + file,
471 success: write_quote});
474 function write_quote(data, status, xhr) {
475 $("#random_quote").html(data);
478 function load_footer()
480 var file = "/footer.html";
481 var currentFile = self.location.hostname + self.location.pathname;
482 var request = http_request_object();
483 var url = "http://" + self.location.hostname + file;
484 request.open("GET", url, false);
485 request.setRequestHeader("User-Agent", navigator.userAgent);
487 // if (oRequest.status == 200) alert(oRequest.responseText);
488 // else alert("Error executing XMLHttpRequest call!");
489 //document.write(url);
490 //document.write(request.responseText);
491 document.getElementById('footer').innerHTML = request.responseText;
496 // Mandelbrot functions
497 function Complex(real, imag)
503 var MIN_C = new Complex(-2.2, -1.4);
504 var MAX_C = new Complex(1.0, 1.4);
508 var max_iter = MIN_ITER;
513 function Result(z, iter)
519 function complex_quad(c)
521 return new Complex(Math.pow(c.real, 2) - Math.pow(c.imag, 2),
522 2.0 * c.real * c.imag);
525 function complex_quad_value(c)
527 return Math.pow(c.real, 2) + Math.pow(c.imag, 2);
530 function complex_add(c1, c2)
532 return new Complex(c1.real + c2.real, c1.imag + c2.imag);
535 function complex_equal(c1, c2)
537 return (c1.real == c2.real) && (c1.imag == c2.imag);
540 function iterate(z, c)
542 z_quad = complex_quad(z);
543 return new Complex(z_quad.real + c.real, z_quad.imag + c.imag);
546 function test(c, max_iter)
549 var z = new Complex(0.0, 0.0);
550 var last_z = new Complex(-1.0, 0.0);
551 var quad_z = complex_quad_value(z);
553 while (iter < max_iter
554 && !complex_equal(z, last_z)
555 && quad_z <= bailout)
559 quad_z = complex_quad_value(z);
562 return new Result(quad_z, iter);
565 function draw(diter, dx, dy, dz, dres)
567 var canvas = document.getElementById('mandelbrot');
569 if (canvas.getContext)
572 var ctx = canvas.getContext('2d');
576 resolution = Math.max(1, resolution + dres);
581 max_iter = Math.max(MIN_ITER, max_iter + diter);
584 var red = "rgb(255, 0, 0)";
585 var white = "rgb(255, 255, 255)";
586 var width = canvas.width;
587 var height = canvas.height;
588 var dim = Math.max(width, height);
589 var dim_ratio = Math.round(width / height);
590 var diff_c = new Complex(max_c.real - min_c.real,
591 max_c.imag - min_c.imag);
592 dx_min = diff_c.real / 100 * (dx + dz);
593 dx_max = diff_c.real / 100 * (dx - dz);
595 dy_min = diff_c.imag / 100 * (dy + dz);
596 dy_max = diff_c.imag / 100 * (dy - dz);
598 var min_inc = new Complex(dx_min * dim_ratio / 2.0, dy_min);
599 var max_inc = new Complex(dx_max * dim_ratio / 2.0, dy_max);
600 min_c = complex_add(min_c, min_inc);
601 max_c = complex_add(max_c, max_inc);
602 diff_c = new Complex(max_c.real - min_c.real,
603 max_c.imag - min_c.imag);
605 for (var y = 0; y < height; y += resolution)
607 for (var x = 0; x < width; x += resolution)
609 var c = new Complex(min_c.real + diff_c.real / dim * x,
610 min_c.imag + diff_c.imag / dim * y);
611 var result = test(c, max_iter);
612 var r = Math.min(255, Math.pow(Math.max(0,
613 (result.iter - max_iter / 20.0)), 2));
614 var g = Math.min(255, Math.pow(Math.max(0,
615 (result.iter - max_iter / 25.0)), 2));
616 var b = Math.min(255, Math.pow(Math.max(0,
617 (result.iter - max_iter / 20.0)), 2));
618 var colour = "rgb(" + r + "," + g + "," + b + ")";
619 ctx.fillStyle = colour;
620 ctx.fillRect(x, y, resolution, resolution);
626 function getEventOffsetX(evt)
628 if (evt.offsetX != null)
631 var obj = evt.target || evt.srcElement;
633 return (evt.clientX - obj.pageLeft);
636 function getEventOffsetY(evt)
638 if (evt.offsetY != null)
641 var obj = evt.target || evt.srcElement;
643 return (evt.clientY - obj.pageTop);
646 function setPageTopLeft( o )
652 while (o.offsetParent)
654 left += o.offsetLeft ;
663 function draw2(evt) {
666 var x = (getEventOffsetX(evt) - 335) / 167.5;
667 var y = (getEventOffsetY(evt) - 140) / 70;
669 draw(iter, x, y, z, res);
681 function Grid(width, height, cell_size) {
682 this.width = parseInt(width / cell_size + 0.5);
683 this.height = parseInt(height / cell_size + 0.5);
684 this.canvas_width = width;
685 this.canvas_height = height;
686 this.cell_size = cell_size;
687 this.cells = new Array();
688 for (var y = 0; y < this.height; ++y) {
689 this.cells[y] = new Array();
690 for (var x = 0; x < this.width; ++x) {
691 this.cells[y][x] = new Cell(x, y, 0, this);
695 Grid.prototype.cell = function(x, y) {
696 return this.cells[y][x];
698 Grid.prototype.pick_cell = function(x, y) {
699 var lx = parseInt(x / this.cell_size - 0.5);
700 var ly = parseInt(y / this.cell_size - 0.5);
701 return this.cells[ly][lx];
704 function Cell(x, y, value, grid) {
707 this.canvas_x = x * grid.cell_size;
708 this.canvas_y = y * grid.cell_size;
711 this._neighbours = new Array();
714 Cell.prototype.hash = function() {
715 return this.x + ", " + this.y;
717 Cell.prototype.set_value = function(value) {
719 this.last_mod = $.now();
721 Cell.prototype.neighbours = function() {
722 if (this._neighbours.length) {
723 return this._neighbours;
726 this._neighbours.push(this.grid.cell(this.x-1, this.y));
728 this._neighbours.push(this.grid.cell(this.x-1, this.y-1));
729 this._neighbours.push(this.grid.cell(this.x, this.y-1));
731 if (this.y + 1 < this.grid.height) {
732 this._neighbours.push(this.grid.cell(this.x-1, this.y+1));
735 if (this.x + 1 < this.grid.width) {
736 this._neighbours.push(this.grid.cell(this.x+1, this.y));
737 if (this.y + 1 < this.grid.height) {
738 this._neighbours.push(this.grid.cell(this.x+1, this.y+1));
739 this._neighbours.push(this.grid.cell(this.x, this.y+1));
742 this._neighbours.push(this.grid.cell(this.x+1, this.y-1));
745 return this._neighbours;
747 Cell.prototype.density = function() {
749 var neighbours = this.neighbours();
750 for (var n in neighbours) {
751 d += neighbours[n].value;
756 function Simulation(canvas, w, h, cell_size, life_colour, dead_colour) {
757 this.last_update = $.now() + 3000;
759 this.last_mouse_moved = 0;
760 this.redraw = new Array();
761 this.canvas = canvas;
762 this.canvas.width = w;
763 this.canvas.height = h;
764 this.context = canvas.getContext("2d");
765 this.pos_queue = new Array();
766 this.cell_queue = new Array();
767 this.cell_size = cell_size;
768 this.life_colour = life_colour;
769 this.dead_colour = dead_colour;
770 this.grid = new Grid(this.canvas.width, this.canvas.height, cell_size);
773 Simulation.prototype.draw = function() {
775 if (this.redraw.length) {
776 var cell = this.redraw[0];
778 this.context.fillStyle = cell.value == 1 ?
779 this.life_colour.str() : this.dead_colour.str();
780 this.context.fillRect(cell.canvas_x, cell.canvas_y,
781 this.grid.cell_size, this.grid.cell_size);
782 this.last_draw = $.now();
785 Simulation.prototype.update = function() {
787 while (this.pos_queue.length) {
788 var pos = this.pos_queue.pop();
789 if (pos[0] < this.canvas.width
790 && pos[1] < this.canvas.height) {
791 var cell = this.grid.pick_cell(pos[0], pos[1]);
793 this.cell_queue.push(cell);
794 this.cell_queue.concat(cell.neighbours());
795 this.redraw.unshift(cell);
798 if (this.last_update + 1000 > now) {
801 var changed = new Array();
802 var next_cell_queue = new Array();
803 while (this.cell_queue.length) {
804 var cell = this.cell_queue.pop();
805 if (changed[cell.hash()]) {
808 var d = cell.density();
809 if (d == 3 && cell.value == 0) {
810 changed[cell.hash()] = cell;
811 next_cell_queue = next_cell_queue.concat(cell.neighbours());
812 } else if (cell.value == 1) {
813 if (d < 2 || d > 3) {
814 changed[cell.hash()] = cell;
815 next_cell_queue = next_cell_queue.concat(cell.neighbours());
819 for (var pos in changed) {
820 var cell = changed[pos];
821 cell.set_value(1 - cell.value);
822 this.redraw.push(cell);
824 this.cell_queue = next_cell_queue;
825 this.last_update = now;
827 Simulation.prototype.activate_cell = function(pos) {
828 this.pos_queue.push(pos);
830 Simulation.prototype.mouse_moved = function(pos) {
832 if (this.last_mouse_moved + 50 < now) {
833 this.pos_queue.push(pos);
834 this.last_mouse_moved = now;