// `photos` variable populated by script tag in place page html
viewState = null;
galleryContainer = document.getElementById("galleryContainer");
galleryImage = document.getElementById("galleryImage");
previewLinks = document.getElementsByClassName("previewLink");
headerImage = document.getElementById("headerImage");

touchDragThreshold = 50;
directionDetermined = false;

// null is used when no information is supposed to be available.
// functions set these to useful values during touch events.
touchDragStartX = null;
touchDirection = null;

// changes to style.rotate are necessary because transformed elements
// get stuck in front of the gallery images

function enlargeImage (filename) {
  viewState = photos.indexOf(filename);
  galleryImage.fullRes = filename;
  galleryImage.src = "/compressed/compressed_" + filename;
  galleryContainer.style.display = "block";
  document.body.style = "overflow:hidden;"
  headerImage.style.rotate = "none";
};

function delGallery () {
  galleryContainer.style.display = "none";
  galleryImage.src = "";
  headerImage.style.rotate = "-3deg";
  document.body.style = "overflow:auto;"
};

function nextImage () {
  viewState++;
  if (viewState == previewLinks.length) {
    viewState = 0;  
  };
  galleryImage.fullRes = photos[viewState];
  galleryImage.src = "/compressed/compressed_" + photos[viewState];
};

function prevImage () {
  viewState--;
  if (viewState == -1) {
    viewState = previewLinks.length - 1;
  };
  galleryImage.fullRes = photos[viewState];
  galleryImage.src = "/compressed/compressed_" + photos[viewState];
};

function imageNewTab () {
  window.open(galleryImage.fullRes, "_blank")
};

function keyHandler (event) {
  if (event.key == "ArrowRight" | event.key == "Space") {
    nextImage();
  } else if (event.key == "ArrowLeft") {
    prevImage();
  } else if (event.key == "Escape" | event.key == "q") {
    delGallery();
  } 
};

function delGalleryHandler (event) {
  if (event.target.id == "galleryContainer") {
    delGallery();
  };
};

function mouseUpHandler (event) {
  if (event.clientX > window.innerWidth / 2) {
      nextImage();
    } else {
      prevImage();
    };
};

function onTouchMove (event) {
  event.preventDefault();
  screenX = event.changedTouches[0].screenX;
  if (!directionDetermined && touchDragStartX == null) {
    touchDragStartX = screenX;
  };
  touchDelta = Math.abs(touchDragStartX - screenX);
  if (!directionDetermined && (touchDelta > touchDragThreshold)) {
    touchDirection = touchDragStartX > screenX;
    touchDragStartX = null;
    directionDetermined = true;
};
};

function onTouchEnd (event) {
  event.preventDefault();
  // poorly phrased, but this must reset state to default
  directionDetermined = false;
  touchDragStartX = null;
  if (touchDirection == null) {
    return;
  };
  if (touchDirection) {
    nextImage();
  } else {
    prevImage();
  };
  touchDirection = null;
};

document.onkeydown = keyHandler;
document.body.onclick = delGalleryHandler;
galleryImage.addEventListener("mouseup", mouseUpHandler);
galleryImage.addEventListener("touchmove", onTouchMove);
galleryImage.addEventListener("touchend", onTouchEnd);
galleryImage.addEventListener("touchstart", function (event) {
  event.preventDefault();
});