// Generated by CoffeeScript 1.7.1

/*
  TouchController (stick + buttons) for touch devices
  Based on the touch demo by <NAME> <http://seb.ly/>
  
  @class bkcore.controllers.TouchController
  @author Thibaut 'BKcore' Despoulain <http://bkcore.com>
 */

(function() {
  var TouchController, Vec2, exports, _base;

  TouchController = (function() {
    TouchController.isCompatible = function() {
      return 'ontouchstart' in document.documentElement;
    };


    /*
      Creates a new TouchController
    
      @param dom DOMElement The element that will listen to touch events
      @param stickMargin int The left margin in px for stick detection
      @param buttonCallback function Callback for non-stick touches
     */

    function TouchController(dom, stickMargin, buttonCallback) {
      this.dom = dom;
      this.stickMargin = stickMargin != null ? stickMargin : 200;
      this.buttonCallback = buttonCallback != null ? buttonCallback : null;
      this.active = true;
      this.touches = null;
      this.stickID = -1;
      this.stickPos = new Vec2(0, 0);
      this.stickStartPos = new Vec2(0, 0);
      this.stickVector = new Vec2(0, 0);
      this.dom.addEventListener('touchstart', ((function(_this) {
        return function(e) {
          return _this.touchStart(e);
        };
      })(this)), false);
      this.dom.addEventListener('touchmove', ((function(_this) {
        return function(e) {
          return _this.touchMove(e);
        };
      })(this)), false);
      this.dom.addEventListener('touchend', ((function(_this) {
        return function(e) {
          return _this.touchEnd(e);
        };
      })(this)), false);
    }


    /*
      @private
     */

    TouchController.prototype.touchStart = function(event) {
      var touch, _i, _len, _ref;
      if (!this.active) {
        return;
      }
      _ref = event.changedTouches;
      for (_i = 0, _len = _ref.length; _i < _len; _i++) {
        touch = _ref[_i];
        if (this.stickID < 0 && touch.clientX < this.stickMargin) {
          this.stickID = touch.identifier;
          this.stickStartPos.set(touch.clientX, touch.clientY);
          this.stickPos.copy(this.stickStartPos);
          this.stickVector.set(0, 0);
          continue;
        } else {
          if (typeof this.buttonCallback === "function") {
            this.buttonCallback(true, touch, event);
          }
        }
      }
      this.touches = event.touches;
      return false;
    };


    /*
      @private
     */

    TouchController.prototype.touchMove = function(event) {
      var touch, _i, _len, _ref;
      event.preventDefault();
      if (!this.active) {
        return;
      }
      _ref = event.changedTouches;
      for (_i = 0, _len = _ref.length; _i < _len; _i++) {
        touch = _ref[_i];
        if (this.stickID === touch.identifier && touch.clientX < this.stickMargin) {
          this.stickPos.set(touch.clientX, touch.clientY);
          this.stickVector.copy(this.stickPos).substract(this.stickStartPos);
          break;
        }
      }
      this.touches = event.touches;
      return false;
    };


    /*
      @private
     */

    TouchController.prototype.touchEnd = function(event) {
      var touch, _i, _len, _ref;
      if (!this.active) {
        return;
      }
      this.touches = event.touches;
      _ref = event.changedTouches;
      for (_i = 0, _len = _ref.length; _i < _len; _i++) {
        touch = _ref[_i];
        if (this.stickID === touch.identifier) {
          this.stickID = -1;
          this.stickVector.set(0, 0);
          break;
        } else {
          if (typeof this.buttonCallback === "function") {
            this.buttonCallback(false, touch, event);
          }
        }
      }
      return false;
    };

    return TouchController;

  })();


  /*
    Internal class used for vector2
    @class Vec2
    @private
   */

  Vec2 = (function() {
    function Vec2(x, y) {
      this.x = x != null ? x : 0;
      this.y = y != null ? y : 0;
    }

    Vec2.prototype.substract = function(vec) {
      this.x -= vec.x;
      this.y -= vec.y;
      return this;
    };

    Vec2.prototype.copy = function(vec) {
      this.x = vec.x;
      this.y = vec.y;
      return this;
    };

    Vec2.prototype.set = function(x, y) {
      this.x = x;
      this.y = y;
      return this;
    };

    return Vec2;

  })();


  /*
    Exports
    @package bkcore
   */

  exports = exports != null ? exports : this;

  exports.bkcore || (exports.bkcore = {});

  (_base = exports.bkcore).controllers || (_base.controllers = {});

  exports.bkcore.controllers.TouchController = TouchController;

}).call(this);
