/**
 * Free the VIDEO elements: get rid of overlays, and enable the native controls.
 *
 * Useful on https://www.instagram.com/ where the stupid overlays prevent
 * showing the controls and triggering the context menu, so you don’t know how
 * long the video will take and can't play the video in full screen mode.
 *
 * @title Free Viddy
 */
(function freeviddy() {
  /* Recursively execute the main logic on the document and its sub-documents. */
  function execute(document) {
    document.addEventListener('touchmove mousemove', function debouncer(event) {
      clearTimeout(debouncer.timeoutId);
      debouncer.timeoutId = setTimeout(function () {
	let elementsUnderPointer = document.elementsFromPoint(event.clientX, event.clientY);
	let overlaysToRemove = [];

	for (let i = 0; i < elementsUnderPointer.length; i++) {
	  if ((elementsUnderPointer[i].tagName.toUpperCase() === 'VIDEO' ||
               elementsUnderPointer[i].tagName.toUpperCase() === 'IFRAME') && !elementsUnderPointer[i].xxxJanFreeViddyProcessed) {
	    let video = elementsUnderPointer[i];
	    video.controls = true;
	    video.xxxJanFreeViddyProcessed = true;

	    if (i === 0) {
	    } else {
	      overlaysToRemove = elementsUnderPointer.slice(0, i);
	    }

	    break;
	  }
	}

	if (overlaysToRemove.length) {
	  overlaysToRemove.forEach(element => element.remove());
	}
      }, 50);
    });

    /* Recurse for frames and iframes. */
    try {
      Array.from(
	document.querySelectorAll('frame, iframe, object[type^="text/html"], object[type^="application/xhtml+xml"]')
      ).forEach(
	elem => execute(elem.contentDocument)
      );
    } catch (e) {
      /* Catch exceptions for out-of-domain access, but do not do anything with them. */
    }
  }

  execute(document);
})();
