package com.greensock.easing {
    public class Elastic {
        private static const _2PI:Number = Math.PI * 2;
        
        public static function easeIn (t:Number, b:Number, c:Number, d:Number, a:Number = 0, p:Number = 0):Number {
            var s:Number;
            if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;
            if (!a || (c > 0 && a < c) || (c < 0 && a < -c)) { a=c; s = p/4; }
            else s = p/_2PI * Math.asin (c/a);
            return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*_2PI/p )) + b;
        }
        public static function easeOut (t:Number, b:Number, c:Number, d:Number, a:Number = 0, p:Number = 0):Number {
            var s:Number;
            if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;
            if (!a || (c > 0 && a < c) || (c < 0 && a < -c)) { a=c; s = p/4; }
            else s = p/_2PI * Math.asin (c/a);
            return (a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*_2PI/p ) + c + b);
        }
        public static function easeInOut (t:Number, b:Number, c:Number, d:Number, a:Number = 0, p:Number = 0):Number {
            var s:Number;
            if (t==0) return b;  if ((t/=d*0.5)==2) return b+c;  if (!p) p=d*(.3*1.5);
            if (!a || (c > 0 && a < c) || (c < 0 && a < -c)) { a=c; s = p/4; }
            else s = p/_2PI * Math.asin (c/a);
            if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*_2PI/p )) + b;
            return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*_2PI/p )*.5 + c + b;
        }
    }
}