var profileWebGL={};

profileWebGL.argumentEnums={
	"activeTexture":{
		"0":{
			"type":"enum",
			values:{
				"TEXTURE0":1,"TEXTURE1":1,"TEXTURE2":1,"TEXTURE3":1,"TEXTURE4":1,"TEXTURE5":1,"TEXTURE6":1,"TEXTURE7":1,"TEXTURE8":1,"TEXTURE9":1,
				"TEXTURE10":1,"TEXTURE11":1,"TEXTURE12":1,"TEXTURE13":1,"TEXTURE14":1,"TEXTURE15":1,"TEXTURE16":1,"TEXTURE17":1,"TEXTURE18":1,"TEXTURE19":1,
				"TEXTURE20":1,"TEXTURE21":1,"TEXTURE22":1,"TEXTURE23":1,"TEXTURE24":1,"TEXTURE25":1,"TEXTURE26":1,"TEXTURE27":1,"TEXTURE28":1,"TEXTURE29":1,
				"TEXTURE30":1,"TEXTURE31":1
			}
		}
	},
	"bindBuffer":{
		"0":{
			"type":"enum",
			values:{
				"ARRAY_BUFFER":1,"ELEMENT_ARRAY_BUFFER":1
			}
		}
	},
	"bindFramebuffer":{
		"0":{
			"type":"enum",
			values:{
				"FRAMEBUFFER":1
			}
		}
	},
	"bindRenderbuffer":{
		"0":{
			"type":"enum",
			values:{
				"RENDERBUFFER":1
			}
		}
	},
	"bindTexture":{
		"0":{
			"type":"enum",
			values:{
				"TEXTURE_2D":1,"TEXTURE_CUBE_MAP":1
			}
		}
	},
	"blendEquation":{
		"0":{
			"type":"enum",
			values:{
				"FUNC_ADD":1,"FUNC_SUBTRACT":1,"FUNC_REVERSE_SUBTRACT":1
			}
		}
	},
	"blendFunc":{
		"0":{
			"type":"enum",
			values:{
				"ZERO":1,"ONE":1,"SRC_COLOR":1,"ONE_MINUS_SRC_COLOR":1,"DST_COLOR":1,"ONE_MINUS_DST_COLOR":1,"SRC_ALPHA":1,
				"ONE_MINUS_SRC_ALPHA":1,"DST_ALPHA":1,"ONE_MINUS_DST_ALPHA":1,"CONSTANT_COLOR":1,"ONE_MINUS_CONSTANT_COLOR":1,
				"CONSTANT_ALPHA":1,"ONE_MINUS_CONSTANT_ALPHA":1,"SRC_ALPHA_SATURATE":1,
			}
		},
		"1":{
			"type":"enum",
			values:{
				"ZERO":1,"ONE":1,"SRC_COLOR":1,"ONE_MINUS_SRC_COLOR":1,"DST_COLOR":1,"ONE_MINUS_DST_COLOR":1,"SRC_ALPHA":1,
				"ONE_MINUS_SRC_ALPHA":1,"DST_ALPHA":1,"ONE_MINUS_DST_ALPHA":1,"CONSTANT_COLOR":1,"ONE_MINUS_CONSTANT_COLOR":1,
				"CONSTANT_ALPHA":1,"ONE_MINUS_CONSTANT_ALPHA":1,"SRC_ALPHA_SATURATE":1,
			}
		}
	},
	"bufferData":{
		"0":{
			"type":"enum",
			values:{
				"ARRAY_BUFFER":1,"ELEMENT_ARRAY_BUFFER":1
			}
		},
		"2":{
			"type":"enum",
			values:{
				"STREAM_DRAW":1,"STATIC_DRAW":1,"DYNAMIC_DRAW":1
			}
		}
	},
	"clear":{
		"0":{
			"type":"bitmask",
			values:{
				"COLOR_BUFFER_BIT":1,"DEPTH_BUFFER_BIT":1,"STENCIL_BUFFER_BIT":1
			}
		}
	},
	"createShader":{
		"0":{
			"type":"enum",
			values:{
				"VERTEX_SHADER":1,"FRAGMENT_SHADER":1
			}
		}
	},
	"cullFace":{
		"0":{
			"type":"enum",
			values:{
				"FRONT":1,"BACK":1,"FRONT_AND_BACK":1
			}
		}
	},
	"depthFunc":{
		"0":{
			"type":"enum",
			values:{
				"NEVER":1,"LESS":1,"EQUAL":1,"LEQUAL":1,"GREATER":1,"NOTEQUAL":1,"GEQUAL":1,"ALWAYS":1
			}
		}
	},
	"disable":{
		"0":{
			"type":"enum",
			values:{
				"BLEND":1,"CULL_FACE":1,"DEPTH_TEST":1,"DITHER":1,"POLYGON_OFFSET_FILL":1,"SAMPLE_ALPHA_TO_COVERAGE":1,"SAMPLE_COVERAGE":1,
				"SCISSOR_TEST":1,"STENCIL_TEST":1
			}
		}
	},
	"drawElements":{
		"0":{
			"type":"enum",
			values:{
				"POINTS":1,"LINE_STRIP":1,"LINE_LOOP":1,"LINES":1,"TRIANGLE_STRIP":1,"TRIANGLE_FAN":1,"TRIANGLES":1
			}
		},
		"2":{
			"type":"enum",
			values:{
				"UNSIGNED_BYTE":1,"UNSIGNED_SHORT":1
			}
		}
	},
	"enable":{
		"0":{
			"type":"enum",
			values:{
				"BLEND":1,"CULL_FACE":1,"DEPTH_TEST":1,"DITHER":1,"POLYGON_OFFSET_FILL":1,"SAMPLE_ALPHA_TO_COVERAGE":1,
				"SAMPLE_COVERAGE":1,"SCISSOR_TEST":1,"STENCIL_TEST":1
			}
		}
	},
	"framebufferRenderbuffer":{
		"0":{
			"type":"enum",
			values:{
				"FRAMEBUFFER":1
			}
		},
		"1":{
			"type":"enum",
			values:{
				"COLOR_ATTACHMENT0":1,"DEPTH_ATTACHMENT":1,"STENCIL_ATTACHMENT":1
			}
		},
		"2":{
			"type":"enum",
			values:{
				"RENDERBUFFER":1
			}
		}
	},
	"framebufferTexture2D":{
		"0":{
			"type":"enum",
			values:{
				"FRAMEBUFFER":1
			}
		},
		"1":{
			"type":"enum",
			values:{
				"COLOR_ATTACHMENT0":1,"DEPTH_ATTACHMENT":1,"STENCIL_ATTACHMENT":1
			}
		},
		"2":{
			"type":"enum",
			values:{
				"TEXTURE_2D":1,"TEXTURE_CUBE_MAP_POSITIVE_X":1,"TEXTURE_CUBE_MAP_NEGATIVE_X":1,"TEXTURE_CUBE_MAP_POSITIVE_Y":1,
				"TEXTURE_CUBE_MAP_NEGATIVE_Y":1,"TEXTURE_CUBE_MAP_POSITIVE_Z":1,"TEXTURE_CUBE_MAP_NEGATIVE_Z":1
			}
		}
	},
	"getProgramParameter":{
		"1":{
			"type":"enum",
			values:{
				"DELETE_STATUS":1,"LINK_STATUS":1,"VALIDATE_STATUS":1,"INFO_LOG_LENGTH":1,"ATTACHED_SHADERS":1,
				"ACTIVE_ATTRIBUTES":1,"ACTIVE_ATTRIBUTE_MAX_LENGTH":1,"ACTIVE_UNIFORMS":1,"ACTIVE_UNIFORM_MAX_LENGTH":1
			}
		}
	},
	"getShaderParameter":{
		"1":{
			"type":"enum",
			values:{
				"SHADER_TYPE":1,"DELETE_STATUS":1,"COMPILE_STATUS":1,"INFO_LOG_LENGTH":1,"SHADER_SOURCE_LENGTH":1
			}
		}
	},
	"renderbufferStorage":{
		"0":{
			"type":"enum",
			values:{
				"RENDERBUFFER":1
			}
		},
		"1":{
			"type":"enum",
			values:{
				"RGBA4":1,"RGB565":1,"RGB5_A1":1,"DEPTH_COMPONENT16":1,"STENCIL_INDEX8":1
			}
		}
	},
	"texImage2D":{
		"0":{
			"type":"enum",
			"values":{
				"TEXTURE_2D":1,
				"TEXTURE_CUBE_MAP_POSITIVE_X":1,"TEXTURE_CUBE_MAP_NEGATIVE_X":1,"TEXTURE_CUBE_MAP_POSITIVE_Y":1,
				"TEXTURE_CUBE_MAP_NEGATIVE_Y":1,"TEXTURE_CUBE_MAP_POSITIVE_Z":1,"TEXTURE_CUBE_MAP_NEGATIVE_Z":1
			}
		},
		"2":{
			"type":"enum",
			"values":{
				"ALPHA":1,"LUMINANCE":1,"LUMINANCE_ALPHA":1,"RGB":1,"RGBA":1
			}
		},
		"6":{
			"type":"enum",
			"values":{
				"ALPHA":1,"LUMINANCE":1,"LUMINANCE_ALPHA":1,"RGB":1,"RGBA":1
			}
		},
		"7":{
			"type":"enum",
			"values":{
				"UNSIGNED_BYTE":1,"UNSIGNED_SHORT_5_6_5":1,"UNSIGNED_SHORT_4_4_4_4":1,"UNSIGNED_SHORT_5_5_5_1":1
			}
		}
	},
	"texParameteri":{
		"0":{
			"type":"enum",
			"values":{
				"TEXTURE_2D":1,"TEXTURE_CUBE_MAP":1
			}
		},
		"1":{
			"type":"enum",
			"values":{
				"TEXTURE_MIN_FILTER":1,"TEXTURE_MAG_FILTER":1,"TEXTURE_WRAP_S":1,"TEXTURE_WRAP_T":1
			}
		},
	},
	"texSubImage2D":{
		"0":{
			"type":"enum",
			"values":{
				"TEXTURE_2D":1,
				"TEXTURE_CUBE_MAP_POSITIVE_X":1,"TEXTURE_CUBE_MAP_NEGATIVE_X":1,"TEXTURE_CUBE_MAP_POSITIVE_Y":1,
				"TEXTURE_CUBE_MAP_NEGATIVE_Y":1,"TEXTURE_CUBE_MAP_POSITIVE_Z":1,"TEXTURE_CUBE_MAP_NEGATIVE_Z":1
			}
		},
		"6":{
			"type":"enum",
			"values":{
				"ALPHA":1,"LUMINANCE":1,"LUMINANCE_ALPHA":1,"RGB":1,"RGBA":1
			}
		},
		"7":{
			"type":"enum",
			"values":{
				"UNSIGNED_BYTE":1,"UNSIGNED_SHORT_5_6_5":1,"UNSIGNED_SHORT_4_4_4_4":1,"UNSIGNED_SHORT_5_5_5_1":1
			}
		}
	},
	"vertexAttribPointer":{
		"2":{
			"type":"enum",
			"values":{
				"BYTE":1,"UNSIGNED_BYTE":1,"SHORT":1,"UNSIGNED_SHORT":1,"FIXED":1,"FLOAT":1
			}
		}
	}
};

profileWebGL.nativeMethods={};
profileWebGL.nativeMethods.getContext=HTMLCanvasElement.prototype.getContext;
profileWebGL.nativeMethods.setInterval=window.setInterval;
profileWebGL.nativeMethods.clearInterval=window.clearInterval;
profileWebGL.nativeMethods.setTimeout=window.setTimeout;
profileWebGL.nativeMethods.clearTimeout=window.clearTimeout;
profileWebGL.nativeMethodNames=[];
profileWebGL.webGLObjects={};
profileWebGL.webGLArrayIndices={};
profileWebGL.enumNameLookupTable={};
profileWebGL.enumValueLookupTable={};
profileWebGL.webGLArrayValues={};
profileWebGL.logAreaBase=null;
profileWebGL.logAreaBaseDoc=null;
profileWebGL.logAreaElement=null;
profileWebGL.logAreaImageLogElement=null;
profileWebGL.logAreaFinallyElement=null;
profileWebGL.logAreaExtroElement=null;
profileWebGL.setupDone=false;

window.setInterval=function(cd,tm){
	return profileWebGL.nativeMethods.setInterval.call(this,cd,10000);
};

window.clearInterval=function(tom){
	return profileWebGL.nativeMethods.clearInterval.call(this,tom);
};

window.setTimeout=function(cd,tm){
	return profileWebGL.nativeMethods.setTimeout.call(this,cd,10000);
};

window.clearTimeout=function(tom){
	return profileWebGL.nativeMethods.clearTimeout.call(this,tom);
};

HTMLCanvasElement.prototype.getContext=function(wh){
	var cx=profileWebGL.nativeMethods.getContext.call(this,wh);
	
	if(cx && wh.indexOf("webgl")>=0 && !profileWebGL.setupDone){
		profileWebGL.setupContext(cx);
		profileWebGL.setupDone=true;
	}
	
	if(!profileWebGL.logAreaElement){
		if(top && top.document && top.document.querySelector && top.document.querySelector("#profileWebGLBaseLogArea")){
			profileWebGL.logAreaBase=top.document.querySelector("#profileWebGLBaseLogArea");
			profileWebGL.logAreaBaseDoc=top.document;
		}else{
			profileWebGL.logAreaBase=document.body;
			profileWebGL.logAreaBaseDoc=document;
		}
		var intro=profileWebGL.logAreaBaseDoc.createElement("pre");
		intro.textContent='<!DOCTYPE html>\n<html>\n\t<head>\n\t\t<title>3D</title>\n\t\t<script type="text/javascript">\n\t\t\tvar getSurface=function(selector){\n\t\t\t\tvar canvas=document.querySelector(selector);\n\t\t\t\tif(!canvas)\n\t\t\t\t\treturn null;\n\t\t\t\t\n\t\t\t\tvar surface=canvas.getContext("webgl");\n\t\t\t\tif(!surface)\n\t\t\t\t\tvar surface=canvas.getContext("experimental-webgl");\n\t\t\t\t\n\t\t\t\treturn surface?surface:null;\n\t\t\t};\n\n\t\t\twindow.onload=function(){\n\t\t\t\tmain(getSurface("canvas"));\n\t\t\t};\n\n\t\t\tfunction main(gl){';
		profileWebGL.logAreaBase.appendChild(intro);
		profileWebGL.logAreaElement=profileWebGL.logAreaBaseDoc.createElement("pre");
		profileWebGL.logAreaBase.appendChild(profileWebGL.logAreaElement);
		profileWebGL.logAreaExtroElement=profileWebGL.logAreaBaseDoc.createElement("pre");
		profileWebGL.logAreaExtroElement.textContent='\t\t\t}\n\t\t</script>\n\t</head>\n\t<body>\n\t\t<canvas width="800" height="600"></canvas>';
		profileWebGL.logAreaBase.appendChild(profileWebGL.logAreaExtroElement);
		profileWebGL.logAreaImageLogElement=profileWebGL.logAreaBaseDoc.createElement("pre");
		profileWebGL.logAreaBase.appendChild(profileWebGL.logAreaImageLogElement);
		profileWebGL.logAreaFinallyElement=profileWebGL.logAreaBaseDoc.createElement("pre");
		profileWebGL.logAreaFinallyElement.textContent='\n\t</body>\n</html>';
		profileWebGL.logAreaBase.appendChild(profileWebGL.logAreaFinallyElement);

	}
		
	return cx;
};

profileWebGL.getArrayFromInternalList =function(type,arr){
	if(!profileWebGL.webGLArrayIndices[type])
		profileWebGL.webGLArrayIndices[type]=[];
	
	for(var i=0;i<profileWebGL.webGLArrayIndices[type].length;i++)
		if(profileWebGL.webGLArrayIndices[type][i].arr==arr)
			return profileWebGL.webGLArrayIndices[type][i];
			
	var e={
		arr:arr,
		desc:type+"_"+profileWebGL.webGLArrayIndices[type].length
	};
	
	profileWebGL.webGLArrayIndices[type].push(e);
	
	return e;
};


profileWebGL.processValue=function(obj,idx,name){
	var tp="";
	if(idx>=0 && profileWebGL.argumentEnums[name] && profileWebGL.argumentEnums[name][idx.toString()]){
		if(profileWebGL.argumentEnums[name][idx.toString()].type=="enum" && profileWebGL.enumValueLookupTable[obj]){
			for(var i=0;i<profileWebGL.enumValueLookupTable[obj].length;i++){
				if(profileWebGL.argumentEnums[name][idx.toString()].values[profileWebGL.enumValueLookupTable[obj][i]])
					return "gl."+profileWebGL.enumValueLookupTable[obj][i];
			}
		}else if(profileWebGL.argumentEnums[name][idx.toString()].type=="bitmask"){
			var out=[];
			for(var i in profileWebGL.argumentEnums[name][idx.toString()].values){
				if((obj & profileWebGL.enumNameLookupTable[i])==profileWebGL.enumNameLookupTable[i])
					out.push("gl."+i);
			}
			return out.join(" | ");
		}
	}
	if(typeof(obj)=="string")
		return JSON.stringify(obj).replace(/\\u000a/g,'\\n"+\n"');
		
	if(typeof(obj)=="object" && obj){
		var tp=(/^\[object (?:WebGL(.*?)|(.+?Array)|(HTMLImageElement|HTMLVideoElement|HTMLCanvasElement))\]$/).exec(obj.toString());

		if(tp && tp[2]){
			var desc=profileWebGL.getArrayFromInternalList(tp[2],obj).desc;
			if(profileWebGL.webGLArrayValues[desc]!=obj && idx>=0){
				var sum=0;
				for(var i=0;i<obj.length;i++)
					sum+=Math.abs(obj[i]);
				
				if(sum)
					profileWebGL.logAreaElement.appendChild(profileWebGL.logAreaBaseDoc.createTextNode("\t\t\t\t"+desc+" = new "+tp[2]+"("+JSON.stringify(Array.prototype.slice.call(obj))+");\n"));
				else
					profileWebGL.logAreaElement.appendChild(profileWebGL.logAreaBaseDoc.createTextNode("\t\t\t\t"+desc+" = new "+tp[2]+"("+obj.length+");\n"));
					
				profileWebGL.webGLArrayValues[desc]=Array.prototype.slice.call(obj);
			}else if(id>=0){
				var newData=Array.prototype.slice.call(obj);
				var out="";
				for(var i=0;i<profileWebGL.webGLArrayValues[desc].length;i++)
					if(profileWebGL.webGLArrayValues[desc][i]!=newData[i])
						out+=desc+"["+i+"] = "+newData[i]+";\n";
				
				profileWebGL.logAreaElement.appendChild(profileWebGL.logAreaBaseDoc.createTextNode(desc+out+"\n"));
				profileWebGL.webGLArrayValues[desc]=newData;
			}
			

			return desc;
		}else if( tp && (tp[1] ||tp[3]) && typeof(obj.___ID)=="undefined"){
			tp=tp[3] || tp[1];
			if(typeof(profileWebGL.webGLObjects[tp])=="undefined")
				profileWebGL.webGLObjects[tp]=0;
			obj.___ID=tp+(profileWebGL.webGLObjects[tp]++);
			if(obj instanceof HTMLImageElement){
				profileWebGL.logAreaElement.appendChild(profileWebGL.logAreaBaseDoc.createTextNode('\t\t\t\t'+obj.___ID+' = document.querySelector("#'+obj.___ID+'");\n'));
				profileWebGL.logAreaImageLogElement.appendChild(profileWebGL.logAreaBaseDoc.createTextNode('\t\t<img id="'+obj.___ID+'" src="'+window.encodeURI(obj.src)+'" />\n'));
			}else if(obj instanceof HTMLCanvasElement || obj instanceof HTMLVideoElement){
				profileWebGL.logAreaElement.appendChild(profileWebGL.logAreaBaseDoc.createTextNode('\t\t\t\t'+obj.___ID+' = document.querySelector("#'+obj.___ID+'");\n'));
				var content=document.createElement("canvas");
				content.width=obj.nativeWidth || obj.width;
				content.height=obj.nativeHeight || obj.height;
				content.getContext("2d").drawImage(obj,0,0);
				profileWebGL.logAreaImageLogElement.appendChild(profileWebGL.logAreaBaseDoc.createTextNode('\t\t<img id="'+obj.___ID+'" src="'+window.encodeURI(content.toDataURL())+'" />\n'));
			}
		}
	}
	
	if(obj && ( desc || obj.___ID))
		return desc || obj.___ID;
	else
		return JSON.stringify(obj);
};

profileWebGL.setupContext=function(obj){
	for(var i in obj){
		if(typeof(obj[i])=="function"){
			profileWebGL.nativeMethodNames.push(i);
		}else if(typeof(obj[i])=="number" && i==i.toUpperCase()){
			if(!profileWebGL.enumValueLookupTable[obj[i]])
				profileWebGL.enumValueLookupTable[obj[i]]=[];
			
			profileWebGL.enumValueLookupTable[obj[i]].push(i);
			profileWebGL.enumNameLookupTable[i]=obj[i];
		}
	}

	for(var j in profileWebGL.nativeMethodNames){
		var i=profileWebGL.nativeMethodNames[j];
		profileWebGL.nativeMethods[i]=CanvasRenderingContextWebGL.prototype[i];
		
		CanvasRenderingContextWebGL.prototype[i]=function(name){
			return function(){
				var arg="";
				var args=[];

				
				for(var k=0;k<arguments.length;k++){

					arg=" "+profileWebGL.processValue(arguments[k],k,name)+" ";
					if(typeof(arguments[k])=="object" && arguments[k]){
						for(var l in window){
							try{
								if(arguments[k]==window[l])
									arg+="/"+"*"+l+"*"+"/ ";
							}catch(e){}
						}
					}
					args.push(arg);
				}
				
				var r = profileWebGL.nativeMethods[name].apply(this,arguments);
				
				var ret="";
				if(typeof(r)=="object" && r){
					ret=profileWebGL.processValue(r,-1,name)||"";
					
					if(ret)
						ret+=" = ";
				}
				profileWebGL.logAreaElement.appendChild(profileWebGL.logAreaBaseDoc.createTextNode("\t\t\t\t"+ret+"gl."+name+" ("+args.join(" , ")+");\n"));
				profileWebGL.logAreaExtroElement.textContent='\t\t\t}\n\t\t</script>\n\t</head>\n\t<body>\n\t\t<canvas width="'+this.canvas.width+'" height="'+this.canvas.height+'"></canvas>';
				
				return r;
			};
		}(i);
		
	}
};
//*/
