$(document).ready(function () {

  // check if browser supports streaming
  if (window.navigator.mediaDevices && window.navigator.mediaDevices.getDisplayMedia) {
    $("#btn_streamer").toggle();
  }

  // variables
  var streamActive = false;
  var screenshotTimer = "";
  var screenshotIntervalTimeMs = 100;
  var streamImageHeight = 0;
  var streamImageWidth = 0;
  const videoElem = document.getElementById("streamvideo");
  const canvasElem = document.getElementById("streamcanvas");

  // Options for getDisplayMedia()
  var displayMediaOptions = {
    video: {
      cursor: "never",
      width: 170,
      height: 100,
      frameRate: 15
    },
    audio: false
  };

  async function startCapture() {
    streamActive = true;

    try {
      var stream = await navigator.mediaDevices.getDisplayMedia(displayMediaOptions);
      videoElem.srcObject = stream;

      // get the active track of the stream
      const track = stream.getVideoTracks()[0];

      // listen for track ending, fires when user aborts through browser
      track.onended = function (event) {
        stopCapture();
      };

      // wait for video ready
      videoElem.addEventListener('loadedmetadata', (e) => {
        window.setTimeout(() => (
          onCapabilitiesReady(track.getSettings())
        ), 500);
      });
    } catch (err) {
      stopCapture();
      console.error("Error: " + err);
    }
  }

  function onCapabilitiesReady(settings) {
    // extract real width/height
    streamImageWidth = settings.width;
    streamImageHeight = settings.height;

    // start screenshotTimer
    updateScrTimer(false);

    // we are sending
    $("#btn_streamer_icon").addClass("text-danger");
  }

  function stopCapture(evt) {
    streamActive = false;
    $("#btn_streamer_icon").removeClass("text-danger");

    updateScrTimer(true);
    // sometimes it's null on abort
    if (videoElem.srcObject) {
      let tracks = videoElem.srcObject.getTracks();

      tracks.forEach(track => track.stop());
      videoElem.srcObject = null;
    }
    requestPriorityClear(1);
  }

  function takePicture() {
    var context = canvasElem.getContext('2d');
    canvasElem.width = streamImageWidth;
    canvasElem.height = streamImageHeight;
    context.drawImage(videoElem, 0, 0, streamImageWidth, streamImageHeight);

    var data = canvasElem.toDataURL('image/png').split(",")[1];
    requestSetImage(data, -1, "Streaming");
  }

  // start or update screenshot timer
  function updateScrTimer(stop) {
    clearInterval(screenshotTimer)

    if (stop === false) {
      screenshotTimer = setInterval(() => (
        takePicture()
      ), screenshotIntervalTimeMs);
    }
  }

  $("#btn_streamer").off().on("click", function (e) {
    if (!$("#btn_streamer_icon").hasClass("text-danger") && !streamActive) {
      startCapture();
    } else {
      stopCapture();
    }
  });

  $(window.hyperion).on("stopBrowerScreenCapture", function (event) {
    if (streamActive) {
      stopCapture();
    }
  });

});