/**
* WebGL Model Viewer - ShaderLibrary.js
* Copyright © Cyril Diagne 2010.
*
* @author kikko.fr
*/

var ShaderLibrary = ShaderLibrary || {

	shaderURL : "",
	
	basic : {},
	
	events : new EventDispatcher(),
	
	load : function() {
		
		this.shaderURL = "assets/shaders/texture";
		this.loadPart(this.shaderURL+".vert");
	},
	
	loadPart : function(url) {
	
		var req = new XMLHttpRequest();
		req.addEventListener("load", delegate(this, this.partLoaded), false);
		req.open('GET', url, true);
		req.setRequestHeader("Content-Type", "text/plain");
		req.overrideMimeType("text/plain; charset=x-user-defined");
		req.send();
	},
	
	partLoaded : function(event) {
		
		if(this.basic.vertexSrc!=null) {
			this.basic.fragmentSrc = event.currentTarget.responseText;
			this.events.dispatchEvent("loadComplete");
		}
		else {
			this.basic.vertexSrc = event.currentTarget.responseText;
			this.loadPart(this.shaderURL+".frag");
		}
	}
};

DynShader = function() {

	this.vertexShader = gl.createShader(gl.VERTEX_SHADER);
	this.fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
}

DynShader.prototype = {

	program : null,
	
	compileAndLink : function(header) {
		
		var shaderSrc = ShaderLibrary.basic;
		var vertexShader = this.compileShaderPart(header+shaderSrc.vertexSrc, this.vertexShader, "vertex");
		var fragmentShader = this.compileShaderPart(header+shaderSrc.fragmentSrc, this.fragmentShader, "fragment");
		
		var program = this.program = gl.createProgram();
		gl.attachShader(program, this.vertexShader);
		gl.attachShader(program, this.fragmentShader);
		
		gl.linkProgram(program);
		
		if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
		  log("ERROR : Could not initialise shaders");
		  return;
		}
	},
	
	compileShaderPart : function(shaderSrc, shader, type) {
		
		gl.shaderSource(shader, shaderSrc);
		gl.compileShader(shader);
		
		if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
			alert(gl.getShaderSource(shader));
			log(gl.getShaderInfoLog(shader), "(on", type, "shader)");
			return null;
		}
		
		return shader;
	}

}
