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;
  	},
  