factory/v2012/script.js
author Eugen Sawin <sawine@me73.com>
Sun, 15 Apr 2012 23:39:44 +0200
changeset 115 0ab8464859ba
parent 105 9ce4d8f46aea
permissions -rw-r--r--
Better error text
sawine@105
     1
var QUOTES_NUMBER = 42;
sawine@78
     2
var SERVER = "http://" + window.location.hostname + ":" + window.location.port;
sawine@78
     3
var simulation;
sawine@80
     4
var gameoflife;
sawine@72
     5
sawine@78
     6
$(document).ready(function() {   
sawine@82
     7
    simulation = new Simulation(document.getElementById("sim"), 
sawine@85
     8
                                670, 50, 6, green, background);  
sawine@72
     9
    var image = new Image();
sawine@72
    10
    image.onload = init_logo;
sawine@72
    11
    image.src = "images/logobase.png";
sawine@72
    12
    $("#logo").click(handle_click);   
sawine@89
    13
    $("#logo").hover(function(event) {
sawine@75
    14
        $(this).css("cursor", "pointer");        
sawine@72
    15
    }, function() {
sawine@72
    16
        $(this).css("cursor", "auto");
sawine@77
    17
    });
sawine@89
    18
    $("#logo").mousemove(function(event) { handle_hover(event); });
sawine@89
    19
    $("#logo").mouseout(function(event) { handle_mouse_out(event); });
sawine@79
    20
    $("#sim").mousemove(function(event) { simulation.mouse_moved(mouse_pos(event, "#sim")); });
sawine@78
    21
    var onEachFrame;
sawine@78
    22
    if (window.webkitRequestAnimationFrame) {
sawine@78
    23
        onEachFrame = function(cb) {
sawine@78
    24
            var _cb = function() { cb(); webkitRequestAnimationFrame(_cb); }
sawine@78
    25
            _cb();
sawine@78
    26
        };
sawine@78
    27
    } else if (window.mozRequestAnimationFrame) {
sawine@78
    28
        onEachFrame = function(cb) {
sawine@78
    29
            var _cb = function() { cb(); mozRequestAnimationFrame(_cb); }
sawine@78
    30
            _cb();
sawine@78
    31
        };
sawine@78
    32
    } else {
sawine@78
    33
        onEachFrame = function(cb) {
sawine@78
    34
            setInterval(cb, 1000 / 30);
sawine@78
    35
        }
sawine@78
    36
    }    
sawine@78
    37
    window.onEachFrame = onEachFrame;   
sawine@81
    38
    window.onEachFrame(update);  
sawine@81
    39
    var pos = document.location.href.lastIndexOf("/") + 1; 
sawine@81
    40
    var page = document.location.href.substr(pos);
sawine@84
    41
    if (page == "mandelbrot.html") {
sawine@81
    42
        draw(0, 0, 0, 0, 0);
sawine@87
    43
    } else if (page == "" || page == "index.html") {
sawine@87
    44
        init_gameoflife("ME73");
sawine@88
    45
    } else if (page == "gameoflife.html") {
sawine@94
    46
        init_gameoflife("");
sawine@88
    47
    }
sawine@72
    48
});
sawine@72
    49
sawine@78
    50
$(document).keypress(function(event) {
sawine@78
    51
    if (event.which == 13) {      
sawine@72
    52
	event.preventDefault();
sawine@72
    53
        update_logo();	    
sawine@72
    54
    }
sawine@72
    55
});
sawine@72
    56
sawine@72
    57
var menu_width = 670;
sawine@77
    58
var menu_height = 100;
sawine@77
    59
var menu_splits = new Array(180, 350, 505);
sawine@72
    60
sawine@72
    61
var click_events = new Array();
sawine@72
    62
click_events["logo"] = new Array();
sawine@72
    63
click_events["logo"][0] = new Object();
sawine@72
    64
click_events["logo"][0]["min_x"] = 0;
sawine@75
    65
click_events["logo"][0]["max_x"] = menu_splits[0];
sawine@72
    66
click_events["logo"][0]["min_y"] = 0;
sawine@72
    67
click_events["logo"][0]["max_y"] = menu_height;
sawine@72
    68
click_events["logo"][0]["func"] = switch_page;
sawine@74
    69
click_events["logo"][0]["args"] = new Array("personalwork.html");
sawine@72
    70
click_events["logo"][1] = new Object();
sawine@75
    71
click_events["logo"][1]["min_x"] = menu_splits[0] + 1;
sawine@75
    72
click_events["logo"][1]["max_x"] = menu_splits[1];
sawine@72
    73
click_events["logo"][1]["min_y"] = 0;
sawine@72
    74
click_events["logo"][1]["max_y"] = menu_height;
sawine@72
    75
click_events["logo"][1]["func"] = switch_page;
sawine@74
    76
click_events["logo"][1]["args"] = new Array("howiwork.html");
sawine@72
    77
click_events["logo"][2] = new Object();
sawine@75
    78
click_events["logo"][2]["min_x"] = menu_splits[1] + 1;
sawine@75
    79
click_events["logo"][2]["max_x"] = menu_splits[2];
sawine@72
    80
click_events["logo"][2]["min_y"] = 0;
sawine@72
    81
click_events["logo"][2]["max_y"] = menu_height;
sawine@72
    82
click_events["logo"][2]["func"] = switch_page;
sawine@74
    83
click_events["logo"][2]["args"] = new Array("books.html");
sawine@72
    84
click_events["logo"][3] = new Object();
sawine@75
    85
click_events["logo"][3]["min_x"] = menu_splits[2] + 1;
sawine@72
    86
click_events["logo"][3]["max_x"] = menu_width - 1;
sawine@72
    87
click_events["logo"][3]["min_y"] = 0;
sawine@72
    88
click_events["logo"][3]["max_y"] = menu_height;
sawine@72
    89
click_events["logo"][3]["func"] = switch_page;
sawine@74
    90
click_events["logo"][3]["args"] = new Array("links.html", "linksend.html");
sawine@72
    91
sawine@78
    92
function mouse_pos(event, id) { 
sawine@78
    93
    var offset = $(id).offset();   
sawine@77
    94
    return new Array(event.pageX - offset.left, 
sawine@77
    95
                     event.pageY - offset.top);
sawine@77
    96
}
sawine@77
    97
sawine@77
    98
function handle_click(event) {
sawine@78
    99
    var xy = mouse_pos(event, "#logo");
sawine@77
   100
    var x = xy[0];
sawine@77
   101
    var y = xy[1];
sawine@77
   102
    for (var i in click_events[event.target.id]) {
sawine@77
   103
        var ces = click_events[event.target.id][i];
sawine@72
   104
        if (ces && x >= ces["min_x"] && x <= ces["max_x"]
sawine@72
   105
            && y >= ces["min_y"] && y <= ces["max_y"]) {    
sawine@77
   106
            ces["func"](event.target.id, ces);
sawine@89
   107
            last_colours[0] = black;
sawine@72
   108
            break;
sawine@72
   109
        }
sawine@72
   110
    }
sawine@72
   111
}
sawine@72
   112
sawine@89
   113
function handle_hover(event) {
sawine@89
   114
    var xy = mouse_pos(event, "#logo");
sawine@89
   115
    var x = xy[0];
sawine@89
   116
    var y = xy[1];
sawine@89
   117
    for (var i in click_events[event.target.id]) {
sawine@89
   118
        var ces = click_events[event.target.id][i];
sawine@89
   119
        if (ces && x >= ces["min_x"] && x <= ces["max_x"]
sawine@89
   120
            && y >= ces["min_y"] && y <= ces["max_y"]) {    
sawine@89
   121
            highlight_menu(event.target.id, ces);
sawine@89
   122
            break;
sawine@89
   123
        }
sawine@89
   124
    }
sawine@89
   125
}
sawine@89
   126
sawine@89
   127
function handle_mouse_out(event) {
sawine@89
   128
    highlight_menu(event.target.id, null);
sawine@89
   129
}
sawine@89
   130
sawine@72
   131
function switch_page(id, params) {
sawine@74
   132
    var page = params["args"][0];
sawine@72
   133
    $("body").load(page);
sawine@72
   134
    document.location.href = page;    
sawine@72
   135
}
sawine@92
   136
sawine@89
   137
var last_highlight;
sawine@89
   138
var last_colours = new Array();
sawine@92
   139
sawine@89
   140
function highlight_menu(id, p) {
sawine@89
   141
    if (last_highlight == p) {
sawine@89
   142
        return;
sawine@89
   143
    }
sawine@89
   144
    var canvas = document.getElementById("logo");
sawine@89
   145
    var context = canvas.getContext("2d");    
sawine@89
   146
    var image = context.getImageData(0, 0, menu_width, menu_height);
sawine@89
   147
    if (last_highlight && last_colours && last_colours[0] && last_colours[1]) {        
sawine@89
   148
        page = last_highlight["args"][0]; 
sawine@89
   149
        min_x = last_highlight["min_x"];
sawine@89
   150
        max_x = last_highlight["max_x"];
sawine@89
   151
        min_y = last_highlight["min_y"];
sawine@90
   152
        max_y = last_highlight["max_y"];
sawine@90
   153
        colour_area(image, min_x + 10, max_x - 10, 0, 60, 
sawine@90
   154
                    last_colours[0]);
sawine@90
   155
        colour_area(image, min_x + 10, max_x - 10, 60, max_y - 10, 
sawine@90
   156
                    last_colours[1]);
sawine@89
   157
    }
sawine@90
   158
    if (p) {    
sawine@90
   159
        var page = p["args"][0]; 
sawine@90
   160
        var min_x = p["min_x"];
sawine@90
   161
        var max_x = p["max_x"];
sawine@90
   162
        var min_y = p["min_y"];
sawine@90
   163
        var max_y = p["max_y"];       
sawine@90
   164
        last_colours[0] = colour_area(image, min_x + 10, max_x - 10, 0, 60, 
sawine@90
   165
                                      orange);
sawine@90
   166
        last_colours[1] = colour_area(image, min_x + 10, max_x - 10, 60, max_y - 10, 
sawine@92
   167
                                      white);      
sawine@90
   168
    }
sawine@90
   169
    
sawine@89
   170
    context.putImageData(image, 0, 0);
sawine@89
   171
    last_highlight = p;
sawine@89
   172
}
sawine@72
   173
sawine@77
   174
function colour_area(image, min_x, max_x, min_y, max_y, colour) {   
sawine@89
   175
    var pixels = image.data;
sawine@89
   176
    var old_colour;
sawine@72
   177
    for (var y = min_y; y <= max_y; y += 1) {
sawine@72
   178
        for (var x = min_x; x <= max_x; x += 1) {
sawine@72
   179
            var pix_colour = getPixel(image, x, y);
sawine@72
   180
            if (pix_colour.a > 0) {
sawine@89
   181
                colour.a = pix_colour.a;               
sawine@89
   182
                setPixel(image, x, y, colour); 
sawine@89
   183
                if (pix_colour.a == 255) {
sawine@92
   184
                    old_colour = pix_colour;
sawine@89
   185
                }
sawine@72
   186
            }
sawine@72
   187
        }
sawine@89
   188
    }
sawine@89
   189
    return old_colour;
sawine@72
   190
}
sawine@72
   191
sawine@72
   192
function init_logo(event) {
sawine@72
   193
    var canvas = document.getElementById("logo");
sawine@77
   194
    var context = canvas.getContext("2d");    
sawine@72
   195
    canvas.width = menu_width;
sawine@72
   196
    canvas.height = menu_height;
sawine@72
   197
    context.drawImage(event.target, 0, 0);
sawine@78
   198
    var image = context.getImageData(0, 0, menu_width, menu_height);    
sawine@72
   199
    for (var i in click_events["logo"]) {
sawine@77
   200
        var p = click_events["logo"][i]; 
sawine@77
   201
        var min_x = p["min_x"];
sawine@77
   202
        var max_x = p["max_x"];
sawine@77
   203
        var min_y = p["min_y"];
sawine@77
   204
        var max_y = p["max_y"];
sawine@74
   205
        var pos = document.location.href.lastIndexOf("/") + 1; 
sawine@77
   206
        var page = document.location.href.substr(pos);        
sawine@74
   207
        for (var j in p["args"]) {
sawine@74
   208
            if (page == p["args"][j]) {         
sawine@113
   209
                colour_area(image, min_x, max_x, 0, 60, blue);
sawine@78
   210
                colour_area(image, min_x, max_x, 60, max_y, white);
sawine@74
   211
                break;
sawine@74
   212
            }
sawine@78
   213
            else {
sawine@78
   214
                colour_area(image, min_x, max_x, 0, 60, white);
sawine@78
   215
                colour_area(image, min_x, max_x, 60, max_y,  orange);  
sawine@78
   216
            }
sawine@78
   217
        }       
sawine@77
   218
    } 
sawine@78
   219
    context.putImageData(image, 0, 0);      
sawine@77
   220
    // context.fillStyle = green.str();
sawine@77
   221
    // console.log((found["max_x"] - found["min_x"]) / 2 + found["min_x"] - 2);
sawine@77
   222
    // context.fillRect((found["max_x"]-found["min_x"])/2+found["min_x"]-1, 95, 2, 5);  
sawine@80
   223
    draw_menu_lines();   
sawine@75
   224
}
sawine@75
   225
sawine@80
   226
function draw_menu_lines() {
sawine@75
   227
    var canvas = document.getElementById("logo");
sawine@75
   228
    var context = canvas.getContext("2d");  
sawine@75
   229
    var image = context.getImageData(0, 0, menu_width, menu_height);
sawine@75
   230
    var pixels = image.data;
sawine@75
   231
    context.lineCap = "round";
sawine@75
   232
    context.lineWidth = 1;
sawine@75
   233
    var colour1a = new Colour(0, 0, 0, 0.1);
sawine@75
   234
    context.beginPath();   
sawine@75
   235
    context.moveTo(0, menu_height - 1);
sawine@75
   236
    context.lineTo(menu_width - 1, menu_height - 1);   
sawine@75
   237
    context.closePath();  
sawine@75
   238
    context.strokeStyle = colour1a.str();
sawine@76
   239
    context.stroke(); 
sawine@76
   240
    var colour1e = new Colour(0, 0, 0, 0.05);  
sawine@76
   241
    context.beginPath();   
sawine@76
   242
    context.moveTo(70, menu_height - 1);
sawine@76
   243
    context.lineTo(menu_width - 71, menu_height - 1);   
sawine@76
   244
    context.closePath();  
sawine@76
   245
    context.strokeStyle = colour1e.str();
sawine@76
   246
    context.stroke();  
sawine@76
   247
    var colour1b = new Colour(0, 0, 0, 0.05);  
sawine@75
   248
    context.beginPath();   
sawine@75
   249
    context.moveTo(50, menu_height - 1);
sawine@75
   250
    context.lineTo(menu_width - 51, menu_height - 1);   
sawine@75
   251
    context.closePath();  
sawine@75
   252
    context.strokeStyle = colour1b.str();
sawine@75
   253
    context.stroke();
sawine@75
   254
    var colour1c = new Colour(0, 0, 0, 0.05);  
sawine@75
   255
    context.beginPath();   
sawine@75
   256
    context.moveTo(25, menu_height - 1);
sawine@75
   257
    context.lineTo(menu_width - 26, menu_height - 1);   
sawine@75
   258
    context.closePath();  
sawine@75
   259
    context.strokeStyle = colour1c.str();
sawine@75
   260
    context.stroke();
sawine@75
   261
    var colour1d = new Colour(0, 0, 0, 0.05);  
sawine@75
   262
    context.beginPath();   
sawine@75
   263
    context.moveTo(10, menu_height - 1);
sawine@75
   264
    context.lineTo(menu_width - 11, menu_height - 1);   
sawine@75
   265
    context.closePath();  
sawine@75
   266
    context.strokeStyle = colour1d.str();
sawine@75
   267
    context.stroke();  
sawine@75
   268
    
sawine@75
   269
    var colour2 = new Colour(0, 0, 0, 0.2);
sawine@75
   270
    context.beginPath();  
sawine@75
   271
    context.moveTo(menu_splits[0], 0); 
sawine@75
   272
    context.lineTo(menu_splits[0], menu_height - 1);
sawine@75
   273
    context.moveTo(menu_splits[1], 0);
sawine@75
   274
    context.lineTo(menu_splits[1], menu_height - 1);
sawine@75
   275
    context.moveTo(menu_splits[2], 0);
sawine@75
   276
    context.lineTo(menu_splits[2], menu_height - 1);
sawine@75
   277
    context.closePath();
sawine@75
   278
    context.strokeStyle = colour2.str();
sawine@75
   279
    context.stroke();
sawine@75
   280
sawine@75
   281
    context.clearRect(menu_splits[0] - 1, menu_height - 1, 2, 2);
sawine@75
   282
    context.clearRect(menu_splits[1] - 1, menu_height - 1, 2, 2);
sawine@75
   283
    context.clearRect(menu_splits[2] - 1, menu_height - 1, 2, 2);
sawine@76
   284
sawine@76
   285
    context.clearRect(menu_splits[0] - 1, menu_height - 2, 1, 1);
sawine@76
   286
    context.clearRect(menu_splits[1] - 1, menu_height - 2, 1, 1);
sawine@76
   287
    context.clearRect(menu_splits[2] - 1, menu_height - 2, 1, 1);
sawine@75
   288
}
sawine@75
   289
sawine@75
   290
function clearMenuLines() {
sawine@75
   291
    var canvas = document.getElementById("logo");
sawine@75
   292
    var context = canvas.getContext("2d");  
sawine@75
   293
    var image = context.getImageData(0, 0, menu_width, menu_height);
sawine@75
   294
    var pixels = image.data;
sawine@75
   295
    context.clearRect(0, menu_height - 2, menu_width - 1, 2);
sawine@75
   296
    context.clearRect(menu_splits[0] - 1, 0, 2, menu_height - 1);
sawine@75
   297
    context.clearRect(menu_splits[1] - 1, 0, 2, menu_height - 1);
sawine@75
   298
    context.clearRect(menu_splits[2] - 1, 0, 2, menu_height - 1);
sawine@72
   299
}
sawine@72
   300
sawine@80
   301
function draw_sim_lines() {
sawine@80
   302
    var w = 670;
sawine@80
   303
    var h = 50;
sawine@80
   304
    var canvas = document.getElementById("sim");
sawine@80
   305
    var context = canvas.getContext("2d");  
sawine@80
   306
    var image = context.getImageData(0, 0, w, h);
sawine@80
   307
    var pixels = image.data;
sawine@80
   308
    context.lineCap = "round";
sawine@80
   309
    context.lineWidth = 1;
sawine@80
   310
    var colour1a = new Colour(0, 0, 0, 0.1);
sawine@80
   311
    context.beginPath();   
sawine@80
   312
    context.moveTo(0, h - 1);
sawine@80
   313
    context.lineTo(w - 1, h - 1);   
sawine@80
   314
    context.closePath();  
sawine@80
   315
    context.strokeStyle = colour1a.str();
sawine@80
   316
    context.stroke(); 
sawine@82
   317
    var colour1e = new Colour(0, 0, 0, 0.05);  
sawine@82
   318
    context.beginPath();   
sawine@82
   319
    context.moveTo(70, h - 1);
sawine@82
   320
    context.lineTo(w - 71, h - 1);   
sawine@82
   321
    context.closePath();  
sawine@82
   322
    context.strokeStyle = colour1e.str();
sawine@82
   323
    context.stroke();  
sawine@80
   324
    var colour1b = new Colour(0, 0, 0, 0.05);  
sawine@80
   325
    context.beginPath();   
sawine@80
   326
    context.moveTo(50, h - 1);
sawine@80
   327
    context.lineTo(w - 51, h - 1);   
sawine@80
   328
    context.closePath();  
sawine@80
   329
    context.strokeStyle = colour1b.str();
sawine@80
   330
    context.stroke();
sawine@82
   331
    var colour1c = new Colour(0, 0, 0, 0.05);  
sawine@82
   332
    context.beginPath();   
sawine@82
   333
    context.moveTo(25, h - 1);
sawine@82
   334
    context.lineTo(w - 26, h - 1);   
sawine@82
   335
    context.closePath();  
sawine@82
   336
    context.strokeStyle = colour1c.str();
sawine@82
   337
    context.stroke();
sawine@80
   338
    var colour1d = new Colour(0, 0, 0, 0.05);  
sawine@80
   339
    context.beginPath();   
sawine@80
   340
    context.moveTo(10, h - 1);
sawine@80
   341
    context.lineTo(w - 11, h - 1);   
sawine@80
   342
    context.closePath();  
sawine@80
   343
    context.strokeStyle = colour1d.str();
sawine@80
   344
    context.stroke();   
sawine@80
   345
}
sawine@80
   346
sawine@72
   347
function update_logo() {
sawine@72
   348
    var canvas = document.getElementById("logo");
sawine@72
   349
    var context = canvas.getContext("2d");  
sawine@72
   350
    var image = context.getImageData(0, 0, menu_width, menu_height);
sawine@72
   351
    var pixels = image.data;
sawine@72
   352
    var white = new Colour(255, 255, 255);
sawine@72
   353
    for (var y = 0; y < menu_height; y += 1) {
sawine@72
   354
        for (var x = 0; x < menu_width; x += 1) {
sawine@72
   355
            var pix_colour = getPixel(image, x, y);
sawine@72
   356
            if (pix_colour.a > 0) {
sawine@72
   357
                setPixel(image, x, y, new Colour(90, 215, 21, pix_colour.a));
sawine@72
   358
            }
sawine@72
   359
        }
sawine@72
   360
    }   
sawine@72
   361
    context.putImageData(image, 0, 0);
sawine@72
   362
}
sawine@72
   363
sawine@84
   364
var char_map = new Array();
sawine@84
   365
char_map["A"] = new Array(new Array(0, 4), new Array(1, 3),
sawine@84
   366
                          new Array(2, 2), new Array(3, 1),
sawine@84
   367
                          new Array(4, 0), new Array(5, 1),
sawine@84
   368
                          new Array(6, 2), new Array(7, 3),
sawine@84
   369
                          new Array(8, 4), new Array(2, 3),
sawine@84
   370
                          new Array(3, 3), new Array(4, 3),
sawine@84
   371
                          new Array(5, 3), new Array(6, 3));
sawine@84
   372
char_map["M"] = new Array(new Array(0, 4), new Array(0, 3),
sawine@84
   373
                          new Array(0, 2), new Array(0, 1),
sawine@84
   374
                          new Array(0, 0), new Array(0, 5),
sawine@84
   375
                          new Array(5, 4), new Array(5, 3),
sawine@84
   376
                          new Array(5, 2), new Array(5, 1),
sawine@84
   377
                          new Array(5, 0), new Array(5, 5),
sawine@84
   378
                          new Array(1, 1), new Array(2, 2), 
sawine@84
   379
                          new Array(4, 2), new Array(5, 1),
sawine@84
   380
                          new Array(3, 3));
sawine@84
   381
char_map["E"] = new Array(new Array(0, 4), new Array(0, 3),
sawine@84
   382
                          new Array(0, 2), new Array(0, 1),
sawine@84
   383
                          new Array(0, 0), new Array(0, 5),
sawine@84
   384
                          new Array(1, 0), new Array(2, 0),
sawine@84
   385
                          new Array(3, 0),
sawine@84
   386
                          new Array(1, 3), new Array(2, 3),                       
sawine@84
   387
                          new Array(1, 5), new Array(2, 5),
sawine@84
   388
                          new Array(3, 5))
sawine@84
   389
char_map["7"] = new Array(new Array(0, 0), new Array(1, 0),
sawine@84
   390
                          new Array(2, 0),
sawine@84
   391
                          new Array(0, 5), new Array(0, 4),
sawine@84
   392
                          new Array(1, 3), new Array(2, 2));
sawine@84
   393
char_map["3"] = new Array(new Array(2, 4), new Array(2, 3),
sawine@84
   394
                          new Array(2, 2), new Array(2, 1),
sawine@84
   395
                          new Array(0, 0), new Array(0, 5),
sawine@84
   396
                          new Array(1, 0), new Array(2, 0),                         
sawine@84
   397
                          new Array(1, 3), new Array(2, 3),                          
sawine@84
   398
                          new Array(1, 5), new Array(2, 5))
sawine@84
   399
sawine@84
   400
function init_gameoflife(text) {
sawine@81
   401
    var canvas = document.getElementById("gameoflife");
sawine@84
   402
    var cell_size = 16;
sawine@81
   403
    if (canvas) {
sawine@84
   404
        gameoflife = new Simulation(canvas, 670, 670, cell_size,
sawine@82
   405
                                    green, black);
sawine@80
   406
        $("#gameoflife").mousemove(function(event) { 
sawine@80
   407
            gameoflife.mouse_moved(mouse_pos(event, "#gameoflife")); 
sawine@87
   408
        });       
sawine@87
   409
        var offset = new Array(13, 16);
sawine@84
   410
        for (var c in text) {            
sawine@84
   411
            var w = 0;
sawine@84
   412
            for (p in char_map[text[c]]) {
sawine@84
   413
                var x = char_map[text[c]][p][0];
sawine@84
   414
                var y = char_map[text[c]][p][1];
sawine@84
   415
                w = Math.max(w, x);
sawine@84
   416
                var pos = new Array((x + offset[0]) * cell_size, 
sawine@84
   417
                                    (y + offset[1]) * cell_size);
sawine@84
   418
                gameoflife.activate_cell(pos);
sawine@84
   419
            }            
sawine@84
   420
            offset[0] += w + 2;
sawine@84
   421
        }       
sawine@84
   422
    }    
sawine@80
   423
}
sawine@80
   424
sawine@72
   425
function Colour(r, g, b, a) {
sawine@72
   426
    this.r = r;
sawine@72
   427
    this.g = g;
sawine@72
   428
    this.b = b;
sawine@77
   429
    this.a = a == undefined ? 255 : a;
sawine@72
   430
}
sawine@72
   431
Colour.prototype.equals = function(rhs) {
sawine@72
   432
    for (p in this) {
sawine@72
   433
        if (typeof(rhs[p]) == undefined
sawine@72
   434
           || this[p] != rhs[p]) {           
sawine@72
   435
            return false;
sawine@72
   436
        }
sawine@72
   437
    }
sawine@72
   438
    return true;
sawine@72
   439
}
sawine@75
   440
Colour.prototype.str = function() {
sawine@75
   441
    return "rgba(" + this.r + "," + this.g + "," + this.b + "," + this.a + ")";
sawine@75
   442
}
sawine@72
   443
sawine@78
   444
var white = new Colour(255, 255, 255);
sawine@89
   445
var black = new Colour(0, 0, 0, 255);
sawine@89
   446
var orange = new Colour(201, 87, 35, 255);
sawine@89
   447
var green = new Colour(90, 215, 21, 255);
sawine@113
   448
var blue = new Colour(85, 170, 221, 255);
sawine@89
   449
var background = new Colour(34, 34, 34, 255);
sawine@78
   450
sawine@77
   451
function setPixel(image, x, y, colour) {
sawine@72
   452
    var index = 4 * (x + y * image.width);
sawine@77
   453
    image.data[index] = colour.r;
sawine@77
   454
    image.data[index + 1] = colour.g;
sawine@77
   455
    image.data[index + 2] = colour.b;
sawine@77
   456
    image.data[index + 3] = colour.a;
sawine@72
   457
}
sawine@72
   458
sawine@72
   459
function getPixel(image, x, y) {   
sawine@72
   460
    var index = 4 * (x + y * image.width);
sawine@72
   461
    var r = image.data[index];
sawine@72
   462
    var g = image.data[index + 1];
sawine@72
   463
    var b = image.data[index + 2];
sawine@72
   464
    var a = image.data[index + 3];
sawine@72
   465
    return new Colour(r, g, b, a);
sawine@72
   466
}
sawine@72
   467
sawine@72
   468
function load_random_quote() {
sawine@72
   469
    var file = "/quotes/quote" + Math.floor(Math.random() * QUOTES_NUMBER + 1) + ".html";
sawine@72
   470
    $.ajax({url: SERVER + file,
sawine@74
   471
            success: write_quote});
sawine@72
   472
}
sawine@72
   473
sawine@74
   474
function write_quote(data, status, xhr) {   
sawine@74
   475
    $("#random_quote").html(data);
sawine@72
   476
}
sawine@72
   477
sawine@72
   478
function load_footer()
sawine@72
   479
{
sawine@72
   480
	var file = "/footer.html";
sawine@72
   481
	var currentFile = self.location.hostname + self.location.pathname;		
sawine@72
   482
	var request = http_request_object();
sawine@72
   483
	var url  = "http://" + self.location.hostname + file;	
sawine@72
   484
	request.open("GET", url, false);
sawine@72
   485
	request.setRequestHeader("User-Agent", navigator.userAgent);
sawine@72
   486
	request.send(null)
sawine@72
   487
	// if (oRequest.status == 200) alert(oRequest.responseText);
sawine@72
   488
	// else alert("Error executing XMLHttpRequest call!");	
sawine@72
   489
	//document.write(url);
sawine@72
   490
	//document.write(request.responseText);
sawine@72
   491
    document.getElementById('footer').innerHTML = request.responseText;
sawine@72
   492
}
sawine@72
   493
sawine@72
   494
sawine@72
   495
sawine@72
   496
// Mandelbrot functions
sawine@72
   497
function Complex(real, imag) 
sawine@72
   498
{
sawine@72
   499
	this.real = real;
sawine@72
   500
	this.imag = imag;
sawine@72
   501
}
sawine@72
   502
sawine@72
   503
var MIN_C = new Complex(-2.2, -1.4);
sawine@72
   504
var MAX_C = new Complex(1.0, 1.4);
sawine@72
   505
var min_c = MIN_C;
sawine@72
   506
var max_c = MAX_C;
sawine@72
   507
var MIN_ITER = 100;
sawine@72
   508
var max_iter = MIN_ITER;
sawine@72
   509
var zoom = 1.0;
sawine@72
   510
var resolution = 3;
sawine@72
   511
var bailout = 4.0;
sawine@72
   512
sawine@72
   513
function Result(z, iter) 
sawine@72
   514
{
sawine@72
   515
	this.z = z;
sawine@72
   516
	this.iter = iter;
sawine@72
   517
}
sawine@72
   518
sawine@72
   519
function complex_quad(c)
sawine@72
   520
{
sawine@72
   521
	return new Complex(Math.pow(c.real, 2) - Math.pow(c.imag, 2), 
sawine@72
   522
		2.0 * c.real * c.imag);
sawine@72
   523
}
sawine@72
   524
sawine@72
   525
function complex_quad_value(c)
sawine@72
   526
{
sawine@72
   527
	return Math.pow(c.real, 2) + Math.pow(c.imag, 2);
sawine@72
   528
}
sawine@72
   529
sawine@72
   530
function complex_add(c1, c2)
sawine@72
   531
{
sawine@72
   532
	return new Complex(c1.real + c2.real, c1.imag + c2.imag);
sawine@72
   533
}
sawine@72
   534
sawine@72
   535
function complex_equal(c1, c2)
sawine@72
   536
{	
sawine@72
   537
	return (c1.real == c2.real) && (c1.imag == c2.imag);
sawine@72
   538
}
sawine@72
   539
sawine@72
   540
function iterate(z, c) 
sawine@72
   541
{
sawine@72
   542
	z_quad = complex_quad(z);
sawine@72
   543
	return new Complex(z_quad.real + c.real, z_quad.imag + c.imag);
sawine@72
   544
}
sawine@72
   545
sawine@72
   546
function test(c, max_iter) 
sawine@72
   547
{
sawine@72
   548
	var iter = 0;
sawine@72
   549
	var z = new Complex(0.0, 0.0);
sawine@72
   550
	var last_z = new Complex(-1.0, 0.0);
sawine@72
   551
	var quad_z = complex_quad_value(z);
sawine@72
   552
	
sawine@72
   553
	while (iter < max_iter
sawine@72
   554
		&& !complex_equal(z, last_z)
sawine@72
   555
		&& quad_z <= bailout)
sawine@72
   556
	{
sawine@72
   557
		last_z = z;
sawine@72
   558
		z = iterate(z, c);
sawine@72
   559
		quad_z = complex_quad_value(z);
sawine@72
   560
		iter++;
sawine@72
   561
	}
sawine@72
   562
	return new Result(quad_z, iter);
sawine@72
   563
}
sawine@72
   564
sawine@72
   565
function draw(diter, dx, dy, dz, dres)
sawine@72
   566
{  
sawine@72
   567
	var canvas = document.getElementById('mandelbrot'); 
sawine@72
   568
	
sawine@72
   569
	if (canvas.getContext)
sawine@72
   570
	{  
sawine@72
   571
		zoom += dz;
sawine@72
   572
		var ctx = canvas.getContext('2d');
sawine@72
   573
sawine@72
   574
		if (dres != 0)
sawine@72
   575
		{		
sawine@72
   576
			resolution = Math.max(1, resolution + dres);
sawine@72
   577
		}
sawine@72
   578
sawine@72
   579
		if (diter != 0)
sawine@72
   580
		{
sawine@72
   581
			max_iter = Math.max(MIN_ITER, max_iter + diter);
sawine@72
   582
		}
sawine@72
   583
		
sawine@72
   584
		var red = "rgb(255, 0, 0)";
sawine@72
   585
		var white = "rgb(255, 255, 255)";
sawine@72
   586
		var width = canvas.width;
sawine@72
   587
		var height = canvas.height;
sawine@72
   588
		var dim = Math.max(width, height);
sawine@72
   589
		var dim_ratio = Math.round(width / height);	
sawine@72
   590
		var diff_c = new Complex(max_c.real - min_c.real,
sawine@72
   591
			max_c.imag - min_c.imag);
sawine@72
   592
		dx_min = diff_c.real / 100 * (dx + dz);
sawine@72
   593
		dx_max = diff_c.real / 100 * (dx - dz);
sawine@72
   594
sawine@72
   595
		dy_min = diff_c.imag / 100 * (dy + dz);
sawine@72
   596
		dy_max = diff_c.imag / 100 * (dy - dz);
sawine@72
   597
sawine@72
   598
		var min_inc = new Complex(dx_min * dim_ratio / 2.0, dy_min);
sawine@72
   599
		var max_inc = new Complex(dx_max * dim_ratio / 2.0, dy_max);
sawine@72
   600
		min_c = complex_add(min_c, min_inc);
sawine@72
   601
		max_c = complex_add(max_c, max_inc);
sawine@72
   602
		diff_c = new Complex(max_c.real - min_c.real,
sawine@72
   603
			max_c.imag - min_c.imag);
sawine@72
   604
		
sawine@72
   605
		for (var y = 0; y < height; y += resolution) 
sawine@72
   606
		{
sawine@72
   607
			for (var x = 0; x < width; x += resolution) 
sawine@72
   608
			{    			
sawine@72
   609
				var c = new Complex(min_c.real + diff_c.real / dim * x, 
sawine@72
   610
					min_c.imag + diff_c.imag / dim * y);  	
sawine@72
   611
			 	var result = test(c, max_iter);	
sawine@72
   612
		 		var r = Math.min(255, Math.pow(Math.max(0, 
sawine@72
   613
		 			(result.iter - max_iter / 20.0)), 2));
sawine@72
   614
				var g = Math.min(255, Math.pow(Math.max(0, 
sawine@72
   615
					(result.iter - max_iter / 25.0)), 2));			
sawine@72
   616
		 		var b = Math.min(255, Math.pow(Math.max(0, 
sawine@72
   617
					(result.iter - max_iter / 20.0)), 2));
sawine@72
   618
		 		var colour = "rgb(" + r + "," + g + "," + b + ")";
sawine@72
   619
		 		ctx.fillStyle = colour; 
sawine@72
   620
				ctx.fillRect(x, y, resolution, resolution);			
sawine@72
   621
			}
sawine@72
   622
  		}
sawine@72
   623
	}  
sawine@72
   624
} 
sawine@72
   625
sawine@72
   626
function getEventOffsetX(evt)
sawine@72
   627
{
sawine@72
   628
	if (evt.offsetX != null)
sawine@72
   629
		return evt.offsetX;
sawine@72
   630
 
sawine@72
   631
    var obj = evt.target || evt.srcElement;
sawine@72
   632
   	setPageTopLeft(obj);
sawine@72
   633
    return (evt.clientX - obj.pageLeft);
sawine@72
   634
}
sawine@72
   635
sawine@72
   636
function getEventOffsetY(evt)
sawine@72
   637
{
sawine@72
   638
	if (evt.offsetY != null)
sawine@72
   639
		return evt.offsetY;
sawine@72
   640
 
sawine@72
   641
    var obj = evt.target || evt.srcElement;
sawine@72
   642
   	setPageTopLeft(obj);
sawine@72
   643
    return (evt.clientY - obj.pageTop);
sawine@72
   644
}
sawine@72
   645
 
sawine@72
   646
function setPageTopLeft( o )
sawine@72
   647
{
sawine@72
   648
    var top = 0,
sawine@72
   649
    left = 0,
sawine@72
   650
    obj = o;
sawine@72
   651
 
sawine@72
   652
    while (o.offsetParent)
sawine@72
   653
     {
sawine@72
   654
         left += o.offsetLeft ;
sawine@72
   655
         top += o.offsetTop ;
sawine@72
   656
         o = o.offsetParent ;
sawine@72
   657
    };
sawine@72
   658
 
sawine@72
   659
    obj.pageTop = top;
sawine@72
   660
    obj.pageLeft = left; 
sawine@72
   661
}
sawine@72
   662
 
sawine@78
   663
function draw2(evt) {
sawine@78
   664
    var iter = 0;
sawine@78
   665
    var res = 0;
sawine@78
   666
    var x = (getEventOffsetX(evt) - 335) / 167.5;
sawine@72
   667
    var y = (getEventOffsetY(evt) - 140) / 70;
sawine@78
   668
    var z = 0;
sawine@78
   669
    draw(iter, x, y, z, res);
sawine@72
   670
}
sawine@72
   671
sawine@78
   672
function update() {
sawine@78
   673
    simulation.update();
sawine@78
   674
    simulation.draw();
sawine@80
   675
    if (gameoflife) {
sawine@80
   676
        gameoflife.update();
sawine@80
   677
        gameoflife.draw();
sawine@80
   678
    }
sawine@78
   679
}
sawine@72
   680
sawine@78
   681
function Grid(width, height, cell_size) {
sawine@82
   682
    this.width = parseInt(width / cell_size + 0.5);
sawine@82
   683
    this.height = parseInt(height / cell_size + 0.5);
sawine@78
   684
    this.canvas_width = width;
sawine@78
   685
    this.canvas_height = height;
sawine@78
   686
    this.cell_size = cell_size;  
sawine@78
   687
    this.cells = new Array();
sawine@78
   688
    for (var y = 0; y < this.height; ++y) { 
sawine@78
   689
        this.cells[y] = new Array();
sawine@78
   690
        for (var x = 0; x < this.width; ++x) {
sawine@78
   691
            this.cells[y][x] = new Cell(x, y, 0, this);
sawine@78
   692
        }
sawine@78
   693
    }
sawine@78
   694
}
sawine@78
   695
Grid.prototype.cell = function(x, y) {   
sawine@78
   696
    return this.cells[y][x];
sawine@78
   697
}
sawine@78
   698
Grid.prototype.pick_cell = function(x, y) {
sawine@80
   699
    var lx = parseInt(x / this.cell_size - 0.5);
sawine@92
   700
    var ly = parseInt(y / this.cell_size - 0.5);  
sawine@78
   701
    return this.cells[ly][lx];
sawine@78
   702
}
sawine@78
   703
sawine@78
   704
function Cell(x, y, value, grid) {
sawine@78
   705
    this.x = x;
sawine@78
   706
    this.y = y;  
sawine@78
   707
    this.canvas_x = x * grid.cell_size;
sawine@78
   708
    this.canvas_y = y * grid.cell_size;
sawine@78
   709
    this.value = value;
sawine@78
   710
    this.grid = grid;
sawine@78
   711
    this._neighbours = new Array();
sawine@78
   712
    this.last_mod = 0;
sawine@78
   713
}
sawine@78
   714
Cell.prototype.hash = function() {
sawine@78
   715
    return this.x + ", " + this.y;
sawine@78
   716
}
sawine@78
   717
Cell.prototype.set_value = function(value) {
sawine@78
   718
    this.value = value;
sawine@78
   719
    this.last_mod = $.now();
sawine@78
   720
}
sawine@78
   721
Cell.prototype.neighbours = function() {
sawine@78
   722
    if (this._neighbours.length) {
sawine@78
   723
        return this._neighbours;
sawine@78
   724
    }
sawine@78
   725
    if (this.x > 0) {
sawine@78
   726
        this._neighbours.push(this.grid.cell(this.x-1, this.y));
sawine@78
   727
        if (this.y > 0) {
sawine@78
   728
            this._neighbours.push(this.grid.cell(this.x-1, this.y-1));
sawine@78
   729
            this._neighbours.push(this.grid.cell(this.x, this.y-1));
sawine@78
   730
        }
sawine@78
   731
        if (this.y + 1 < this.grid.height) {
sawine@78
   732
            this._neighbours.push(this.grid.cell(this.x-1, this.y+1));
sawine@78
   733
        }
sawine@82
   734
    }   
sawine@78
   735
    if (this.x + 1 < this.grid.width) {
sawine@78
   736
        this._neighbours.push(this.grid.cell(this.x+1, this.y));
sawine@78
   737
        if (this.y + 1 < this.grid.height) {
sawine@78
   738
            this._neighbours.push(this.grid.cell(this.x+1, this.y+1));
sawine@78
   739
            this._neighbours.push(this.grid.cell(this.x, this.y+1));
sawine@78
   740
        }
sawine@78
   741
        if (this.y > 0) {
sawine@78
   742
            this._neighbours.push(this.grid.cell(this.x+1, this.y-1));
sawine@78
   743
        }
sawine@78
   744
    }
sawine@78
   745
    return this._neighbours;
sawine@78
   746
}
sawine@78
   747
Cell.prototype.density = function() {
sawine@78
   748
    var d = 0;
sawine@78
   749
    var neighbours = this.neighbours();
sawine@78
   750
    for (var n in neighbours) {
sawine@78
   751
        d += neighbours[n].value;
sawine@78
   752
    }
sawine@78
   753
    return d;
sawine@78
   754
}
sawine@78
   755
sawine@82
   756
function Simulation(canvas, w, h, cell_size, life_colour, dead_colour) {
sawine@84
   757
    this.last_update = $.now() + 3000;
sawine@78
   758
    this.last_draw = 0;
sawine@78
   759
    this.last_mouse_moved = 0;
sawine@78
   760
    this.redraw = new Array();   
sawine@78
   761
    this.canvas = canvas;
sawine@80
   762
    this.canvas.width = w;
sawine@80
   763
    this.canvas.height = h;
sawine@78
   764
    this.context = canvas.getContext("2d");    
sawine@78
   765
    this.pos_queue = new Array();
sawine@78
   766
    this.cell_queue = new Array();  
sawine@81
   767
    this.cell_size = cell_size;
sawine@82
   768
    this.life_colour = life_colour;
sawine@82
   769
    this.dead_colour = dead_colour;
sawine@78
   770
    this.grid = new Grid(this.canvas.width, this.canvas.height, cell_size);
sawine@80
   771
    draw_sim_lines();
sawine@78
   772
}
sawine@78
   773
Simulation.prototype.draw = function() {
sawine@78
   774
    var now = $.now();
sawine@79
   775
    if (this.redraw.length) {
sawine@83
   776
        var cell = this.redraw[0];
sawine@83
   777
        this.redraw.shift();
sawine@82
   778
        this.context.fillStyle = cell.value == 1 ? 
sawine@82
   779
            this.life_colour.str() : this.dead_colour.str();
sawine@78
   780
        this.context.fillRect(cell.canvas_x, cell.canvas_y, 
sawine@78
   781
                              this.grid.cell_size, this.grid.cell_size);
sawine@78
   782
        this.last_draw = $.now();
sawine@78
   783
    }
sawine@78
   784
}
sawine@78
   785
Simulation.prototype.update = function() {
sawine@78
   786
    var now = $.now();
sawine@84
   787
    while (this.pos_queue.length) {
sawine@83
   788
        var pos = this.pos_queue.pop();       
sawine@78
   789
        if (pos[0] < this.canvas.width
sawine@78
   790
            && pos[1] < this.canvas.height) {
sawine@78
   791
            var cell = this.grid.pick_cell(pos[0], pos[1]);
sawine@78
   792
            cell.set_value(1);
sawine@78
   793
            this.cell_queue.push(cell);
sawine@78
   794
            this.cell_queue.concat(cell.neighbours()); 
sawine@83
   795
            this.redraw.unshift(cell);          
sawine@78
   796
        }
sawine@78
   797
    }
sawine@79
   798
    if (this.last_update + 1000 > now) {
sawine@78
   799
        return;
sawine@78
   800
    }
sawine@78
   801
    var changed = new Array();
sawine@79
   802
    var next_cell_queue = new Array();
sawine@79
   803
    while (this.cell_queue.length) {
sawine@83
   804
        var cell = this.cell_queue.pop();       
sawine@79
   805
        if (changed[cell.hash()]) {           
sawine@79
   806
            continue;
sawine@78
   807
        }
sawine@78
   808
        var d = cell.density();
sawine@78
   809
        if (d == 3 && cell.value == 0) {           
sawine@79
   810
            changed[cell.hash()] = cell;            
sawine@79
   811
            next_cell_queue = next_cell_queue.concat(cell.neighbours());               
sawine@78
   812
        } else if (cell.value == 1) {
sawine@78
   813
            if (d < 2 || d > 3) {              
sawine@78
   814
                changed[cell.hash()] = cell;                
sawine@79
   815
                next_cell_queue = next_cell_queue.concat(cell.neighbours());               
sawine@78
   816
            }
sawine@78
   817
        }       
sawine@78
   818
    }
sawine@78
   819
    for (var pos in changed) {
sawine@78
   820
        var cell = changed[pos];      
sawine@78
   821
        cell.set_value(1 - cell.value);
sawine@78
   822
        this.redraw.push(cell);
sawine@78
   823
    }
sawine@83
   824
    this.cell_queue = next_cell_queue;
sawine@78
   825
    this.last_update = now;  
sawine@78
   826
}
sawine@84
   827
Simulation.prototype.activate_cell = function(pos) {
sawine@84
   828
    this.pos_queue.push(pos);   
sawine@84
   829
}
sawine@78
   830
Simulation.prototype.mouse_moved = function(pos) {
sawine@78
   831
    var now = $.now();    
sawine@84
   832
    if (this.last_mouse_moved + 50 < now) {       
sawine@84
   833
        this.pos_queue.push(pos);      
sawine@78
   834
        this.last_mouse_moved = now;       
sawine@78
   835
    }
sawine@78
   836
}
sawine@78
   837
sawine@78
   838