import defined from "./defined.js";

var implementation;
if (typeof cancelAnimationFrame !== "undefined") {
  implementation = cancelAnimationFrame;
}

(function () {
  // look for vendor prefixed function
  if (!defined(implementation) && typeof window !== "undefined") {
    var vendors = ["webkit", "moz", "ms", "o"];
    var i = 0;
    var len = vendors.length;
    while (i < len && !defined(implementation)) {
      implementation = window[vendors[i] + "CancelAnimationFrame"];
      if (!defined(implementation)) {
        implementation = window[vendors[i] + "CancelRequestAnimationFrame"];
      }
      ++i;
    }
  }

  // otherwise, assume requestAnimationFrame is based on setTimeout, so use clearTimeout
  if (!defined(implementation)) {
    implementation = clearTimeout;
  }
})();

/**
 * A browser-independent function to cancel an animation frame requested using {@link requestAnimationFrame}.
 *
 * @function cancelAnimationFrame
 *
 * @param {Number} requestID The value returned by {@link requestAnimationFrame}.
 *
 * @see {@link http://www.w3.org/TR/animation-timing/#the-WindowAnimationTiming-interface|The WindowAnimationTiming interface}
 */
function cancelAnimationFramePolyfill(requestID) {
  // we need this extra wrapper function because the native cancelAnimationFrame
  // functions must be invoked on the global scope (window), which is not the case
  // if invoked as Cesium.cancelAnimationFrame(requestID)
  implementation(requestID);
}
export default cancelAnimationFramePolyfill;
