/**
 * @private
 */
Ext.define('Ext.fx.easing.Momentum', {
 
    extend: 'Ext.fx.easing.Abstract',
 
    config: {
        acceleration: 30,
        friction: 0,
        startVelocity: 0
    },
 
    alpha: 0,
 
    updateFriction: function(friction) {
        var theta = Math.log(1 - (friction / 10));
 
        this.theta = theta;
 
        this.alpha = theta / this.getAcceleration();
    },
 
    updateStartVelocity: function(velocity) {
        this.velocity = velocity * this.getAcceleration();
    },
 
    updateAcceleration: function(acceleration) {
        this.velocity = this.getStartVelocity() * acceleration;
 
        this.alpha = this.theta / acceleration;
    },
 
    getValue: function() {
        return this.getStartValue() - this.velocity * (1 - this.getFrictionFactor()) / this.theta;
    },
 
    getFrictionFactor: function() {
        var deltaTime = Ext.Date.now() - this.getStartTime();
 
        return Math.exp(deltaTime * this.alpha);
    },
 
    getVelocity: function() {
        return this.getFrictionFactor() * this.velocity;
    }
});