﻿Tween = function(obj, prop, func, begin, finish, duration, suffixe)
{
    this.init(obj, prop, func, begin, finish, duration, suffixe)
}
var t = Tween.prototype;

t.obj = new Object();
t.prop = '';
t.func = function(t, b, c, d) { return c * t / d + b; };
t.begin = 0;
t.change = 0;
t.prevTime = 0;
t.prevPos = 0;
t.looping = false;
t._duration = 0;
t._time = 0;
t._pos = 0;
t._position = 0;
t._startTime = 0;
t._finish = 0;
t.name = '';
t.suffixe = '';
t._listeners = new Array();
t.setTime = function(t)
{
    this.prevTime = this._time;
    if (t > this.getDuration())
    {
        if (this.looping)
        {
            this.rewind(t - this._duration);
            this.update();
            this.broadcastMessage('onMotionLooped', { target: this, type: 'onMotionLooped' });
        } else
        {
            this._time = this._duration;
            this.update();
            this.stop();
            this.broadcastMessage('onMotionFinished', { target: this, type: 'onMotionFinished' });
        }
    } else if (t < 0)
    {
        this.rewind();
        this.update();
    } else
    {
        this._time = t;
        this.update();
    }
}
t.getTime = function()
{
    return this._time;
}
t.setDuration = function(d)
{
    this._duration = (d == null || d <= 0) ? 100000 : d;
}
t.getDuration = function()
{
    return this._duration;
}
t.setPosition = function(p)
{
    this.prevPos = this._pos;
    var a = this.suffixe != '' ? this.suffixe : '';
    this.obj[this.prop] = Math.round(p) + a;
    this._pos = p;
    this.broadcastMessage('onMotionChanged', { target: this, type: 'onMotionChanged' });
}
t.getPosition = function(t)
{
    if (t == undefined) t = this._time;
    return this.func(t, this.begin, this.change, this._duration);
};
t.setFinish = function(f)
{
    this.change = f - this.begin;
};
t.geFinish = function()
{
    return this.begin + this.change;
};
t.init = function(obj, prop, func, begin, finish, duration, suffixe)
{
    if (!arguments.length) return;
    this._listeners = new Array();
    this.addListener(this);
    if (suffixe) this.suffixe = suffixe;
    this.obj = obj;
    this.prop = prop;
    this.begin = begin;
    this._pos = begin;
    this.setDuration(duration);
    if (func != null && func != '')
    {
        this.func = func;
    }
    this.setFinish(finish);
}
t.start = function()
{
    this.rewind();
    this.startEnterFrame();
    this.broadcastMessage('onMotionStarted', { target: this, type: 'onMotionStarted' });
    //alert('in');
}
t.rewind = function(t)
{
    this.stop();
    this._time = (t == undefined) ? 0 : t;
    this.fixTime();
    this.update();
}
t.fforward = function()
{
    this._time = this._duration;
    this.fixTime();
    this.update();
}
t.update = function()
{
    this.setPosition(this.getPosition(this._time));
}
t.startEnterFrame = function()
{
    this.stopEnterFrame();
    this.isPlaying = true;
    this.onEnterFrame();
}
t.onEnterFrame = function()
{
    if (this.isPlaying)
    {
        this.nextFrame();
        setTimeout(Delegate.create(this, this.onEnterFrame), 0);
    }
}
t.nextFrame = function()
{
    this.setTime((this.getTimer() - this._startTime) / 1000);
}
t.stop = function()
{
    this.stopEnterFrame();
    this.broadcastMessage('onMotionStopped', { target: this, type: 'onMotionStopped' });
}
t.stopEnterFrame = function()
{
    this.isPlaying = false;
}

t.continueTo = function(finish, duration)
{
    this.begin = this._pos;
    this.setFinish(finish);
    if (this._duration != undefined)
        this.setDuration(duration);
    this.start();
}
t.resume = function()
{
    this.fixTime();
    this.startEnterFrame();
    this.broadcastMessage('onMotionResumed', { target: this, type: 'onMotionResumed' });
}
t.yoyo = function()
{
    this.continueTo(this.begin, this._time);
}

t.addListener = function(o)
{
    this.removeListener(o);
    return this._listeners.push(o);
}
t.removeListener = function(o)
{
    var a = this._listeners;
    var i = a.length;
    while (i--)
    {
        if (a[i] == o)
        {
            a.splice(i, 1);
            return true;
        }
    }
    return false;
}
t.broadcastMessage = function()
{
    var arr = new Array();
    for (var i = 0; i < arguments.length; i++)
    {
        arr.push(arguments[i])
    }
    var e = arr.shift();
    var a = this._listeners;
    var l = a.length;
    for (var i = 0; i < l; i++)
    {
        if (a[i][e])
            a[i][e].apply(a[i], arr);
    }
}
t.fixTime = function()
{
    this._startTime = this.getTimer() - this._time * 1000;
}
t.getTimer = function()
{
    return new Date().getTime() - this._time;
}
Tween.backEaseIn = function(t, b, c, d, a, p)
{
    if (s == undefined) var s = 1.70158;
    return c * (t /= d) * t * ((s + 1) * t - s) + b;
}
Tween.backEaseOut = function(t, b, c, d, a, p)
{
    if (s == undefined) var s = 1.70158;
    return c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b;
}
Tween.backEaseInOut = function(t, b, c, d, a, p)
{
    if (s == undefined) var s = 1.70158;
    if ((t /= d / 2) < 1) return c / 2 * (t * t * (((s *= (1.525)) + 1) * t - s)) + b;
    return c / 2 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2) + b;
}
Tween.elasticEaseIn = function(t, b, c, d, a, p)
{
    if (t == 0) return b;
    if ((t /= d) == 1) return b + c;
    if (!p) p = d * .3;
    if (!a || a < Math.abs(c))
    {
        a = c; var s = p / 4;
    }
    else
        var s = p / (2 * Math.PI) * Math.asin(c / a);

    return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b;

}
Tween.elasticEaseOut = function(t, b, c, d, a, p)
{
    if (t == 0) return b; if ((t /= d) == 1) return b + c; if (!p) p = d * .3;
    if (!a || a < Math.abs(c)) { a = c; var s = p / 4; }
    else var s = p / (2 * Math.PI) * Math.asin(c / a);
    return (a * Math.pow(2, -10 * t) * Math.sin((t * d - s) * (2 * Math.PI) / p) + c + b);
}
Tween.elasticEaseInOut = function(t, b, c, d, a, p)
{
    if (t == 0) return b; if ((t /= d / 2) == 2) return b + c; if (!p) var p = d * (.3 * 1.5);
    if (!a || a < Math.abs(c)) { var a = c; var s = p / 4; }
    else var s = p / (2 * Math.PI) * Math.asin(c / a);
    if (t < 1) return -.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b;
    return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p) * .5 + c + b;
}

Tween.bounceEaseOut = function(t, b, c, d)
{
    if ((t /= d) < (1 / 2.75))
    {
        return c * (7.5625 * t * t) + b;
    } else if (t < (2 / 2.75))
    {
        return c * (7.5625 * (t -= (1.5 / 2.75)) * t + .75) + b;
    } else if (t < (2.5 / 2.75))
    {
        return c * (7.5625 * (t -= (2.25 / 2.75)) * t + .9375) + b;
    } else
    {
        return c * (7.5625 * (t -= (2.625 / 2.75)) * t + .984375) + b;
    }
}
Tween.bounceEaseIn = function(t, b, c, d)
{
    return c - Tween.bounceEaseOut(d - t, 0, c, d) + b;
}
Tween.bounceEaseInOut = function(t, b, c, d)
{
    if (t < d / 2) return Tween.bounceEaseIn(t * 2, 0, c, d) * .5 + b;
    else return Tween.bounceEaseOut(t * 2 - d, 0, c, d) * .5 + c * .5 + b;
}

Tween.strongEaseInOut = function(t, b, c, d)
{
    return c * (t /= d) * t * t * t * t + b;
}

Tween.regularEaseIn = function(t, b, c, d)
{
    return c * (t /= d) * t + b;
}
Tween.regularEaseOut = function(t, b, c, d)
{
    return -c * (t /= d) * (t - 2) + b;
}

Tween.regularEaseInOut = function(t, b, c, d)
{
    if ((t /= d / 2) < 1) return c / 2 * t * t + b;
    return -c / 2 * ((--t) * (t - 2) - 1) + b;
}
Tween.strongEaseIn = function(t, b, c, d)
{
    return c * (t /= d) * t * t * t * t + b;
}
Tween.strongEaseOut = function(t, b, c, d)
{
    return c * ((t = t / d - 1) * t * t * t * t + 1) + b;
}

Tween.strongEaseInOut = function(t, b, c, d)
{
    if ((t /= d / 2) < 1) return c / 2 * t * t * t * t * t + b;
    return c / 2 * ((t -= 2) * t * t * t * t + 2) + b;
}

ColorTween.prototype = new Tween();
ColorTween.prototype.constructor = Tween;
ColorTween.superclass = Tween.prototype;

function ColorTween(obj, prop, func, fromColor, toColor, duration)
{
    toColor = toColor.replace("#", "");
    fromColor = fromColor.replace("#", "");

    this.targetObject = obj;
    this.targetProperty = prop;
    this.fromColor = fromColor;
    this.toColor = toColor;
    this.init(new Object(), 'x', func, 0, 100, duration);
    this.listenerObj = new Object();
    this.listenerObj.onMotionChanged = Delegate.create(this, this.onColorChanged);
    this.addListener(this.listenerObj);
}
var o = ColorTween.prototype;
o.targetObject = {};
o.targetProperty = {};
o.fromColor = '';
o.toColor = '';
o.currentColor = '';
o.listenerObj = {};
o.onColorChanged = function()
{
    this.currentColor = this.getColor(this.fromColor, this.toColor, this._pos);
    this.targetObject[this.targetProperty] = this.currentColor;
}


o.getColor = function(start, end, percent)
{
    var r1 = this.hex2dec(start.slice(0, 2));
    var g1 = this.hex2dec(start.slice(2, 4));
    var b1 = this.hex2dec(start.slice(4, 6));

    var r2 = this.hex2dec(end.slice(0, 2));
    var g2 = this.hex2dec(end.slice(2, 4));
    var b2 = this.hex2dec(end.slice(4, 6));

    var pc = percent / 100;

    r = Math.floor(r1 + (pc * (r2 - r1)) + .5);
    g = Math.floor(g1 + (pc * (g2 - g1)) + .5);
    b = Math.floor(b1 + (pc * (b2 - b1)) + .5);

    return ("#" + this.dec2hex(r) + this.dec2hex(g) + this.dec2hex(b));
}

o.dec2hex = function(dec) { return (this.hexDigit[dec >> 4] + this.hexDigit[dec & 15]); }
o.hexDigit = new Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F");
o.hex2dec = function(hex) { return (parseInt(hex, 16)) };

OpacityTween.prototype = new Tween();
OpacityTween.prototype.constructor = Tween;
OpacityTween.superclass = Tween.prototype;

function OpacityTween(obj, func, fromOpacity, toOpacity, duration)
{
    this.targetObject = obj;
    this.init(new Object(), 'x', func, fromOpacity, toOpacity, duration);
}
var o = OpacityTween.prototype;
o.targetObject = {};
o.onMotionChanged = function(evt)
{
    var v = evt.target._pos;
    var t = this.targetObject;
    t.style['opacity'] = v / 100;
    t.style['-moz-opacity'] = v / 100;

    try
    {
        t.style.filter = 'alpha(opacity=' + v + ')';
    }
    catch (e)
    {
    }

    try
    {
        if (t.filters) t.filters.alpha['opacity'] = v;
    }
    catch (e)
    {
    }
}

