document.addEventListener("DOMContentLoaded", function() { const lastIndex = imagePath.lastIndexOf("."); const cutImagePath = imagePath.slice(0, lastIndex) + ".png"; const canvas = document.getElementById('canvas'); const mainImage = document.getElementById('mainImage'); const completeDrawingButton = document.getElementById('completeDrawing'); const clearButton = document.getElementById('clearButton'); const ctx = canvas.getContext('2d'); const coordinates = []; function canvasScale(type) { // get the original image size let actualWidth = mainImage.clientWidth; let actualHeight = mainImage.clientHeight; if (type === "getScale") { // calculate the scale-factor to properly cut the image let naturalWidth = mainImage.naturalWidth; let scaleFactor = naturalWidth / actualWidth; return scaleFactor; } else if (type === "resize") { // adjust canvas to fit on the image canvas.width = actualWidth; canvas.height = actualHeight; canvas.style.top = mainImage.offsetTop + 'px'; canvas.style.left = mainImage.offsetLeft + 'px'; ctx.clearRect(0, 0, canvas.width, canvas.height); } } // resize canvas on loaded window window.addEventListener("load", canvasScale("resize")); document.getElementById("cutoutContainer"); cutoutContainer.style.display = "none"; // left-click to add coordinates/ points canvas.addEventListener('click', function(event) { const rect = canvas.getBoundingClientRect(); const scaleX = canvas.width / rect.width; const scaleY = canvas.height / rect.height; let x = (event.clientX - rect.left) * scaleX; let y = (event.clientY - rect.top) * scaleY; coordinates.push({x, y}); drawCoordinates(); }) // right-click to remove existing coordinates canvas.addEventListener('contextmenu', function(event) { event.preventDefault(); const rect = canvas.getBoundingClientRect(); const scaleX = canvas.width / rect.width; const scaleY = canvas.height / rect.height; let x = (event.clientX - rect.left) * scaleX; let y = (event.clientY - rect.top) * scaleY; const index = coordinates.findIndex(coord => { return Math.abs(coord.x - x) < 5 && Math.abs(coord.y - y) < 5; }); if (index !== -1) { coordinates.splice(index, 1); drawCoordinates(); } }); // completion of the drawing completeDrawingButton.addEventListener('click', function() { // start a loading animation loadingAnimation('start'); // adjust coordinates to the original size of the image for (let i = 0; i < coordinates.length; i++) { coordinates[i].x *= canvasScale("getScale"); coordinates[i].y *= canvasScale("getScale"); } const xhr = new XMLHttpRequest(); xhr.open('POST','/save_drawing', true); xhr.setRequestHeader('Content-Type', 'application/json'); xhr.onreadystatechange = function() { if (xhr.readyState === 4 && xhr.status === 200) { // readyState 4 => request finished ; status 200 => worked correctly loadingAnimation('stop'); finishedDrawing(); } }; // prepare object with coordinates, image path and cutImagePath to send to php var data = { coordinates: coordinates, imagePath: imagePath, cutImagePath: cutImagePath, } xhr.send(JSON.stringify(data)); coordinates.length = 0; drawCoordinates(); }); // clearing the image clearButton.addEventListener('click', function() { coordinates.length = 0; drawCoordinates(); }) // draw new coordinates / refresh the drawing function drawCoordinates() { ctx.clearRect(0, 0, canvas.width, canvas.height); ctx.fillStyle = 'blue'; ctx.imageSmoothingEnabled = true; // Enable anti-aliasing ctx.lineWidth = 2; // Adjust line width for smoother rendering ctx.lineCap = 'round'; // Use rounded line caps ctx.lineJoin = 'round'; // Use rounded line joins coordinates.forEach((coord, index) => { ctx.beginPath(); ctx.arc(coord.x, coord.y, 3, 0, Math.PI * 2); ctx.fill(); if (index > 0) { ctx.beginPath(); ctx.moveTo(coordinates[index - 1].x, coordinates[index - 1].y); ctx.lineTo(coord.x, coord.y); ctx.strokeStyle = 'white'; ctx.stroke(); } }); } }); // start cutout function startCutout() { // show the cutout interface cutoutContainer.style.display = "block"; // remove the clicked button const cutoutStart = document.getElementById("cutoutStart"); cutoutStart.style.display = "none"; // remove wave animation toggleWave("remove"); // change heading let uploadHeading = document.getElementById("uploadHeading"); uploadHeading.innerText = "Durch Klicken umrahmen" } // finish drawing function finishedDrawing() { // remove cutout interface cutoutContainer.style.display = "none"; // change heading let uploadHeading = document.getElementById("uploadHeading"); uploadHeading.innerText = "Danke für deine Hilfe!" // refresh image in wave-animation and show it toggleWave("show"); refreshImage(); } // loading animation function loadingAnimation(type) { let loading = document.getElementById('loading'); if (type == 'start') { loading.style.display = 'flex'; } else if (type == 'stop') { loading.style.display = 'none'; } } // toggle showing wave animation function toggleWave(type) { let wave = document.getElementById("anim_container") if (type === "remove") { wave.style.display = "none"; } else if(type === "show"){ wave.style.display = "block"; } else { wave.style.display = "block"; } }