makeEaseIn = function(a)        { return function(state) { return Math.pow(state, a*2); }}
makeEaseOut = function(a)       { return function(state) { return 1 - Math.pow(1 - state, a*2); }}
makeElastic = function(bounces) { return function(state) { state = remmah.EffectTransitions.easeInOut(state); return ((1-Math.cos(state * Math.PI * bounces)) * (1 - state)) + state; }}
makeBounce = function(bounces)  { var fn = makeElastic(bounces); return function(state) { state = fn(state); return state <= 1 ? state : 2-state; }}

remmah.EffectTransitions = {
	easeInOut: function(pos){ return ((-Math.cos(pos*Math.PI)/2) + 0.5);},
	linear: function(x) {return x;},

	easeIn: makeEaseIn(1.5),
	easeOut: makeEaseOut(1.5),
	strongEaseIn: makeEaseIn(2.5),
	strongEaseOut: makeEaseOut(2.5),

	elastic: makeElastic(1),
	veryElastic: makeElastic(3),
	bouncy: makeBounce(1),
	veryBouncy: makeBounce(3),


	sinoidal:	function(pos){ return ((-Math.cos(pos*Math.PI)/2) + 0.5); },
	linear:		function(pos){ return pos; },
	cubic:		function(pos){ return Math.pow(pos, 3); },
	
	sin:		function(pos,velocity,amplitude,frequency,decay){ return Sine(pos,velocity,amplitude,frequency,decay); },	
	sinOut:		function(pos,velocity,amplitude,frequency,decay){ return SineOut(pos,velocity,amplitude,frequency,decay); },
	circ:		function(pos,radius,degree){ return Circle(pos,radius,degree); }
};
