# ported from http://www.gizma.com/easing/ to https://gist.github.com/th0ma5w/9883420
# added some from https://gist.github.com/cleure/e5ba94f94e828a3f5466
# added some from http://gsgd.co.uk/sandbox/jquery/easing/jquery.easing.1.3.js

import math

def easeLinear(t, b, c, d):
	return c*t/d + b


def easeOutCubic(t, b, c, d):
	t=float(t)/d-1
	return c*((t)*t*t + 1) + b

def easeInCubic(t, b, c, d):
	t=float(t)/d
	return c*(t)*t*t + b;


def easeInQuad(t, b, c, d):
	t /= d
	return c*t*t + b

def easeOutQuad(t, b, c, d):
	t /= d
	return -c * t*(t-2) + b

def easeInOutQuad(t, b, c, d):
	t /= d/2
	if t < 1:
		return c/2*t*t + b
	t-=1
	return -c/2 * (t*(t-2) - 1) + b


def easeInOutCubic(t, b, c, d):
	t /= d/2
	if t < 1:
		return c/2*t*t*t + b
	t -= 2
	return c/2*(t*t*t + 2) + b

def easeInQuart(t, b, c, d):
	t /= d
	return c*t*t*t*t + b

def easeOutQuart(t, b, c, d):
	t /= d
	t -= 1
	return -c * (t*t*t*t - 1) + b

def easeInOutQuart(t, b, c, d):
	t /= d/2
	if t < 1:
		return c/2*t*t*t*t + b
	t -= 2
	return -c/2 * (t*t*t*t - 2) + b

def easeInQuint(t, b, c, d):
	t /= d
	return c*t*t*t*t*t + b

def easeOutQuint(t, b, c, d):
	t /= d
	t -= 1
	return c*(t*t*t*t*t + 1) + b

def easeInOutQuint(t, b, c, d):
	t /= d/2
	if t < 1:
		return c/2*t*t*t*t*t + b
	t -= 2
	return c/2*(t*t*t*t*t + 2) + b

def easeInSine(t, b, c, d):
	return -c * math.cos(t/d * (math.pi/2)) + c + b

def easeOutSine(t, b, c, d):
	return c * math.sin(t/d * (math.pi/2)) + b


def easeInOutSine(t, b, c, d):
	return -c/2 * (math.cos(math.pi*t/d) - 1) + b

def easeInExpo(t, b, c, d):
	return c * math.pow( 2, 10 * (t/d - 1) ) + b

def easeOutExpo(t, b, c, d):
	return c * ( -math.pow( 2, -10 * t/d ) + 1 ) + b


def easeInOutExpo(t, b, c, d):
	t /= d/2
	if t < 1: 
		return c/2 * math.pow( 2, 10 * (t - 1) ) + b
	t -= 1
	return c/2 * ( -math.pow( 2, -10 * t) + 2 ) + b

def easeInCirc(t, b, c, d):
	t /= d
	return -c * (math.sqrt(1 - t*t) - 1) + b

def easeOutCirc(t, b, c, d):
	t /= d;
	t -= 1
	return c * math.sqrt(1 - t*t) + b

def easeInOutCirc(t, b, c, d):
	t /= d/2
	if t < 1:
		return -c/2 * (math.sqrt(1 - t*t) - 1) + b
	t -= 2
	return c/2 * (math.sqrt(1 - t*t) + 1) + b


def easeInElastic(t, b, c, d, s = 1.70158):
	a = c

	if t == 0:
		return b
	t /= d
	if t == 1:
		return b + c

	p = d * 0.3
	if a < abs(c):
		a = c
		s = p / 4
	else:
		s = p / (2 * math.pi) * math.asin(c / a)

	t -= 1
	return -(a * pow(2, 10 * t) * math.sin((t * d - s) * (2 * math.pi) / p)) + b

def easeOutElastic(t, b, c, d, a = 1.70158):
	if t == 0:
		return b
	t /= d
	if t == 1:
		return b + c

	p = d * 0.3
	if a < abs(c):
		a, s = c, p / 4
	else:
		s = p / (2 * math.pi) * math.asin(c / a)

	return a * pow(2, -10 * t) * math.sin((t * d - s) * (2 * math.pi) / p) + c + b

def easeInOutElastic(t, b, c, d, a = 1.70158):
	if t == 0:
		return b
	t /= (d / 2)
	if t == 2:
		return b + c

	p = d * (0.3 * 1.5)
	if a < abs(c):
		a, s = c, p / 4
	else:
		s = p / (2 * math.pi) * math.asin(c / a)

	if t < 1:
		t -= 1
		return -0.5 * (a * pow(2, 10 * t) * math.sin((t * d - s) * (2 * math.pi) / p)) + b

	t -= 1
	return a * pow(2, -10 * t) * math.sin((t * d - s) * (2 * math.pi) / p ) * 0.5 + c + b

def easeInBack(t, b, c, d, s = 1.70158):
	t /= d
	return c * t * t * ((s + 1) * t - s) + b

def easeOutBack(t, b, c, d, s = 1.70158):
	t = t / d - 1
	return c * (t * t * ((s + 1) * t + s) + 1) + b

def easeInOutBack(t, b, c, d, s = 1.70158):
	t /= d / 2
	s *= 1.525
	if t < 1:
		return c / 2 * (t * t * ((s + 1) * t - s)) + b;

	t -= 2
	return c/2 * (t * t * ((s + 1) * t + s) + 2) + b;

def easeInBounce(t, b, c, d):
		return c - easeOutBounce(d-t, 0, c, d) + b;

def easeOutBounce(t, b, c, d):
	t /= d
	if t < (1/2.75):
		return c*(7.5625*t*t) + b;

	elif t < (2/2.75):
		t -= (1.5/2.75)
		return c*(7.5625*t*t + 0.75) + b;

	elif t < (2.5/2.75):
		t -= (2.25/2.75)
		return c*(7.5625*t*t + 0.9375) + b;

	else:
		t -= (2.625/2.75)
		return c*(7.5625*t*t + 0.984375) + b;

def easeInOutBounce(t, b, c, d):
	if t < d/2:
		return easeInBounce(t*2, 0, c, d) * .5 + b;

	return easeOutBounce(t*2-d, 0, c, d) * .5 + c*.5 + b;
