function getContext(canvas) {
    var gl = null;
    try {
        if (!gl) {
            gl = canvas.getContext("moz-webgl");
        };
    } catch (e) {
    };
    try {
        if (!gl) {
            gl = canvas.getContext("webkit-3d");
        };
    } catch (e) {
    };
    if (!gl) {
        alert("can\'t get webGL context!");
        return false;
    };
    return gl;
};
function createShaderFromElement(gl, elementId, type, logger) {
    var element = document.getElementById(elementId);
    var shader = gl.createShader(type);
    if (shader) {
        gl.shaderSource(shader, element.text);
        gl.compileShader(shader);
        if (logger) {
            logger("loaded shader " + elementId + " <br>" + gl.getShaderInfoLog(shader));
        };
        return shader;
    };
};
function createProgramFromElements(gl, vert, frag, bindings, logger) {
    var program = gl.createProgram();
    for (var v = null, _js_arrvar38 = typeof(vert) == Array ? vert : [vert], _js_idx37 = 0; _js_idx37 < _js_arrvar38.length; _js_idx37 += 1) {
        v = _js_arrvar38[_js_idx37];
        gl.attachShader(program, createShaderFromElement(gl, v, gl.VERTEX_SHADER, logger));
    };
    for (var f = null, _js_arrvar40 = typeof(frag) == Array ? frag : [frag], _js_idx39 = 0; _js_idx39 < _js_arrvar40.length; _js_idx39 += 1) {
        f = _js_arrvar40[_js_idx39];
        gl.attachShader(program, createShaderFromElement(gl, f, gl.FRAGMENT_SHADER, logger));
    };
    for (var index = 0; index < bindings.length; index += 1) {
        if (bindings[index]) {
            gl.bindAttribLocation(program, index, bindings[index]);
        };
    };
    gl.linkProgram(program);
    if (logger) {
        logger("linked program " + program + " <br>" + gl.getProgramInfoLog(program));
    };
    return program;
};
function matFromArray(a) {
    return mat4(a);
};
function simpleVbo(gl, indexArray, vertexArrays) {
    var indices = gl.createBuffer();
    var vertices = new Array();
    gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indices);
    gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indexArray, gl.STATIC_DRAW);
    for (var i = 0; i < vertexArrays.length; i += 1) {
        if (vertexArrays[i]) {
            var v = vertexArrays[i];
            vertices[i] = { "buffer" : gl.createBuffer(), "size" : v.size, "type" : v.type ? v.type : gl["FLOAT"], "normalize" : v.normalize ? v.normalize : false, "stride" : v.stride ? v.stride : 0, "offset" : v.offset ? v.offset : 0 };
            gl.bindBuffer(gl.ARRAY_BUFFER, vertices[i].buffer);
            gl.bufferData(gl.ARRAY_BUFFER, v.data, gl.STATIC_DRAW);
        };
    };
    return function (gl) {
        gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indices);
        for (var i = 0; i < vertices.length; i += 1) {
            var v = vertices[i];
            if (v) {
                gl.bindBuffer(gl.ARRAY_BUFFER, v.buffer);
                gl.vertexAttribPointer(i, v.size, v.type, v.normalize, v.stride, v.offset);
                gl.enableVertexAttribArray(i);
            };
        };
    };
};
