You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

231 lines
7.2 KiB
JavaScript

/*
* Copyright 2021 Netsyms Technologies.
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
var activeDrawImage;
var signaturePadCallback = function () {};
var clientSignatureSvg = "";
function getStampSvg(callback) {
getStampSvgWithValues({
name: getStorage("notary_name"),
location: getStorage("notary_location"),
expires: getStorage("notary_expires"),
idnumber: getStorage("notary_idnumber"),
state: getStorage("notary_state")
}, callback);
}
function getStampSvgWithValues(values, callback) {
$.get("templates/stamps/" + values.state + ".svg", {}, function (data) {
data = data + "";
data = data.replaceAll("[[[NAME]]]", values.name);
data = data.replaceAll("[[[LOCATION]]]", values.location);
data = data.replaceAll("[[[EXPIRES]]]", values.expires);
data = data.replaceAll("[[[IDNUMBER]]]", values.idnumber);
callback(data);
}, "text");
}
function makeStampImage(callback) {
getStampSvg(function (data) {
svgToImage(data, function (err, image) {
if (err) {
callback(false);
return;
}
callback(image);
});
});
}
function activateTextTool() {
var text = prompt("");
if (text == "") {
return;
}
var canvas = document.createElement('canvas');
canvas.width = 2000;
canvas.height = 400;
var ctx = canvas.getContext('2d');
ctx.font = "50px sans-serif";
ctx.fillText(text, 0, 50);
const image = new Image();
image.src = canvas.toDataURL();
image.width = 500;
image.height = 100;
activeDrawImage = image;
image.onload = function () {
enableGuideBox(activeDrawImage);
};
}
function activateStampDrawTool() {
makeStampImage(function (image) {
activeDrawImage = image;
enableGuideBox(image);
});
}
function activateNotarySignatureTool() {
if (!inStorage("notary_signature")) {
alert("Please set a notary signature in the settings.");
return;
}
svgToImage(getStorage("notary_signature"), function (err, image) {
if (err) {
callback(false);
return;
}
activeDrawImage = image;
enableGuideBox(image);
});
}
function activateNotaryCertificateTool() {
initCertificateBuilder();
certificateBuilderCallback = function () {
getCertificateSvg(function (svg) {
svgToImage(svg, function (err, image) {
if (err) {
console.error(err);
return;
}
activeDrawImage = image;
enableGuideBox(image);
});
});
};
}
function activateClientSignaturePad() {
initSignaturePad();
signaturePadCallback = function () {
if (clientSignatureSvg != "" && signaturePad.isEmpty()) {
var signature = clientSignatureSvg;
} else {
var signature = signaturePad.toDataURL("image/svg+xml");
signature = signature.replace("data:image/svg+xml;base64,", "");
signature = atob(signature);
signature = trimAndShrinkSVG(signature);
clientSignatureSvg = signature;
}
svgToImage(signature, function (err, image) {
if (err) {
callback(false);
return;
}
activeDrawImage = image;
enableGuideBox(image);
});
};
}
function drawImageFromUrl(x, y, width, height, src, canvas) {
var ctx = canvas.getContext("2d");
const image = new Image();
image.src = src;
image.onload = () => {
ctx.drawImage(image, x, y, width, height);
}
}
function drawImage(x, y, width, height, image, canvas) {
var ctx = canvas.getContext("2d");
ctx.drawImage(image, x, y, width, height);
}
$("#page-canvas-container").on("click", ".page-canvas", function (evt) {
$("#page-canvas-container .page-canvas").removeClass("active");
$(this).addClass("active");
evt.stopPropagation();
});
$("body").on("click", "#page-canvas-container", function (evt) {
$("#page-canvas-container .page-canvas").removeClass("active");
disableGuideBox();
});
$("#page-canvas-container").on("click", ".page-canvas.active", function (evt) {
if (typeof activeDrawImage == "undefined" || activeDrawImage == null) {
return;
}
var canvas = $(this)[0];
var coords = getMousePos(canvas, evt);
var imageWidth = (activeDrawImage.width / 96) * pdfAssumedDPI * pdfPageScale;
var imageHeight = (activeDrawImage.height / 96) * pdfAssumedDPI * pdfPageScale;
drawImage(coords.x, coords.y, imageWidth, imageHeight, activeDrawImage, canvas);
});
function enableGuideBox(image, scalecorrectionfactor) {
if (typeof scalecorrectionfactor == "undefined") {
scalecorrectionfactor = 1;
}
var context = $("#placementguidebox")[0].getContext('2d');
context.clearRect(0, 0, $("#placementguidebox")[0].width, $("#placementguidebox")[0].height);
$("#placementguidebox").css("display", "");
// calculate size of guide image
var pageWidthPx = $("#page-canvas-container .page-canvas")[0].getContext("2d").canvas.width;
var pageCanvasCurrentWidthPx = $("#page-canvas-container .page-canvas").css("width").replace("px", "") * 1;
var pageWidthInches = pageWidthPx / (pdfAssumedDPI * pdfPageScale);
var canvasCurrentDPI = pageCanvasCurrentWidthPx / pageWidthInches;
var imageWidth = (image.width / (96 * scalecorrectionfactor)) * canvasCurrentDPI;
var imageHeight = (image.height / (96 * scalecorrectionfactor)) * canvasCurrentDPI;
var canvas = $("#placementguidebox")[0];
var ctx = canvas.getContext("2d");
ctx.drawImage(image, 0, 0, imageWidth, imageHeight);
}
function disableGuideBox() {
$("#placementguidebox").css("display", "none");
var context = $("#placementguidebox")[0].getContext('2d');
context.clearRect(0, 0, $("#placementguidebox")[0].width, $("#placementguidebox")[0].height);
activeDrawImage = null;
}
$("#page-canvas-container").on("mousemove", function (e) {
var posx = 0;
var posy = 0;
posx = e.pageX + $("#page-canvas-container").scrollLeft() - $("#page-canvas-container").offset().left;
posy = e.pageY + $("#page-canvas-container").scrollTop() - $("#page-canvas-container").offset().top;
$("#placementguidebox").css({
left: posx,
top: posy
});
});
/**
* https://stackoverflow.com/a/17130415
* @param {type} canvas
* @param {type} evt
* @returns {getMousePos.pdfAnonym$1}
*/
function getMousePos(canvas, evt) {
var rect = canvas.getBoundingClientRect(), // abs. size of element
scaleX = canvas.width / rect.width, // relationship bitmap vs. element for X
scaleY = canvas.height / rect.height; // relationship bitmap vs. element for Y
return {
x: (evt.clientX - rect.left) * scaleX, // scale mouse coordinates after they have
y: (evt.clientY - rect.top) * scaleY // been adjusted to be relative to element
}
}
// Hide it at start
// doesn't work in CSS because of reasons
disableGuideBox();