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