text: // Generated by CoffeeScript 1.7.1
  
  /*
    Various useful methods
    
    @class bkcore.Utils
    @author Thibaut 'BKcore' Despoulain <http://bkcore.com>
   */
  
  (function() {
    var Utils, exports;
  
    Utils = (function() {
  
      /*
        Creates a bkcore.threejs.Shaders["normalV"|"normal"] material
        with given parameters
       */
      function Utils() {}
  
      Utils.createNormalMaterial = function(opts) {
        var material, parameters, shader, shadername, uniforms;
        if (opts == null) {
          opts = {};
        }
        if (opts.ambient == null) {
          opts.ambient = 0x444444;
        }
        if (opts.normalScale == null) {
          opts.normalScale = 1.0;
        }
        if (opts.reflectivity == null) {
          opts.reflectivity = 0.9;
        }
        if (opts.shininess == null) {
          opts.shininess = 42;
        }
        if (opts.metal == null) {
          opts.metal = false;
        }
        shadername = opts.perPixel ? "normalV" : "normal";
        shader = bkcore.threejs.Shaders[shadername];
        uniforms = THREE.UniformsUtils.clone(shader.uniforms);
        uniforms["enableDiffuse"].value = true;
        uniforms["enableSpecular"].value = true;
        uniforms["enableReflection"].value = !!opts.cube;
        uniforms["tNormal"].texture = opts.normal;
        uniforms["tDiffuse"].texture = opts.diffuse;
        uniforms["tSpecular"].texture = opts.specular;
        uniforms["uAmbientColor"].value.setHex(opts.ambient);
        uniforms["uAmbientColor"].value.convertGammaToLinear();
        uniforms["uNormalScale"].value = opts.normalScale;
        if (opts.cube != null) {
          uniforms["tCube"].texture = opts.cube;
          uniforms["uReflectivity"].value = opts.reflectivity;
        }
        parameters = {
          fragmentShader: shader.fragmentShader,
          vertexShader: shader.vertexShader,
          uniforms: uniforms,
          lights: true,
          fog: false
        };
        material = new THREE.ShaderMaterial(parameters);
        material.perPixel = true;
        material.metal = opts.metal;
        return material;
      };
  
  
      /*
        Projects an object origin vector to screen using given camera
        @param  THREE.Object3D object The object which origin you want to project
        @param  THREE.Camera camera The camera of the projection
        @return THEE.Vector3 Projected verctor
       */
  
      Utils.projectOnScreen = function(object, camera) {
        var c, lPos, mat;
        mat = new THREE.Matrix4();
        mat.multiply(camera.matrixWorldInverse, object.matrixWorld);
        mat.multiply(camera.projectionMatrix, mat);
        c = mat.n44;
        lPos = new THREE.Vector3(mat.n14 / c, mat.n24 / c, mat.n34 / c);
        return lPos.multiplyScalar(0.5).addScalar(0.5);
      };
  
  
      /*
        Get an url parameter
        @param  String name Parameter slug
        @return Mixed
       */
  
      Utils.URLParameters = null;
  
      Utils.getURLParameter = function(name) {
        if (this.URLParameters == null) {
          this.URLParameters = {};
          window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi, (function(_this) {
            return function(m, key, val) {
              return _this.URLParameters[key] = val;
            };
          })(this));
        }
        return this.URLParameters[name];
      };
  
  
      /*
        Get top offset of an element
        @param obj HTMLElement
       */
  
      Utils.getOffsetTop = function(obj) {
        var curtop;
        curtop = obj.offsetTop;
        if (obj.offsetParent) {
          while (obj = obj.offsetParent) {
            curtop += obj.offsetTop;
          }
        }
        return curtop;
      };
  
  
      /*
        Scrolls page to given element id
        @param  string id The ID of the element
       */
  
      Utils.scrollTo = function(id) {
        return window.scroll(0, this.getOffsetTop(document.getElementById(id)));
      };
  
  
      /*
        Add or remove a class from an element
        @param  string id       [description]
        @param  string cssclass [description]
        @param  bool active   [description]
       */
  
      Utils.updateClass = function(id, cssclass, active) {
        var e;
        e = document.getElementById(id);
        if (e == null) {
          return;
        }
        if (active) {
          return e.classList.add(cssclass);
        } else {
          return e.classList.remove(cssclass);
        }
      };
  
  
      /*
        Performs an XMLHttpRequest
        @param  string   url      [description]
        @param  bool   postData true = POST, false = GET
        @param  {Function} callback [description]
        @param  {Object}   data     [description]
       */
  
      Utils.request = function(url, postData, callback, data) {
        var XMLHttpFactories, createXMLHTTPObject, i, method, qdata, req, val;
        XMLHttpFactories = [
          function() {
            return new XMLHttpRequest();
          }, function() {
            return new ActiveXObject("Msxml2.XMLHTTP");
          }, function() {
            return new ActiveXObject("Msxml3.XMLHTTP");
          }, function() {
            return new ActiveXObject("Microsoft.XMLHTTP");
          }
        ];
        createXMLHTTPObject = function() {
          var e, i, xmlhttp, _i, _ref;
          xmlhttp = false;
          for (i = _i = 0, _ref = XMLHttpFactories.length; 0 <= _ref ? _i <= _ref : _i >= _ref; i = 0 <= _ref ? ++_i : --_i) {
            try {
              xmlhttp = XMLHttpFactories[i]();
            } catch (_error) {
              e = _error;
              continue;
            }
            break;
          }
          return xmlhttp;
        };
        req = createXMLHTTPObject();
        if (req == null) {
          return;
        }
        method = postData != null ? "POST" : "GET";
        qdata = "o=bk";
        if (data != null) {
          for (i in data) {
            val = data[i];
            qdata += "&" + i + "=" + val;
            if (postData != null) {
              url += "?" + qdata;
            }
          }
        }
        req.open(method, url, true);
        if (postData != null) {
          req.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
        }
        req.onreadystatechange = function() {
          if (req.readyState !== 4) {
            return;
          }
          if (!(req.status === 200 || req.status === 304)) {
            return;
          }
          return typeof callback === "function" ? callback(req) : void 0;
        };
        req.send(qdata);
        return req;
      };
  
  
      /*
        Checks whether the device supports Touch input
       */
  
      Utils.isTouchDevice = function() {
        return ('ontouchstart' in window) || (navigator.MaxTouchPoints > 0) || (navigator.msMaxTouchPoints > 0);
      };
  
      return Utils;
  
    })();
  
  
    /*
      Exports
      @package bkcore
     */
  
    exports = exports != null ? exports : this;
  
    exports.bkcore || (exports.bkcore = {});
  
    exports.bkcore.Utils = Utils;
  
  }).call(this);
  