I was inspired by my recent attempt at creating a parallel Mandelbrot generator for Minnow to learn some javascript and make a javascript version of it. Here is an actual example of this code in use. The javascript itself is pretty simple:

function point(t_x, t_y)
{
  this.x = t_x;
  this.y = t_y;
}
function color(t_r, t_g, t_b)
{
  this.r = t_r;
  this.g = t_g;
  this.b = t_b;   
}

function get_color(t_point, t_center, t_width, t_height, t_scale)
{
  var xscaled = t_point.x/(t_width/t_scale) + (t_center.x - (t_scale/2.0 ));
  var yscaled = t_point.y/(t_height/t_scale) + (t_center.y - (t_scale/2.0 ));

  var x = xscaled;
  var y = yscaled;

  var iteration = 0;
  var max_iteration = 2000;

  var stop_iteration = max_iteration;

  while ( iteration < stop_iteration )
  {
    if ((x*x) + (y*y) > (2.0*2.0) && stop_iteration == max_iteration)
    {
      stop_iteration = iteration + 5
    }
     
    var xtemp = (x*x) - (y*y) + xscaled;
    y = (2.0*x*y) + yscaled;
    x = xtemp;
    iteration += 1
  }

  if (iteration == max_iteration)
  {
    return new color(0.0,0.0,0.0)
  } else {
    var value = ((iteration + 1) - (Math.log(Math.log(Math.abs(x * y))))/Math.log(2.0)); 
    var red = 0.0;
    var green = 0.0;
    var blue = 0.0;

    var colorval = Math.floor(value * 10.0);

    if (colorval < 256)
    {
      red = colorval/256.0;
    } else {
      colorband = Math.floor((colorval - 256) % 1024 / 256);
      mod256 = colorval % 256;
      if (colorband == 0)
      {
        red = 1.0;
        green = mod256 / 255.0;
        blue = 0.0;
      } else if (colorband == 1) {
        red = 1.0;
        green = 1.0;
        blue = mod256 / 255.0;
      } else if (colorband == 2) {
        red = 1.0;
        green = 1.0;
        blue = 1.0 - (mod256/255.0);
      } else {
        red = 1.0;
        green = 1.0 - (mod256/255.0);
        blue = 0.0;
      }
    }
    return new color(red, green, blue);
  }
}

function region_calc(t_tl, t_br, t_width, t_height, t_center, t_scale, t_context)
{
  for (var y = t_tl.y; y < t_br.y; y++)
  {
    for (var x = t_tl.x; x < t_br.x; x++)
    {
      var p = new point(x,y);
      set_pixel(p, get_color(p, t_center, t_width, t_height, t_scale), t_context);
    }
  }
}

function set_pixel(t_point, t_color, t_context)
{
  t_context.fillStyle = "rgb("+Math.floor(t_color.r*255)+","+Math.floor(t_color.g*255)+","+Math.floor(t_color.b*255)+")";
  t_context.fillRect(t_point.x, t_point.y, 1, 1);
}

function draw() 
{
  var m_width = document.getElementById("width").value;
  var m_height = document.getElementById("height").value;
  var m_x = document.getElementById("xloc").value;
  var m_y = document.getElementById("yloc").value;
  var m_scale = document.getElementById("scale").value;

  var canvas = document.getElementById("canvas");
  canvas.width = m_width;
  canvas.height = m_height;
  var ctx = canvas.getContext("2d");
  region_calc(new point(0,0), new point(m_width, m_height), m_width, m_height, new point(m_x, m_y), m_scale, ctx);
}