goog.provide('ol.easing');

goog.require('goog.fx.easing');


/**
 * from https://raw.github.com/DmitryBaranovskiy/raphael/master/raphael.js
 * @param {number} t Input between 0 and 1.
 * @return {number} Output between 0 and 1.
 */
ol.easing.bounce = function(t) {
  var s = 7.5625, p = 2.75, l;
  if (t < (1 / p)) {
    l = s * t * t;
  } else {
    if (t < (2 / p)) {
      t -= (1.5 / p);
      l = s * t * t + 0.75;
    } else {
      if (t < (2.5 / p)) {
        t -= (2.25 / p);
        l = s * t * t + 0.9375;
      } else {
        t -= (2.625 / p);
        l = s * t * t + 0.984375;
      }
    }
  }
  return l;
};


/**
 * @param {number} t Input between 0 and 1.
 * @return {number} Output between 0 and 1.
 */
ol.easing.easeIn = goog.fx.easing.easeIn;


/**
 * @param {number} t Input between 0 and 1.
 * @return {number} Output between 0 and 1.
 */
ol.easing.easeOut = goog.fx.easing.easeOut;


/**
 * from https://raw.github.com/DmitryBaranovskiy/raphael/master/raphael.js
 * @param {number} t Input between 0 and 1.
 * @return {number} Output between 0 and 1.
 */
ol.easing.elastic = function(t) {
  return Math.pow(2, -10 * t) * Math.sin((t - 0.075) * (2 * Math.PI) / 0.3) + 1;
};


/**
 * @param {number} t Input between 0 and 1.
 * @return {number} Output between 0 and 1.
 */
ol.easing.inAndOut = goog.fx.easing.inAndOut;


/**
 * @param {number} t Input between 0 and 1.
 * @return {number} Output between 0 and 1.
 */
ol.easing.linear = function(t) {
  return t;
};


/**
 * @param {number} t Input between 0 and 1.
 * @return {number} Output between 0 and 1.
 */
ol.easing.upAndDown = function(t) {
  if (t < 0.5) {
    return ol.easing.inAndOut(2 * t);
  } else {
    return 1 - ol.easing.inAndOut(2 * (t - 0.5));
  }
};
