var a = document.getElementById("a");
var b = document.getElementById("b");
var result = document.getElementById("result");

function changed() {
  // https://github.com/kpdecker/jsdiff/issues/389
  // I would love to use `{ignoreWhitespace: true}` here but it breaks the formatting
  options = {
    ignoreWhitespace: document.getElementById("ignoreWhitespace").checked,
  };

  var diff = Diff[window.diffType](a.textContent, b.textContent, options);
  var fragment = document.createDocumentFragment();
  for (var i = 0; i < diff.length; i++) {
    if (diff[i].added && diff[i + 1] && diff[i + 1].removed) {
      var swap = diff[i];
      diff[i] = diff[i + 1];
      diff[i + 1] = swap;
    }

    var node;
    if (diff[i].removed) {
      node = document.createElement("del");
      node.classList.add("change");
      const wrapper = node.appendChild(document.createElement("span"));
      wrapper.appendChild(document.createTextNode(diff[i].value));
    } else if (diff[i].added) {
      node = document.createElement("ins");
      node.classList.add("change");
      const wrapper = node.appendChild(document.createElement("span"));
      wrapper.appendChild(document.createTextNode(diff[i].value));
    } else {
      node = document.createTextNode(diff[i].value);
    }
    fragment.appendChild(node);
  }

  result.textContent = "";
  result.appendChild(fragment);

  // Jump at start
  inputs.current = 0;
  next_diff();
}

window.onload = function () {
  /* Convert what is options from UTC time.time() to local browser time */
  var diffList = document.getElementById("diff-version");
  if (typeof diffList != "undefined" && diffList != null) {
    for (var option of diffList.options) {
      var dateObject = new Date(option.value * 1000);
      option.label = dateObject.toLocaleString();
    }
  }

  /* Set current version date as local time in the browser also */
  var current_v = document.getElementById("current-v-date");
  var dateObject = new Date(newest_version_timestamp * 1000);
  current_v.innerHTML = dateObject.toLocaleString();
  onDiffTypeChange(
    document.querySelector('#settings [name="diff_type"]:checked'),
  );
  changed();
};

a.onpaste = a.onchange = b.onpaste = b.onchange = changed;

if ("oninput" in a) {
  a.oninput = b.oninput = changed;
} else {
  a.onkeyup = b.onkeyup = changed;
}

function onDiffTypeChange(radio) {
  window.diffType = radio.value;
  // Not necessary
  //	document.title = "Diff " + radio.value.slice(4);
}

var radio = document.getElementsByName("diff_type");
for (var i = 0; i < radio.length; i++) {
  radio[i].onchange = function (e) {
    onDiffTypeChange(e.target);
    changed();
  };
}

document.getElementById("ignoreWhitespace").onchange = function (e) {
  changed();
};

var inputs = document.getElementsByClassName("change");
inputs.current = 0;

function next_diff() {
  var element = inputs[inputs.current];
  var headerOffset = 80;
  var elementPosition = element.getBoundingClientRect().top;
  var offsetPosition = elementPosition - headerOffset + window.scrollY;

  window.scrollTo({
    top: offsetPosition,
    behavior: "smooth",
  });

  inputs.current++;
  if (inputs.current >= inputs.length) {
    inputs.current = 0;
  }
}
