script.js
author Eugen Sawin <sawine@me73.com>
Sat, 17 Dec 2011 19:20:30 +0100
changeset 71 bf0295436e1c
parent 61 9ecf298eb1bb
child 72 c78f182f7412
permissions -rw-r--r--
Added 2012 version draft.
sawine@61
     1
var QUOTES_NUMBER = 39;
sawine@71
     2
var SERVER = "http://me73.com"
sawine@0
     3
sawine@71
     4
$(document).ready (   
sawine@71
     5
    function() { 
sawine@71
     6
        var image = new Image();
sawine@71
     7
        image.onload = init_logo;
sawine@71
     8
        image.src = "images/logobase.png";        
sawine@71
     9
    }
sawine@71
    10
);
sawine@71
    11
sawine@71
    12
$(document).keypress (
sawine@71
    13
    function(event) {
sawine@71
    14
	if (event.which == 13) {            
sawine@71
    15
	    event.preventDefault();
sawine@71
    16
            update_logo();	    
sawine@71
    17
	}
sawine@71
    18
    }
sawine@71
    19
);
sawine@71
    20
sawine@71
    21
var width = 670;
sawine@71
    22
var height = 100;
sawine@71
    23
sawine@71
    24
function init_logo(ev) {
sawine@71
    25
    var canvas = document.getElementById("logo");
sawine@71
    26
    var context = canvas.getContext("2d");  
sawine@71
    27
    canvas.width = width;
sawine@71
    28
    canvas.height = height;   
sawine@71
    29
    context.drawImage(ev.target, 0, 0);    
sawine@0
    30
}
sawine@0
    31
sawine@71
    32
function update_logo() {
sawine@71
    33
    var canvas = document.getElementById("logo");
sawine@71
    34
    var context = canvas.getContext("2d");  
sawine@71
    35
    var image = context.getImageData(0, 0, width, height);
sawine@71
    36
    var pixels = image.data;
sawine@71
    37
    var white = new Color(255, 255, 255);
sawine@71
    38
    for (var y = 0; y < height; y += 1) {
sawine@71
    39
        for (var x = 0; x < width; x += 1) {
sawine@71
    40
            if (getPixel(image, x, y).r > 0) {
sawine@71
    41
                setPixel(image, x, y, new Color(90, 215, 21));
sawine@71
    42
            }
sawine@71
    43
        }
sawine@71
    44
    }   
sawine@71
    45
    context.putImageData(image, 0, 0);
sawine@0
    46
}
sawine@0
    47
sawine@71
    48
function Color(r, g, b, a) {
sawine@71
    49
    this.r = r;
sawine@71
    50
    this.g = g;
sawine@71
    51
    this.b = b;
sawine@71
    52
    this.a = a == undefined ? 255 : a;
sawine@71
    53
}
sawine@71
    54
Color.prototype.equals = function(rhs) {
sawine@71
    55
    for (p in this) {
sawine@71
    56
        if (typeof(rhs[p]) == undefined
sawine@71
    57
           || this[p] != rhs[p]) {           
sawine@71
    58
            return false;
sawine@71
    59
        }
sawine@71
    60
    }
sawine@71
    61
    return true;
sawine@0
    62
}
sawine@0
    63
sawine@71
    64
function setPixel(image, x, y, color) {
sawine@71
    65
    var index = 4 * (x + y * image.width);
sawine@71
    66
    image.data[index] = color.r;
sawine@71
    67
    image.data[index + 1] = color.g;
sawine@71
    68
    image.data[index + 2] = color.b;
sawine@71
    69
    image.data[index + 3] = color.a;
sawine@0
    70
}
sawine@0
    71
sawine@71
    72
function getPixel(image, x, y) {   
sawine@71
    73
    var index = 4 * (x + y * image.width);
sawine@71
    74
    var r = image.data[index];
sawine@71
    75
    var g = image.data[index + 1];
sawine@71
    76
    var b = image.data[index + 2];
sawine@71
    77
    var a = image.data[index + 3];
sawine@71
    78
    return new Color(r, g, b, a);
sawine@0
    79
}
sawine@0
    80
sawine@71
    81
function load_random_quote() {
sawine@71
    82
    var file = "/quotes/quote" + Math.floor(Math.random() * QUOTES_NUMBER + 1) + ".html";
sawine@71
    83
    $.ajax({url: SERVER + file,
sawine@71
    84
            success: write_quote});   
sawine@71
    85
    return;
sawine@71
    86
    var currentFile = self.location.hostname + self.location.pathname;		
sawine@71
    87
    var request = http_request_object();
sawine@71
    88
    var url  = "http://" + self.location.hostname + file;	
sawine@71
    89
    request.open("GET", url, false);
sawine@71
    90
    request.setRequestHeader("User-Agent", navigator.userAgent);
sawine@71
    91
    request.send(null)
sawine@71
    92
    
sawine@71
    93
    // if (oRequest.status == 200) alert(oRequest.responseText);
sawine@71
    94
    // else alert("Error executing XMLHttpRequest call!");	
sawine@71
    95
    //document.write(url);
sawine@0
    96
    //document.write(request.responseText);
sawine@71
    97
    document.getElementById('random_quote').innerHTML = request.responseText;
sawine@0
    98
}
sawine@0
    99
sawine@71
   100
function write_quote(data, status, xhr) {
sawine@71
   101
    alert(data);
sawine@71
   102
    $("random_quote").replaceWith(data);
sawine@0
   103
}
sawine@0
   104
sawine@0
   105
function load_footer()
sawine@0
   106
{
sawine@0
   107
	var file = "/footer.html";
sawine@0
   108
	var currentFile = self.location.hostname + self.location.pathname;		
sawine@0
   109
	var request = http_request_object();
sawine@0
   110
	var url  = "http://" + self.location.hostname + file;	
sawine@0
   111
	request.open("GET", url, false);
sawine@0
   112
	request.setRequestHeader("User-Agent", navigator.userAgent);
sawine@0
   113
	request.send(null)
sawine@0
   114
	// if (oRequest.status == 200) alert(oRequest.responseText);
sawine@0
   115
	// else alert("Error executing XMLHttpRequest call!");	
sawine@0
   116
	//document.write(url);
sawine@0
   117
	//document.write(request.responseText);
sawine@0
   118
    document.getElementById('footer').innerHTML = request.responseText;
sawine@0
   119
}
sawine@7
   120
sawine@20
   121
sawine@20
   122
sawine@7
   123
// Mandelbrot functions
sawine@7
   124
function Complex(real, imag) 
sawine@7
   125
{
sawine@7
   126
	this.real = real;
sawine@7
   127
	this.imag = imag;
sawine@7
   128
}
sawine@7
   129
sawine@7
   130
var MIN_C = new Complex(-2.2, -1.4);
sawine@7
   131
var MAX_C = new Complex(1.0, 1.4);
sawine@7
   132
var min_c = MIN_C;
sawine@7
   133
var max_c = MAX_C;
sawine@20
   134
var MIN_ITER = 100;
sawine@20
   135
var max_iter = MIN_ITER;
sawine@10
   136
var zoom = 1.0;
sawine@17
   137
var resolution = 3;
sawine@17
   138
var bailout = 4.0;
sawine@7
   139
sawine@7
   140
function Result(z, iter) 
sawine@7
   141
{
sawine@7
   142
	this.z = z;
sawine@7
   143
	this.iter = iter;
sawine@7
   144
}
sawine@7
   145
sawine@7
   146
function complex_quad(c)
sawine@7
   147
{
sawine@7
   148
	return new Complex(Math.pow(c.real, 2) - Math.pow(c.imag, 2), 
sawine@7
   149
		2.0 * c.real * c.imag);
sawine@7
   150
}
sawine@7
   151
sawine@7
   152
function complex_quad_value(c)
sawine@7
   153
{
sawine@7
   154
	return Math.pow(c.real, 2) + Math.pow(c.imag, 2);
sawine@7
   155
}
sawine@7
   156
sawine@7
   157
function complex_add(c1, c2)
sawine@7
   158
{
sawine@7
   159
	return new Complex(c1.real + c2.real, c1.imag + c2.imag);
sawine@7
   160
}
sawine@7
   161
sawine@17
   162
function complex_equal(c1, c2)
sawine@17
   163
{	
sawine@17
   164
	return (c1.real == c2.real) && (c1.imag == c2.imag);
sawine@17
   165
}
sawine@17
   166
sawine@7
   167
function iterate(z, c) 
sawine@7
   168
{
sawine@7
   169
	z_quad = complex_quad(z);
sawine@7
   170
	return new Complex(z_quad.real + c.real, z_quad.imag + c.imag);
sawine@7
   171
}
sawine@7
   172
sawine@7
   173
function test(c, max_iter) 
sawine@7
   174
{
sawine@7
   175
	var iter = 0;
sawine@7
   176
	var z = new Complex(0.0, 0.0);
sawine@17
   177
	var last_z = new Complex(-1.0, 0.0);
sawine@17
   178
	var quad_z = complex_quad_value(z);
sawine@17
   179
	
sawine@17
   180
	while (iter < max_iter
sawine@17
   181
		&& !complex_equal(z, last_z)
sawine@17
   182
		&& quad_z <= bailout)
sawine@7
   183
	{
sawine@17
   184
		last_z = z;
sawine@7
   185
		z = iterate(z, c);
sawine@17
   186
		quad_z = complex_quad_value(z);
sawine@7
   187
		iter++;
sawine@7
   188
	}
sawine@17
   189
	return new Result(quad_z, iter);
sawine@7
   190
}
sawine@7
   191
sawine@20
   192
function draw(diter, dx, dy, dz, dres)
sawine@7
   193
{  
sawine@17
   194
	var canvas = document.getElementById('mandelbrot'); 
sawine@17
   195
	
sawine@7
   196
	if (canvas.getContext)
sawine@7
   197
	{  
sawine@17
   198
		zoom += dz;
sawine@12
   199
		var ctx = canvas.getContext('2d');
sawine@17
   200
sawine@17
   201
		if (dres != 0)
sawine@17
   202
		{		
sawine@17
   203
			resolution = Math.max(1, resolution + dres);
sawine@17
   204
		}
sawine@20
   205
sawine@20
   206
		if (diter != 0)
sawine@20
   207
		{
sawine@20
   208
			max_iter = Math.max(MIN_ITER, max_iter + diter);
sawine@20
   209
		}
sawine@17
   210
		
sawine@20
   211
		var red = "rgb(255, 0, 0)";
sawine@20
   212
		var white = "rgb(255, 255, 255)";
sawine@17
   213
		var width = canvas.width;
sawine@17
   214
		var height = canvas.height;
sawine@17
   215
		var dim = Math.max(width, height);
sawine@17
   216
		var dim_ratio = Math.round(width / height);	
sawine@17
   217
		var diff_c = new Complex(max_c.real - min_c.real,
sawine@17
   218
			max_c.imag - min_c.imag);
sawine@17
   219
		dx_min = diff_c.real / 100 * (dx + dz);
sawine@17
   220
		dx_max = diff_c.real / 100 * (dx - dz);
sawine@17
   221
sawine@17
   222
		dy_min = diff_c.imag / 100 * (dy + dz);
sawine@17
   223
		dy_max = diff_c.imag / 100 * (dy - dz);
sawine@17
   224
sawine@17
   225
		var min_inc = new Complex(dx_min * dim_ratio / 2.0, dy_min);
sawine@17
   226
		var max_inc = new Complex(dx_max * dim_ratio / 2.0, dy_max);
sawine@7
   227
		min_c = complex_add(min_c, min_inc);
sawine@7
   228
		max_c = complex_add(max_c, max_inc);
sawine@17
   229
		diff_c = new Complex(max_c.real - min_c.real,
sawine@7
   230
			max_c.imag - min_c.imag);
sawine@7
   231
		
sawine@22
   232
		for (var y = 0; y < height; y += resolution) 
sawine@7
   233
		{
sawine@17
   234
			for (var x = 0; x < width; x += resolution) 
sawine@17
   235
			{    			
sawine@17
   236
				var c = new Complex(min_c.real + diff_c.real / dim * x, 
sawine@17
   237
					min_c.imag + diff_c.imag / dim * y);  	
sawine@17
   238
			 	var result = test(c, max_iter);	
sawine@17
   239
		 		var r = Math.min(255, Math.pow(Math.max(0, 
sawine@17
   240
		 			(result.iter - max_iter / 20.0)), 2));
sawine@17
   241
				var g = Math.min(255, Math.pow(Math.max(0, 
sawine@17
   242
					(result.iter - max_iter / 25.0)), 2));			
sawine@17
   243
		 		var b = Math.min(255, Math.pow(Math.max(0, 
sawine@17
   244
					(result.iter - max_iter / 20.0)), 2));
sawine@25
   245
		 		var colour = "rgb(" + r + "," + g + "," + b + ")";
sawine@25
   246
		 		ctx.fillStyle = colour; 
sawine@20
   247
				ctx.fillRect(x, y, resolution, resolution);			
sawine@7
   248
			}
sawine@7
   249
  		}
sawine@7
   250
	}  
sawine@30
   251
} 
sawine@30
   252
sawine@30
   253
function getEventOffsetX(evt)
sawine@30
   254
{
sawine@30
   255
	if (evt.offsetX != null)
sawine@30
   256
		return evt.offsetX;
sawine@30
   257
 
sawine@30
   258
    var obj = evt.target || evt.srcElement;
sawine@30
   259
   	setPageTopLeft(obj);
sawine@30
   260
    return (evt.clientX - obj.pageLeft);
sawine@30
   261
}
sawine@30
   262
sawine@30
   263
function getEventOffsetY(evt)
sawine@30
   264
{
sawine@30
   265
	if (evt.offsetY != null)
sawine@30
   266
		return evt.offsetY;
sawine@30
   267
 
sawine@30
   268
    var obj = evt.target || evt.srcElement;
sawine@30
   269
   	setPageTopLeft(obj);
sawine@30
   270
    return (evt.clientY - obj.pageTop);
sawine@30
   271
}
sawine@30
   272
 
sawine@30
   273
function setPageTopLeft( o )
sawine@30
   274
{
sawine@30
   275
    var top = 0,
sawine@30
   276
    left = 0,
sawine@30
   277
    obj = o;
sawine@30
   278
 
sawine@30
   279
    while (o.offsetParent)
sawine@30
   280
     {
sawine@30
   281
         left += o.offsetLeft ;
sawine@30
   282
         top += o.offsetTop ;
sawine@30
   283
         o = o.offsetParent ;
sawine@30
   284
    };
sawine@30
   285
 
sawine@30
   286
    obj.pageTop = top;
sawine@30
   287
    obj.pageLeft = left; 
sawine@30
   288
}
sawine@30
   289
 
sawine@30
   290
function draw2(evt)
sawine@30
   291
{
sawine@30
   292
	var iter = 0;
sawine@30
   293
	var res = 0;
sawine@30
   294
	var x = (getEventOffsetX(evt) - 335) / 167.5;
sawine@30
   295
    var y = (getEventOffsetY(evt) - 140) / 70;
sawine@30
   296
	var z = 0;
sawine@30
   297
	draw(iter, x, y, z, res);
sawine@71
   298
}
sawine@71
   299
sawine@71
   300