/*
 Simple Julia set[up]
 Copyright © 2011 by Mikael Degerfält 

 This version is a work in progress, lots of bygs and debugging
 can be found in it, and I garantee nothing in terms of functionality
 and safety to use it.
*/
var demi = null

function init( callback ) {

	// Initialize
	demi = new Demi3d()

	// Setup canvas.
	$('#canvas').css( 'padding',0).css('margin',0).
		css('position','absolute').css('z-index',0).
		append('<canvas id=\"gl-canvas\" width=\"250\" height=\"82\"></canvas>')

	var gl = demi.init('gl-canvas')
	if(!gl){
		callback('failed init WebGL')
		return;
	}


	demi.loadShaderFiles([ {'name': 'julia_v', 'type':demi.gl.VERTEX_SHADER, 'url':'/dev/julia/julia.vsh'},
							{'name': 'julia_f', 'type':demi.gl.FRAGMENT_SHADER, 'url':'/dev/julia/julia.fsh'}
						], function(status)
	{
		if(status == 'ok') {
			demi.makeProgram('julia').
				attachShader('julia', 'julia_v').
				attachShader('julia', 'julia_f').
				bindAttributes('julia',['vPosition']).
				linkProgram('julia');
			demi.useProgram('julia');

			// Enable all the vertex arrays
			gl.enableVertexAttribArray(0);
			gl.disable(gl.DEPTH_TEST);

			var vars = { };
			vars.vertObj = gl.createBuffer();
			vars.indexObj = gl.createBuffer();
			vars.positions = new Float32Array( [ -1.0,-1.0, -1.0,1.0,
										1.0, 1.0,	1.0,-1.0 ] )

			vars.indexes = new Uint8Array( [ 0,1,2,0,2,3 ] )

			// Setup all the vertex attributes for vertices, normals and texCoords
			gl.bindBuffer(gl.ARRAY_BUFFER, vars.vertObj );
		    gl.bufferData(gl.ARRAY_BUFFER, vars.positions, gl.STATIC_DRAW);
			gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0 );

			// Bind the index array
			gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, vars.indexObj);
		    gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, vars.indexes, gl.STATIC_DRAW);
			gl.vars = vars;

			callback('ok',gl)
		} else {
			callback('failed loading shaders')
		}
	})

}


function drawPicture(gl,x,y) {
	demi.setUniform1f('julia', 'constant_r', x);
	demi.setUniform1f('julia', 'constant_i', y);
	gl.drawElements(gl.TRIANGLES, 6, gl.UNSIGNED_BYTE, 0 );
	gl.flush();
}

var a = -0.4;
var params = { 'a1': -0.4, 'a2':-0.5, 'd1':0.75, 'd2': 1.8 }
var canvas = null;

$(document).ready( function() {

	// shim layer with setTimeout fallback
	window.requestAnimFrame = (function(){
/*		return  window.requestAnimationFrame       || 
			window.webkitRequestAnimationFrame || 
			window.mozRequestAnimationFrame    || 
			window.oRequestAnimationFrame      || 
			window.msRequestAnimationFrame     || 
			return function(callback, element) {
                window.setTimeout( callback, 1000 / 30);
            };
*/
		return function(callback, element) {
                window.setTimeout( callback, 1000 / 30);
            };
    })();

	init( function(status, gl){
		if(status == 'ok' ) {
			demi.loadTexture('julia','/dev/julia/juliabg.png')
			canvas = document.getElementById("gl-canvas");
			width = canvas.clientWidth;
			height = canvas.clientHeight;
			demi.setUniform1f('julia','ratio', width/height );
			gl.viewport(0, 0, width, height);
			update(0)
		} else{
			if(console)
				console.log('init failed :( ' + status);
		}
	});
});
    
var lasttime = new Date();
function update()
{
	var nt = new Date();
	var dt = (nt.getTime()-lasttime.getTime())/1000
	lasttime = nt
	var x = Math.sin(params.a1)*0.7
	params.a1+= params.d1*(dt);
	var y = Math.cos(params.a2)*0.7
	params.a2+= params.d2*(dt);
	drawPicture(demi.gl, x, y);
	window.requestAnimFrame(update,canvas)

}

