<!--


/*////////////

File: Tween.js

Creation Date: January 20 2006

Author: Philippe Maegerman

Email: mx2004-at-pandora.be

Website: http://jsTween.blogspot.com

Download: http://cfpim.coffeeflower.com/jsTween/Tween.js

*/////////////



function Delegate() {}

Delegate.create = function (o, f) {

	var a = new Array() ;

	var l = arguments.length ;

	for(var i = 2 ; i < l ; i++) a[i - 2] = arguments[i] ;

	return function() {

		var aP = [].concat(arguments, a) ;

		f.apply(o, aP);

	}

}



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;

	}


//-->
