text: 
    _initKeys: function (e) {
      // default key bindings
      var keys = {
        pageUp: 33,
        pageDown: 34,
        end: 35,
        home: 36,
        left: 37,
        up: 38,
        right: 39,
        down: 40
      };
      var i;
  
      // if you give me characters I give you keycode
      if ( typeof this.options.keyBindings == 'object' ) {
        for ( i in this.options.keyBindings ) {
          if ( typeof this.options.keyBindings[i] == 'string' ) {
            this.options.keyBindings[i] = this.options.keyBindings[i].toUpperCase().charCodeAt(0);
          }
        }
      } else {
        this.options.keyBindings = {};
      }
  
      for ( i in keys ) {
        this.options.keyBindings[i] = this.options.keyBindings[i] || keys[i];
      }
  
      utils.addEvent(window, 'keydown', this);
  
      this.on('destroy', function () {
        utils.removeEvent(window, 'keydown', this);
      });
    },
  
    _key: function (e) {
      if ( !this.enabled ) {
        return;
      }
  
      var snap = this.options.snap,  // we are using this alot, better to cache it
        newX = snap ? this.currentPage.pageX : this.x,
        newY = snap ? this.currentPage.pageY : this.y,
        now = utils.getTime(),
        prevTime = this.keyTime || 0,
        acceleration = 0.250,
        pos;
  
      if ( this.options.useTransition && this.isInTransition ) {
        pos = this.getComputedPosition();
  
        this._translate(Math.round(pos.x), Math.round(pos.y));
        this.isInTransition = false;
      }
  
      this.keyAcceleration = now - prevTime < 200 ? Math.min(this.keyAcceleration + acceleration, 50) : 0;
  
      switch ( e.keyCode ) {
        case this.options.keyBindings.pageUp:
          if ( this.hasHorizontalScroll && !this.hasVerticalScroll ) {
            newX += snap ? 1 : this.wrapperWidth;
          } else {
            newY += snap ? 1 : this.wrapperHeight;
          }
          break;
        case this.options.keyBindings.pageDown:
          if ( this.hasHorizontalScroll && !this.hasVerticalScroll ) {
            newX -= snap ? 1 : this.wrapperWidth;
          } else {
            newY -= snap ? 1 : this.wrapperHeight;
          }
          break;
        case this.options.keyBindings.end:
          newX = snap ? this.pages.length-1 : this.maxScrollX;
          newY = snap ? this.pages[0].length-1 : this.maxScrollY;
          break;
        case this.options.keyBindings.home:
          newX = 0;
          newY = 0;
          break;
        case this.options.keyBindings.left:
          newX += snap ? -1 : 5 + this.keyAcceleration>>0;
          break;
        case this.options.keyBindings.up:
          newY += snap ? 1 : 5 + this.keyAcceleration>>0;
          break;
        case this.options.keyBindings.right:
          newX -= snap ? -1 : 5 + this.keyAcceleration>>0;
          break;
        case this.options.keyBindings.down:
          newY -= snap ? 1 : 5 + this.keyAcceleration>>0;
          break;
        default:
          return;
      }
  
      if ( snap ) {
        this.goToPage(newX, newY);
        return;
      }
  
      if ( newX > 0 ) {
        newX = 0;
        this.keyAcceleration = 0;
      } else if ( newX < this.maxScrollX ) {
        newX = this.maxScrollX;
        this.keyAcceleration = 0;
      }
  
      if ( newY > 0 ) {
        newY = 0;
        this.keyAcceleration = 0;
      } else if ( newY < this.maxScrollY ) {
        newY = this.maxScrollY;
        this.keyAcceleration = 0;
      }
  
      this.scrollTo(newX, newY, 0);
  
      this.keyTime = now;
    },
  