var Tween = (function(){
	function constructor(obj,property,originalValue,finalValue,time,prefix,units,ease,css){
		this.obj = obj;
		this.property = property;
		this.ov = originalValue;
		this.fv = finalValue;
		this.intervalRate = 10;
		this.position = 0;
		this.steps = Math.round(time/this.intervalRate);
		this.units = units;
		this.prefix = prefix;
		this.css = css;
		this.d;
		this.playing;
		this.ease = ease;
	}
	function easeSinColor(instance){//returns a number between instance.ov and instance.fv
		var f = instance.fv;
		var o = instance.ov;
		var t = Math.sin((instance.position/instance.steps)*Math.PI/2);
		var r =(((f&0xff0000)>>16)*t+(1-t)*((o&0xff0000)>>16));
		var g =(((f&0x00ff00)>>>8)*t+(1-t)*((o&0x00ff00)>>>8));
		var b = ((f&0x0000ff)*t+(1-t)*(o&0x0000ff));
		return (r<<16|g<<8|b).toString(16);
	}
	function easeCos(instance){//returns a number between instance.ov and instance.fv
		return (Math.cos((instance.position/instance.steps)*Math.PI/2-Math.PI/2)*(instance.fv-instance.ov)+instance.ov);
	}
	function easeSin(instance){//returns a number between instance.ov and instance.fv
		return (Math.sin((instance.position/instance.steps)*Math.PI/2)*(instance.fv-instance.ov)+instance.ov);
	}
	function startInterval(instance){
		instance.playing = setInterval(function(){instance.animate()}, instance.intervalRate);
	}
	constructor.prototype.play = function(){
		if(this.position == 0){
			 this.stop();
			 this.d = 1;
			 startInterval(this);
		} else if(this.position == this.steps){
			 this.stop();
			 this.d = -1;
			 startInterval(this);
		}
	};
	constructor.prototype.stop = function(){
		clearInterval(this.playing);
		this.playing = false;
	};
	constructor.prototype.animate = function(d){
		this.position += this.d;
		if(this.css){
			this.obj.style[this.property] = this.prefix+(eval(this.ease))(this)+this.units;
		} else {
			this.obj[this.property] = this.prefix+(eval(this.ease))(this)+this.units;
		}
		if(this.position == this.steps || this.position == 0){
			if(this.onTweenFinished){
				this.onTweenFinished();
			} else {
				this.stop();
			}
		}
	};

	return constructor;
})();