factory/v2012/script.js
author Eugen Sawin <sawine@me73.com>
Sun, 18 Dec 2011 19:15:59 +0100
changeset 76 681b1d7dc3a9
parent 75 7b3fc980d9d7
child 77 9c443a61358c
permissions -rw-r--r--
Prettier lines.
sawine@72
     1
var QUOTES_NUMBER = 39;
sawine@74
     2
var port = 8080;
sawine@74
     3
var SERVER = "http://" + window.location.hostname + ":" + port;
sawine@72
     4
sawine@72
     5
$(document).ready(function() {     
sawine@72
     6
    var image = new Image();
sawine@72
     7
    image.onload = init_logo;
sawine@72
     8
    image.src = "images/logobase.png";
sawine@72
     9
    $("#logo").click(handle_click);   
sawine@72
    10
    $("#logo").hover(function() {
sawine@75
    11
        $(this).css("cursor", "pointer");        
sawine@72
    12
    }, function() {
sawine@72
    13
        $(this).css("cursor", "auto");
sawine@75
    14
    });      
sawine@72
    15
});
sawine@72
    16
sawine@72
    17
$(document).keypress( function(event) {
sawine@72
    18
    if (event.which == 13) {            
sawine@72
    19
	event.preventDefault();
sawine@72
    20
        update_logo();	    
sawine@72
    21
    }
sawine@72
    22
});
sawine@72
    23
sawine@72
    24
var menu_width = 670;
sawine@72
    25
var menu_height = 120;
sawine@75
    26
var menu_splits = new Array(150, 350, 545);
sawine@72
    27
sawine@72
    28
var click_events = new Array();
sawine@72
    29
click_events["logo"] = new Array();
sawine@72
    30
click_events["logo"][0] = new Object();
sawine@72
    31
click_events["logo"][0]["min_x"] = 0;
sawine@75
    32
click_events["logo"][0]["max_x"] = menu_splits[0];
sawine@72
    33
click_events["logo"][0]["min_y"] = 0;
sawine@72
    34
click_events["logo"][0]["max_y"] = menu_height;
sawine@72
    35
click_events["logo"][0]["func"] = switch_page;
sawine@74
    36
click_events["logo"][0]["args"] = new Array("personalwork.html");
sawine@72
    37
click_events["logo"][1] = new Object();
sawine@75
    38
click_events["logo"][1]["min_x"] = menu_splits[0] + 1;
sawine@75
    39
click_events["logo"][1]["max_x"] = menu_splits[1];
sawine@72
    40
click_events["logo"][1]["min_y"] = 0;
sawine@72
    41
click_events["logo"][1]["max_y"] = menu_height;
sawine@72
    42
click_events["logo"][1]["func"] = switch_page;
sawine@74
    43
click_events["logo"][1]["args"] = new Array("howiwork.html");
sawine@72
    44
click_events["logo"][2] = new Object();
sawine@75
    45
click_events["logo"][2]["min_x"] = menu_splits[1] + 1;
sawine@75
    46
click_events["logo"][2]["max_x"] = menu_splits[2];
sawine@72
    47
click_events["logo"][2]["min_y"] = 0;
sawine@72
    48
click_events["logo"][2]["max_y"] = menu_height;
sawine@72
    49
click_events["logo"][2]["func"] = switch_page;
sawine@74
    50
click_events["logo"][2]["args"] = new Array("books.html");
sawine@72
    51
click_events["logo"][3] = new Object();
sawine@75
    52
click_events["logo"][3]["min_x"] = menu_splits[2] + 1;
sawine@72
    53
click_events["logo"][3]["max_x"] = menu_width - 1;
sawine@72
    54
click_events["logo"][3]["min_y"] = 0;
sawine@72
    55
click_events["logo"][3]["max_y"] = menu_height;
sawine@72
    56
click_events["logo"][3]["func"] = switch_page;
sawine@74
    57
click_events["logo"][3]["args"] = new Array("links.html", "linksend.html");
sawine@72
    58
sawine@72
    59
function handle_click(e) {
sawine@72
    60
    var offset = $("#logo").offset();
sawine@72
    61
    var x = e.pageX - offset.left;
sawine@72
    62
    var y = e.pageY - offset.top;   
sawine@72
    63
    for (var i in click_events[e.target.id]) {
sawine@72
    64
        var ces = click_events[e.target.id][i];
sawine@72
    65
        if (ces && x >= ces["min_x"] && x <= ces["max_x"]
sawine@72
    66
            && y >= ces["min_y"] && y <= ces["max_y"]) {    
sawine@72
    67
            ces["func"](e.target.id, ces);
sawine@72
    68
            break;
sawine@72
    69
        }
sawine@72
    70
    }
sawine@72
    71
}
sawine@72
    72
sawine@72
    73
function switch_page(id, params) {
sawine@74
    74
    var page = params["args"][0];
sawine@72
    75
    $("body").load(page);
sawine@72
    76
    document.location.href = page;    
sawine@72
    77
}
sawine@72
    78
sawine@72
    79
function color_area(id, min_x, max_x, min_y, max_y, colour) {
sawine@72
    80
    var canvas = document.getElementById(id);
sawine@72
    81
    var context = canvas.getContext("2d");  
sawine@72
    82
    var image = context.getImageData(0, 0, menu_width, menu_height);
sawine@72
    83
    var pixels = image.data;    
sawine@72
    84
    for (var y = min_y; y <= max_y; y += 1) {
sawine@72
    85
        for (var x = min_x; x <= max_x; x += 1) {
sawine@72
    86
            var pix_colour = getPixel(image, x, y);
sawine@72
    87
            if (pix_colour.a > 0) {
sawine@72
    88
                colour.a = pix_colour.a;
sawine@72
    89
                setPixel(image, x, y, colour);
sawine@72
    90
            }
sawine@72
    91
        }
sawine@72
    92
    }   
sawine@72
    93
    context.putImageData(image, 0, 0);
sawine@72
    94
}
sawine@72
    95
sawine@72
    96
function init_logo(event) {
sawine@72
    97
    var canvas = document.getElementById("logo");
sawine@72
    98
    var context = canvas.getContext("2d"); 
sawine@72
    99
    var image = context.getImageData(0, 0, menu_width, menu_height);  
sawine@72
   100
    canvas.width = menu_width;
sawine@72
   101
    canvas.height = menu_height;
sawine@72
   102
    context.drawImage(event.target, 0, 0);
sawine@72
   103
    var white = new Colour(255, 255, 255);
sawine@72
   104
    for (var i in click_events["logo"]) {
sawine@74
   105
        var p = click_events["logo"][i];       
sawine@74
   106
        var pos = document.location.href.lastIndexOf("/") + 1; 
sawine@74
   107
        var page = document.location.href.substr(pos);
sawine@74
   108
        var found = false;
sawine@74
   109
        for (var j in p["args"]) {
sawine@74
   110
            if (page == p["args"][j]) {         
sawine@74
   111
                color_area("logo", p["min_x"], p["max_x"], 70, p["max_y"], white);
sawine@74
   112
                found = true;
sawine@74
   113
                break;
sawine@74
   114
            }
sawine@74
   115
        }
sawine@74
   116
        if (!found) {
sawine@72
   117
            color_area("logo", p["min_x"], p["max_x"], 0, 70, white);
sawine@72
   118
        }
sawine@72
   119
    }
sawine@75
   120
    drawMenuLines();   
sawine@75
   121
}
sawine@75
   122
sawine@75
   123
function drawMenuLines() {
sawine@75
   124
    var canvas = document.getElementById("logo");
sawine@75
   125
    var context = canvas.getContext("2d");  
sawine@75
   126
    var image = context.getImageData(0, 0, menu_width, menu_height);
sawine@75
   127
    var pixels = image.data;
sawine@75
   128
    context.lineCap = "round";
sawine@75
   129
    context.lineWidth = 1;
sawine@75
   130
    var colour1a = new Colour(0, 0, 0, 0.1);
sawine@75
   131
    context.beginPath();   
sawine@75
   132
    context.moveTo(0, menu_height - 1);
sawine@75
   133
    context.lineTo(menu_width - 1, menu_height - 1);   
sawine@75
   134
    context.closePath();  
sawine@75
   135
    context.strokeStyle = colour1a.str();
sawine@76
   136
    context.stroke(); 
sawine@76
   137
    var colour1e = new Colour(0, 0, 0, 0.05);  
sawine@76
   138
    context.beginPath();   
sawine@76
   139
    context.moveTo(70, menu_height - 1);
sawine@76
   140
    context.lineTo(menu_width - 71, menu_height - 1);   
sawine@76
   141
    context.closePath();  
sawine@76
   142
    context.strokeStyle = colour1e.str();
sawine@76
   143
    context.stroke();  
sawine@76
   144
    var colour1b = new Colour(0, 0, 0, 0.05);  
sawine@75
   145
    context.beginPath();   
sawine@75
   146
    context.moveTo(50, menu_height - 1);
sawine@75
   147
    context.lineTo(menu_width - 51, menu_height - 1);   
sawine@75
   148
    context.closePath();  
sawine@75
   149
    context.strokeStyle = colour1b.str();
sawine@75
   150
    context.stroke();
sawine@75
   151
    var colour1c = new Colour(0, 0, 0, 0.05);  
sawine@75
   152
    context.beginPath();   
sawine@75
   153
    context.moveTo(25, menu_height - 1);
sawine@75
   154
    context.lineTo(menu_width - 26, menu_height - 1);   
sawine@75
   155
    context.closePath();  
sawine@75
   156
    context.strokeStyle = colour1c.str();
sawine@75
   157
    context.stroke();
sawine@75
   158
    var colour1d = new Colour(0, 0, 0, 0.05);  
sawine@75
   159
    context.beginPath();   
sawine@75
   160
    context.moveTo(10, menu_height - 1);
sawine@75
   161
    context.lineTo(menu_width - 11, menu_height - 1);   
sawine@75
   162
    context.closePath();  
sawine@75
   163
    context.strokeStyle = colour1d.str();
sawine@75
   164
    context.stroke();  
sawine@75
   165
    
sawine@75
   166
    var colour2 = new Colour(0, 0, 0, 0.2);
sawine@75
   167
    context.beginPath();  
sawine@75
   168
    context.moveTo(menu_splits[0], 0); 
sawine@75
   169
    context.lineTo(menu_splits[0], menu_height - 1);
sawine@75
   170
    context.moveTo(menu_splits[1], 0);
sawine@75
   171
    context.lineTo(menu_splits[1], menu_height - 1);
sawine@75
   172
    context.moveTo(menu_splits[2], 0);
sawine@75
   173
    context.lineTo(menu_splits[2], menu_height - 1);
sawine@75
   174
    context.closePath();
sawine@75
   175
    context.strokeStyle = colour2.str();
sawine@75
   176
    context.stroke();
sawine@75
   177
sawine@75
   178
    context.clearRect(menu_splits[0] - 1, menu_height - 1, 2, 2);
sawine@75
   179
    context.clearRect(menu_splits[1] - 1, menu_height - 1, 2, 2);
sawine@75
   180
    context.clearRect(menu_splits[2] - 1, menu_height - 1, 2, 2);
sawine@76
   181
sawine@76
   182
    context.clearRect(menu_splits[0] - 1, menu_height - 2, 1, 1);
sawine@76
   183
    context.clearRect(menu_splits[1] - 1, menu_height - 2, 1, 1);
sawine@76
   184
    context.clearRect(menu_splits[2] - 1, menu_height - 2, 1, 1);
sawine@75
   185
}
sawine@75
   186
sawine@75
   187
function clearMenuLines() {
sawine@75
   188
    var canvas = document.getElementById("logo");
sawine@75
   189
    var context = canvas.getContext("2d");  
sawine@75
   190
    var image = context.getImageData(0, 0, menu_width, menu_height);
sawine@75
   191
    var pixels = image.data;
sawine@75
   192
    context.clearRect(0, menu_height - 2, menu_width - 1, 2);
sawine@75
   193
    context.clearRect(menu_splits[0] - 1, 0, 2, menu_height - 1);
sawine@75
   194
    context.clearRect(menu_splits[1] - 1, 0, 2, menu_height - 1);
sawine@75
   195
    context.clearRect(menu_splits[2] - 1, 0, 2, menu_height - 1);
sawine@72
   196
}
sawine@72
   197
sawine@72
   198
function update_logo() {
sawine@72
   199
    var canvas = document.getElementById("logo");
sawine@72
   200
    var context = canvas.getContext("2d");  
sawine@72
   201
    var image = context.getImageData(0, 0, menu_width, menu_height);
sawine@72
   202
    var pixels = image.data;
sawine@72
   203
    var white = new Colour(255, 255, 255);
sawine@72
   204
    for (var y = 0; y < menu_height; y += 1) {
sawine@72
   205
        for (var x = 0; x < menu_width; x += 1) {
sawine@72
   206
            var pix_colour = getPixel(image, x, y);
sawine@72
   207
            if (pix_colour.a > 0) {
sawine@72
   208
                setPixel(image, x, y, new Colour(90, 215, 21, pix_colour.a));
sawine@72
   209
            }
sawine@72
   210
        }
sawine@72
   211
    }   
sawine@72
   212
    context.putImageData(image, 0, 0);
sawine@72
   213
}
sawine@72
   214
sawine@72
   215
function Colour(r, g, b, a) {
sawine@72
   216
    this.r = r;
sawine@72
   217
    this.g = g;
sawine@72
   218
    this.b = b;
sawine@75
   219
    this.a = a == undefined ? 1 : a;
sawine@72
   220
}
sawine@72
   221
Colour.prototype.equals = function(rhs) {
sawine@72
   222
    for (p in this) {
sawine@72
   223
        if (typeof(rhs[p]) == undefined
sawine@72
   224
           || this[p] != rhs[p]) {           
sawine@72
   225
            return false;
sawine@72
   226
        }
sawine@72
   227
    }
sawine@72
   228
    return true;
sawine@72
   229
}
sawine@75
   230
Colour.prototype.str = function() {
sawine@75
   231
    return "rgba(" + this.r + "," + this.g + "," + this.b + "," + this.a + ")";
sawine@75
   232
}
sawine@72
   233
sawine@72
   234
function setPixel(image, x, y, color) {
sawine@72
   235
    var index = 4 * (x + y * image.width);
sawine@72
   236
    image.data[index] = color.r;
sawine@72
   237
    image.data[index + 1] = color.g;
sawine@72
   238
    image.data[index + 2] = color.b;
sawine@72
   239
    image.data[index + 3] = color.a;
sawine@72
   240
}
sawine@72
   241
sawine@72
   242
function getPixel(image, x, y) {   
sawine@72
   243
    var index = 4 * (x + y * image.width);
sawine@72
   244
    var r = image.data[index];
sawine@72
   245
    var g = image.data[index + 1];
sawine@72
   246
    var b = image.data[index + 2];
sawine@72
   247
    var a = image.data[index + 3];
sawine@72
   248
    return new Colour(r, g, b, a);
sawine@72
   249
}
sawine@72
   250
sawine@72
   251
function load_random_quote() {
sawine@72
   252
    var file = "/quotes/quote" + Math.floor(Math.random() * QUOTES_NUMBER + 1) + ".html";
sawine@72
   253
    $.ajax({url: SERVER + file,
sawine@74
   254
            success: write_quote});
sawine@72
   255
}
sawine@72
   256
sawine@74
   257
function write_quote(data, status, xhr) {   
sawine@74
   258
    $("#random_quote").html(data);
sawine@72
   259
}
sawine@72
   260
sawine@72
   261
function load_footer()
sawine@72
   262
{
sawine@72
   263
	var file = "/footer.html";
sawine@72
   264
	var currentFile = self.location.hostname + self.location.pathname;		
sawine@72
   265
	var request = http_request_object();
sawine@72
   266
	var url  = "http://" + self.location.hostname + file;	
sawine@72
   267
	request.open("GET", url, false);
sawine@72
   268
	request.setRequestHeader("User-Agent", navigator.userAgent);
sawine@72
   269
	request.send(null)
sawine@72
   270
	// if (oRequest.status == 200) alert(oRequest.responseText);
sawine@72
   271
	// else alert("Error executing XMLHttpRequest call!");	
sawine@72
   272
	//document.write(url);
sawine@72
   273
	//document.write(request.responseText);
sawine@72
   274
    document.getElementById('footer').innerHTML = request.responseText;
sawine@72
   275
}
sawine@72
   276
sawine@72
   277
sawine@72
   278
sawine@72
   279
// Mandelbrot functions
sawine@72
   280
function Complex(real, imag) 
sawine@72
   281
{
sawine@72
   282
	this.real = real;
sawine@72
   283
	this.imag = imag;
sawine@72
   284
}
sawine@72
   285
sawine@72
   286
var MIN_C = new Complex(-2.2, -1.4);
sawine@72
   287
var MAX_C = new Complex(1.0, 1.4);
sawine@72
   288
var min_c = MIN_C;
sawine@72
   289
var max_c = MAX_C;
sawine@72
   290
var MIN_ITER = 100;
sawine@72
   291
var max_iter = MIN_ITER;
sawine@72
   292
var zoom = 1.0;
sawine@72
   293
var resolution = 3;
sawine@72
   294
var bailout = 4.0;
sawine@72
   295
sawine@72
   296
function Result(z, iter) 
sawine@72
   297
{
sawine@72
   298
	this.z = z;
sawine@72
   299
	this.iter = iter;
sawine@72
   300
}
sawine@72
   301
sawine@72
   302
function complex_quad(c)
sawine@72
   303
{
sawine@72
   304
	return new Complex(Math.pow(c.real, 2) - Math.pow(c.imag, 2), 
sawine@72
   305
		2.0 * c.real * c.imag);
sawine@72
   306
}
sawine@72
   307
sawine@72
   308
function complex_quad_value(c)
sawine@72
   309
{
sawine@72
   310
	return Math.pow(c.real, 2) + Math.pow(c.imag, 2);
sawine@72
   311
}
sawine@72
   312
sawine@72
   313
function complex_add(c1, c2)
sawine@72
   314
{
sawine@72
   315
	return new Complex(c1.real + c2.real, c1.imag + c2.imag);
sawine@72
   316
}
sawine@72
   317
sawine@72
   318
function complex_equal(c1, c2)
sawine@72
   319
{	
sawine@72
   320
	return (c1.real == c2.real) && (c1.imag == c2.imag);
sawine@72
   321
}
sawine@72
   322
sawine@72
   323
function iterate(z, c) 
sawine@72
   324
{
sawine@72
   325
	z_quad = complex_quad(z);
sawine@72
   326
	return new Complex(z_quad.real + c.real, z_quad.imag + c.imag);
sawine@72
   327
}
sawine@72
   328
sawine@72
   329
function test(c, max_iter) 
sawine@72
   330
{
sawine@72
   331
	var iter = 0;
sawine@72
   332
	var z = new Complex(0.0, 0.0);
sawine@72
   333
	var last_z = new Complex(-1.0, 0.0);
sawine@72
   334
	var quad_z = complex_quad_value(z);
sawine@72
   335
	
sawine@72
   336
	while (iter < max_iter
sawine@72
   337
		&& !complex_equal(z, last_z)
sawine@72
   338
		&& quad_z <= bailout)
sawine@72
   339
	{
sawine@72
   340
		last_z = z;
sawine@72
   341
		z = iterate(z, c);
sawine@72
   342
		quad_z = complex_quad_value(z);
sawine@72
   343
		iter++;
sawine@72
   344
	}
sawine@72
   345
	return new Result(quad_z, iter);
sawine@72
   346
}
sawine@72
   347
sawine@72
   348
function draw(diter, dx, dy, dz, dres)
sawine@72
   349
{  
sawine@72
   350
	var canvas = document.getElementById('mandelbrot'); 
sawine@72
   351
	
sawine@72
   352
	if (canvas.getContext)
sawine@72
   353
	{  
sawine@72
   354
		zoom += dz;
sawine@72
   355
		var ctx = canvas.getContext('2d');
sawine@72
   356
sawine@72
   357
		if (dres != 0)
sawine@72
   358
		{		
sawine@72
   359
			resolution = Math.max(1, resolution + dres);
sawine@72
   360
		}
sawine@72
   361
sawine@72
   362
		if (diter != 0)
sawine@72
   363
		{
sawine@72
   364
			max_iter = Math.max(MIN_ITER, max_iter + diter);
sawine@72
   365
		}
sawine@72
   366
		
sawine@72
   367
		var red = "rgb(255, 0, 0)";
sawine@72
   368
		var white = "rgb(255, 255, 255)";
sawine@72
   369
		var width = canvas.width;
sawine@72
   370
		var height = canvas.height;
sawine@72
   371
		var dim = Math.max(width, height);
sawine@72
   372
		var dim_ratio = Math.round(width / height);	
sawine@72
   373
		var diff_c = new Complex(max_c.real - min_c.real,
sawine@72
   374
			max_c.imag - min_c.imag);
sawine@72
   375
		dx_min = diff_c.real / 100 * (dx + dz);
sawine@72
   376
		dx_max = diff_c.real / 100 * (dx - dz);
sawine@72
   377
sawine@72
   378
		dy_min = diff_c.imag / 100 * (dy + dz);
sawine@72
   379
		dy_max = diff_c.imag / 100 * (dy - dz);
sawine@72
   380
sawine@72
   381
		var min_inc = new Complex(dx_min * dim_ratio / 2.0, dy_min);
sawine@72
   382
		var max_inc = new Complex(dx_max * dim_ratio / 2.0, dy_max);
sawine@72
   383
		min_c = complex_add(min_c, min_inc);
sawine@72
   384
		max_c = complex_add(max_c, max_inc);
sawine@72
   385
		diff_c = new Complex(max_c.real - min_c.real,
sawine@72
   386
			max_c.imag - min_c.imag);
sawine@72
   387
		
sawine@72
   388
		for (var y = 0; y < height; y += resolution) 
sawine@72
   389
		{
sawine@72
   390
			for (var x = 0; x < width; x += resolution) 
sawine@72
   391
			{    			
sawine@72
   392
				var c = new Complex(min_c.real + diff_c.real / dim * x, 
sawine@72
   393
					min_c.imag + diff_c.imag / dim * y);  	
sawine@72
   394
			 	var result = test(c, max_iter);	
sawine@72
   395
		 		var r = Math.min(255, Math.pow(Math.max(0, 
sawine@72
   396
		 			(result.iter - max_iter / 20.0)), 2));
sawine@72
   397
				var g = Math.min(255, Math.pow(Math.max(0, 
sawine@72
   398
					(result.iter - max_iter / 25.0)), 2));			
sawine@72
   399
		 		var b = Math.min(255, Math.pow(Math.max(0, 
sawine@72
   400
					(result.iter - max_iter / 20.0)), 2));
sawine@72
   401
		 		var colour = "rgb(" + r + "," + g + "," + b + ")";
sawine@72
   402
		 		ctx.fillStyle = colour; 
sawine@72
   403
				ctx.fillRect(x, y, resolution, resolution);			
sawine@72
   404
			}
sawine@72
   405
  		}
sawine@72
   406
	}  
sawine@72
   407
} 
sawine@72
   408
sawine@72
   409
function getEventOffsetX(evt)
sawine@72
   410
{
sawine@72
   411
	if (evt.offsetX != null)
sawine@72
   412
		return evt.offsetX;
sawine@72
   413
 
sawine@72
   414
    var obj = evt.target || evt.srcElement;
sawine@72
   415
   	setPageTopLeft(obj);
sawine@72
   416
    return (evt.clientX - obj.pageLeft);
sawine@72
   417
}
sawine@72
   418
sawine@72
   419
function getEventOffsetY(evt)
sawine@72
   420
{
sawine@72
   421
	if (evt.offsetY != null)
sawine@72
   422
		return evt.offsetY;
sawine@72
   423
 
sawine@72
   424
    var obj = evt.target || evt.srcElement;
sawine@72
   425
   	setPageTopLeft(obj);
sawine@72
   426
    return (evt.clientY - obj.pageTop);
sawine@72
   427
}
sawine@72
   428
 
sawine@72
   429
function setPageTopLeft( o )
sawine@72
   430
{
sawine@72
   431
    var top = 0,
sawine@72
   432
    left = 0,
sawine@72
   433
    obj = o;
sawine@72
   434
 
sawine@72
   435
    while (o.offsetParent)
sawine@72
   436
     {
sawine@72
   437
         left += o.offsetLeft ;
sawine@72
   438
         top += o.offsetTop ;
sawine@72
   439
         o = o.offsetParent ;
sawine@72
   440
    };
sawine@72
   441
 
sawine@72
   442
    obj.pageTop = top;
sawine@72
   443
    obj.pageLeft = left; 
sawine@72
   444
}
sawine@72
   445
 
sawine@72
   446
function draw2(evt)
sawine@72
   447
{
sawine@72
   448
	var iter = 0;
sawine@72
   449
	var res = 0;
sawine@72
   450
	var x = (getEventOffsetX(evt) - 335) / 167.5;
sawine@72
   451
    var y = (getEventOffsetY(evt) - 140) / 70;
sawine@72
   452
	var z = 0;
sawine@72
   453
	draw(iter, x, y, z, res);
sawine@72
   454
}
sawine@72
   455
sawine@72
   456