

tween = function(object,prop,from,to,duration,ease) {	this.fps=100;

	this.from=from;
	this.to=to;

	this.debug=false;

	this.factor=this.to-this.from;


	this.object=object;
	this.prop=prop;
	this.duration=duration;
	this.ease=ease;

    this.transition=(ease==0 ? this.sinusoidal_up : (ease==1 ? this.sinusoidal_down : this.sinusoidal)).bind(this);

    //this.transition=this.linear.bind(this);

	this.start();
}

tween.prototype = {	out : function (mes) {		 if(this.debug) alert(mes);
	},	start : function() {
		this.totalTime=this.duration*1000;
		this.startTime=new Date().getTime();
		this.endTime=this.startTime+this.totalTime;
		this.interval=setInterval(this.loop.bind(this),15);
	},
	loop : function() {		var time=new Date().getTime();
		if(time>=this.startTime) {			if(time<=this.endTime) {				var pos=(time-this.startTime)/this.totalTime;
				this.render(pos);
			}
			else this.finish();
		}
	},
	render : function(pos) {		var pos=this.transition(pos)*this.factor+this.from;
		this.update(pos);
		if(this.onEnterFrame) this.onEnterFrame();
	},
	update : function(pos) {		this.setStyle(this.object,this.prop,pos);
	},
	setStyle : function(object,prop,value) {
		if(prop=='width' || prop=='height') {
 			object.style[prop]=value+"px";
		} else if(prop=='opacity') {	        setOpacity(object,value*100);
		}
	},
	finish : function() {
		 this.render(1.0);		 if(this.onComplete) this.onComplete();
		 clearInterval(this.interval);
	},
	sinusoidal_up : function (pos) {		return 1-Math.cos(pos*Math.PI/2);
	},
	sinusoidal_down : function(pos) {		return -Math.cos(Math.PI/2+pos*Math.PI/2);
	},
	sinusoidal : function(pos) {		return (-Math.cos(pos*Math.PI)/2)+0.5;
	},
	linear : function(pos) {		return pos;
	},
	addEventListener : function(event,func) {		this['on'+event]=func;
	}
}

