function handleEffects(){
	var time=new Date().getTime();
	var i=effects.length; var j=i;
	if(i>0)do{effects[j-i] && effects[j-i].loop(time);}while(--i);
}
effects=[];
setInterval(handleEffects,15);

function Effect(handler,settings){
	this.handler=handler;
	this.duration=(settings.duration||1)*1000;
	this.ease=settings.ease||false;
	this.pos=0;
	this.last=new Date().getTime();;
	this.effectID=effects.length;
	effects[this.effectID]=this;
}

Effect.prototype.loop=function(time){
	this.pos+=(time-this.last)/this.duration;
	this.last=time;
	var pos=Math.min(1,this.pos);
	if(this.ease==1) pos=Math.sin(Math.sin(pos*Math.PI/2)*Math.PI/2);
	if(pos<1){
		this.handler(pos);
	}else{
		this.handler(1);
		delete effects[this.effectID];
		this.handler=null; this.duration=null; this.ease=null; this.totalFrames=null; this.currentFrame=null; this.start=null; this.effectID=null;
	}
}

function stopEvent(e){
	if(e.preventDefault) e.preventDefault();
	if(e.stopPropagation) e.stopPropagation();
	if(e.stop) e.stop();
	if(document.all&&e.keyCode) try{e.keyCode=0;}catch(e){}
	e.cancelBubble=true;
	e.returnValue=false;
}
