﻿var fuseTweenArr = new Array();
var fuseTweenIntId = -1;
var fuseTweenIntMs = 50;

function fuseTween(divId, time, props)
{
	//First check if that div is already being tweened and if so then remove it
	for(var i = 0; i < fuseTweenArr.length; i++) {
		if(fuseTweenArr[i].divId == divId) {
			fuseTweenArr.splice(i, 1);
			i--;
		}
	}	
	
	//Now add the tween to the array
	var propsArr = new Array();
	for(var prop in props) {
		var endValue = props[prop].toString();
		var startValue = $(divId).css(prop);
		var hasPx = endValue.indexOf("px") > -1;
		if(hasPx) {
			endValue = endValue.substr(0, endValue.indexOf("px"));
			startValue = startValue.substr(0, startValue.indexOf("px"));
		}
		propsArr.push({prop:prop, start:startValue, end:endValue, hasPx:hasPx})
	}
	var totalFrames = time/fuseTweenIntMs;
	fuseTweenArr.push({divId:divId, propsArr:propsArr, totalFrames:totalFrames, currentFrame:0});
	
	//If the interval is not running then create a new one
	if(fuseTweenIntId < 0) fuseTweenIntId = setInterval(processTweens, fuseTweenIntMs);
}

function processTweens()
{
	for(var i = 0; i < fuseTweenArr.length; i++)
	{
		var divId = fuseTweenArr[i].divId;
		var totalFrames = fuseTweenArr[i].totalFrames;
		var currentFrame = fuseTweenArr[i].currentFrame;
		for(var i2 = 0; i2 < fuseTweenArr[i].propsArr.length; i2++)
		{
			var prop = fuseTweenArr[i].propsArr[i2].prop;
			var start = Number(fuseTweenArr[i].propsArr[i2].start);
			var end = Number(fuseTweenArr[i].propsArr[i2].end);
			var hasPx = fuseTweenArr[i].propsArr[i2].hasPx;
			var tweenValue = easeOut(currentFrame, start, end - start, totalFrames);
			if(hasPx) {
				$(divId).css(prop, tweenValue + "px");
			} else {
				$(divId).css(prop, tweenValue);
			}
		}
		
		if(currentFrame == totalFrames)
		{
			//Tween has finished so remove it from the array
			fuseTweenArr.splice(i, 1);
			i--;
		} else {
			fuseTweenArr[i].currentFrame++;
		}
	}
	if(fuseTweenArr.length < 1) {
		clearInterval(fuseTweenIntId);
		fuseTweenIntId = -1;
	}
}

function easeOut (t, b, c, d) {
	return c * Math.sin(t/d * (Math.PI/2)) + b;
}
