function s(a, b, max){
    this.a = a;
    this.b = b;
    this.max = max;
    this.c = 0;
    this.l = 0;
};

s.prototype.calcC = function(M, z){
    a = this.a;
    b = this.b;
    
    return (Math.pow((M*a-b),2) + ( ((z == true)?1:(-1)) * Math.pow(b,2) )) / (-4 * a);
};

s.prototype.calcD = function(){
    a = this.a;
    b = this.b;
    c = this.c;
    
    return ( Math.pow(b,2) - (4*a*c) );
}

s.prototype.calcX = function(z){
    a = this.a;
    b = this.b;
    c = this.c;
    
    d = this.calcD();
    
    if(d == 0){
        d = 1;
    }
    
    return ( b*-1 + ( ((z == true)?1:(-1)) * Math.sqrt( d ) ) )/(2*a);
};

s.prototype.calcY = function(x){
    a = this.a;
    b = this.b;
    c = this.c;

    return a*Math.pow(x,2) + (b * x) + c;
};

s.prototype.getModul = function(v){
    return (v < 0)? -1 * v : v;
}

s.prototype.process = function(length, steps){
    this.c = this.calcC(length, false);
    
    var start = this.calcX(false);
    var end = this.calcX(true);
    
    var step = (this.getModul(start) + this.getModul(end)) / steps;
    
    if(start > end){
        var tmp = start;
        start = end;
        end = tmp;
    }

    var result = [];
    
    for(var i = 0; i <= steps; i ++)
    {
        result[result.length] = this.calcY(i * step + start);
    }
    
    return result;
}

/**
 * @param {int} length - общее расстояние
 * @param {double} a - параметр a
 * @param {double} b - параметр a
 * @param {int} steps - необязательный параметр, шагов
 */
function p(length, a, b, steps){
    if(steps == undefined){
        steps = length / 3;
    }
    
    var f = new s(a, b);
    
    this.length = length;
    this.steps = f.process(length, steps);
    
    var summ = 0;
    for(var i = 0; i < this.steps.length; i++)
    {
        summ += this.steps[i];
    }
    
    this.pe = summ / length;
}

/**
 * 
 * @param {int} interval
 * @param {function} callback - callback(w, i) w - на сколько переместить, i - текущий шаг
 */
p.prototype.go = function(interval, callback){
    this.callback = callback;
    
    var o = this;
    var i = 0;
    
    var timer = setInterval(function(){
        if(i >= o.steps.length){
            clearTimeout(timer);
            return ;
        }
        
        o.callback(o.steps[i] / o.pe, i++);
    }, interval);
}

