/* * User related JS * * * * */ window.onload = function () { subscribe(); if (window.location.href.indexOf("=add-website") > 0) { //try { userOperations.verificationSetStatusByUrl(); //userOperations.verificationFile(); //} catch (e) { //} var file_verify_button = document.querySelector("#file-verify-button"); if (file_verify_button !== null) { file_verify_button.addEventListener("click", function () { var loading = document.querySelector("#spinner-element"); var veirfyTableSection = document.querySelector("#file-verification"); loading = loading.cloneNode(true); loading.classList.remove("d-none"); veirfyTableSection.innerHTML = loading.outerHTML; userOperations.verificationFile(); }); } var cancel_verify_button = document.querySelector("#cancel-verify-button"); if (cancel_verify_button !== null) { cancel_verify_button.addEventListener("click", function () { userOperations.cancelValidationProcess(); }); } } }; var userOperations = (function () { function _clearColorClasses(element) { element.classList.remove("text-success"); element.classList.remove("text-danger"); element.classList.remove("failed"); } function _setStatus(element, data) { var statusElement = document.querySelector("#" + element + "-verification"); if (data["status-code"] === 200) { statusElement.innerHTML = "OK"; _clearColorClasses(statusElement); statusElement.classList.add("text-success"); if (element === "file") { var button = document.querySelector("#file-verify-button"); if (button !== null) { button.classList.add("d-none"); } var c_link = document.querySelector("#confirm-link"); if (c_link !== null) { c_link.classList.remove("d-none"); } document.querySelector("#verify-text").classList.add("d-none"); } return true; } statusElement.innerHTML = "Failed"; _clearColorClasses(statusElement); statusElement.classList.add("text-danger"); return false; } function _handleCancelAction(data) { window.location = "/dashboard?action=website-monitor"; } function verificationSetStatusByUrl() { const queryString = window.location.search; var urlParams = new URLSearchParams(queryString); url = "/user-request?action=check-url&now=1&url=" + urlParams.get("url"); sendRequest.doGet(url, _setStatus.bind(this, "status")); } function verificationFile() { const queryString = window.location.search; var urlParams = new URLSearchParams(queryString); var input = document.querySelector("#input_identifier"); if (input !== null) { value = input.value; } else { value = "none"; } var inputuid = document.querySelector("#uid"); if (inputuid !== null) { uid = inputuid.value; } else { uid = "none"; } url = "/user-request?action=check-file&now=1&id=" + value + "&url=" + urlParams.get("url") + "&uid=" + uid; sendRequest.doGet(url, _setStatus.bind(this, "file")); } function cancelValidationProcess() { const queryString = window.location.search; var urlParams = new URLSearchParams(queryString); var id = document.querySelector("#uid"); url = "/user-request?action=cancel-verification&now=1&id=" + id.value + "&url=" + urlParams.get("url"); sendRequest.doGet(url, _handleCancelAction.bind(this, "file")); } function setEventListenerss() { var verifyButton = document.querySelector("#file-verify-button"); if (verifyButton !== null) { verifyButton.addEventListener("click", verificationFile); } var cancelButton = document.querySelector("#cancel-verify-button"); if (cancelButton !== null) { cancelButton.addEventListener("click", cancelValidationProcess); } } var API = { verificationSetStatusByUrl: verificationSetStatusByUrl, verificationFile: verificationFile, cancelValidationProcess: cancelValidationProcess, setEventListenerss: setEventListenerss, }; return API; })(); function processing(visible, hide_after_done = false) { var loading_box = document.getElementById("processing"); if (loading_box !== null && loading_box !== undefined) { if (visible) { loading_box.parentElement.classList.contains("hidden") ? loading_box.parentElement.classList.remove("hidden") : null; loading_box.parentElement.parentElement.classList.contains("hidden") ? loading_box.parentElement.parentElement.classList.remove("hidden") : null; loading_box.classList.remove("hidden"); // document.querySelector("#upload_text").setAttribute("hidden", "true"); } else { !loading_box.parentElement.classList.contains("hidden") ? loading_box.parentElement.classList.add("hidden") : null; if (hide_after_done) { !loading_box.parentElement.parentElement.classList.contains("hidden") ? loading_box.parentElement.parentElement.classList.add("hidden") : null; } loading_box.classList.add("hidden"); } } } function loading(visible, hide_after_done = false) { var loading_box = document.getElementById("loading"); if (loading_box !== null && loading_box !== undefined) { if (visible) { loading_box.parentElement.classList.contains("hidden") ? loading_box.parentElement.classList.remove("hidden") : null; loading_box.parentElement.parentElement.classList.contains("hidden") ? loading_box.parentElement.parentElement.classList.remove("hidden") : null; loading_box.classList.remove("hidden"); // document.querySelector("#upload_text").setAttribute("hidden", "true"); } else { !loading_box.parentElement.classList.contains("hidden") ? loading_box.parentElement.classList.add("hidden") : null; if (hide_after_done) { !loading_box.parentElement.parentElement.classList.contains("hidden") ? loading_box.parentElement.parentElement.classList.add("hidden") : null; } loading_box.classList.add("hidden"); } } } function validate_email(mail) { if (/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/.test(mail)) { return true; } return false; } function subscribe() { btn = document.querySelector("#subscribe"); let counter = 0; inpt = btn.parentElement.querySelector("input[name=add-subscribe]"); btn.addEventListener("click", function (ev) { ev.preventDefault(); if (validate_email(inpt.value)) { if (counter == 0) { foot = document.querySelector("footer"); script_tag = document.createElement("script"); script_tag.setAttribute( "src", "https://www.google.com/recaptcha/api.js?" ); script_tag.setAttribute("defer", "defer"); foot.parentNode.insertBefore(script_tag, foot.nextSibling); document.querySelector(".g-recaptcha").classList.remove("d-none"); } if (counter >= 1) { if (grecaptcha.getResponse().length == 0) { set_alert("Please solve the captcha !", "danger"); return false; } data = new FormData(); data.append("add-subscribe", inpt.value); sendRequest.doPost("/user-request", data, (call_data) => { if (call_data["success"]) { set_alert(call_data["success"], "success"); } else { set_alert(call_data["false"], "danger"); } }); } counter++; } else { set_alert("Please insert a valid email address!", "danger"); } }); } function remove_alert() { alert_modal = document.querySelector(".alert-modal"); alert_box = alert_modal.querySelector(".tool-alert"); input_alert_box = alert_modal.querySelector(".input-alert"); alert_modal.classList.add("d-none"); if (alert_box.children.length > 1) { alert_box.children[0].remove(); } if (input_alert_box !== null && input_alert_box !== undefined) { input_alert_box.classList.add("d-none"); // if (input_alert_box.children.length > 1){ // input_alert_box.children[0].remove(); // } } } async function post_form_request(url, data, callback = false) { await sendRequest.doPost(url, data, (call_data) => { if (!callback) { if (call_data["success"] !== null && call_data["success"] !== undefined) { set_alert(call_data["success"], "success"); } else { set_alert(call_data["failure"], "danger"); } } else { callback(call_data); } }); } async function set_alert(message, text_class) { processing(false); loading(false); message_span = document.createElement("span"); alert_modal = document.querySelector(".alert-modal"); alert_modal.children[0].classList.add("text-center"); if (text_class !== "danger") { alert_modal.children[0].classList.remove("alert-danger"); alert_modal.children[0].classList.add("alert-" + text_class); } else { alert_modal.children[0].classList.contains("alert-danger") ? null : alert_modal.children[0].classList.add("alert-danger"); } alert_box = alert_modal.querySelector(".tool-alert"); alert_modal.classList.remove("d-none"); text_class == null ? message_span.classList.add("text-dark") : message_span.classList.add("text-" + text_class); message_span.innerHTML = message; alert_box.insertBefore(message_span, alert_box.children[0]); } function $(selector, all = false) { if (!all) { return document.querySelector(selector); } else { return document.querySelectorAll(selector); } } // GLOBAL VARIABLES const app = { visitor_pages: [], conversion_button: document.querySelector(".conversion-button"), conversion_type: null, allowed_types: [], seo_tags: ["description", "title"], is_dev: false, is_logged: false, is_user_page: false, allowed_file_size: null, file_size: 0, init() { cookies = this.getCookies(); cookies.logged !== undefined && cookies.logged !== "false" ? (this.is_logged = true) : null, this.check_if_dev() ? (this.is_dev = true) : null; if ( this.conversion_button !== null && this.conversion_button !== undefined ) { this.conversion_type = this.conversion_button.id; if (this.conversion_type === "ocr") { this.allowed_types = ["jpg", "png", "jpeg", "pdf", "tiff"]; this.max_files = 15; this.is_logged ? (this.allowed_file_size = 200) : (this.allowed_file_size = 30); } if (this.conversion_type === "pdf-to-image") { this.allowed_types = ["pdf"]; this.max_files = 10; this.is_logged ? (this.allowed_file_size = 200) : (this.allowed_file_size = 30); } if (this.conversion_type === "image-to-pdf") { this.allowed_types = ["jpg", "jpeg", "png", "tiff"]; this.is_logged ? (this.max_files = 15) : (this.max_files = 5); this.is_logged ? (this.allowed_file_size = 200) : (this.allowed_file_size = 30); } if (this.conversion_type === "split-pdf") { this.allowed_types = ["pdf"]; this.is_logged ? (this.max_files = 1) : (this.max_files = 1); // this.is_logged ? this.allowed_file_size = 200 : this.allowed_file_size = 30 } if (this.conversion_type === "kw-check") { this.allowed_types = ["txt", "docx"]; this.max_files = 1; this.is_logged ? (this.allowed_file_size = 200) : (this.allowed_file_size = 30); } if (this.conversion_type == "pdf-add-watermark") { this.allowed_types = ["pdf"]; this.max_files = 1; this.is_logged ? (this.allowed_file_size = 200) : (this.allowed_file_size = 30); } if (this.conversion_type == "merge-pdf") { this.allowed_types = ["pdf"]; this.max_files = 10; this.is_logged ? (this.allowed_file_size = 200) : (this.allowed_file_size = 30); } if (this.conversion_type == "compress-pdf") { this.allowed_types = ["pdf"]; this.max_files = 1; this.is_logged ? (this.allowed_file_size = 200) : (this.allowed_file_size = 30); } if (this.conversion_type == "swap-pdf-pages") { this.allowed_types = ["pdf"]; this.max_files = 1; this.is_logged ? (this.allowed_file_size = 200) : (this.allowed_file_size = 30); } } window.location.href.indexOf("dashboard") >= 0 ? (this.is_user_page = true) : null; this.is_dev ? (prefix = "dev.") : (prefix = ""); this.visitor_pages = [ "https://" + prefix + "dailyocr.com/", "https://" + prefix + "dailyocr.com/tools/", "https://" + prefix + "dailyocr.com/tools/ocr", "https://" + prefix + "dailyocr.com/tools/pdf-to-image", "https://" + prefix + "dailyocr.com/tools/image-to-pdf", "https://" + prefix + "dailyocr.com/tools/keyword-density", "https://" + prefix + "dailyocr.com/tools/seo-heading-checker", "https://" + prefix + "dailyocr.com/tools/seo-description-checker", "https://" + prefix + "dailyocr.com/tools/seo-title-checker", "https://" + prefix + "dailyocr.com/tools/seo-sitemap-checker", "https://" + prefix + "dailyocr.com/tools/sitemap-broken-links", "https://" + prefix + "dailyocr.com/tools/sitemap-generator", "https://" + prefix + "dailyocr.com/tools/seo-robots-checker", "https://" + prefix + "dailyocr.com/tools/write-seo-title", "https://" + prefix + "dailyocr.com/tools/write-seo-description", "https://" + prefix + "dailyocr.com/tools/split-pdf", "https://" + prefix + "dailyocr.com/tools/pdf-add-watermark", "https://" + prefix + "dailyocr.com/tools/merge-pdf", "https://" + prefix + "dailyocr.com/tools/swap-pdf-pages", "https://" + prefix + "dailyocr.com/tools/minified-js-checker", "https://" + prefix + "dailyocr.com/tools/minified-css-checker", "https://" + prefix + "dailyocr.com/tools/seo-image-checker", "https://" + prefix + "dailyocr.com/tools/seo-social-checker", "https://" + prefix + "dailyocr.com/tools/seo-canonical-checker", "https://" + prefix + "dailyocr.com/tools/seo-page-size-checker", "https://" + prefix + "dailyocr.com/tools/seo-gzip-checker", "https://" + prefix + "dailyocr.com/tools/whois-lookup", "https://" + prefix + "dailyocr.com/tools/check-http-header", "https://" + prefix + "dailyocr.com/tools/domain-age-checker", "https://" + prefix + "dailyocr.com/tools/website-tree-structure", "https://" + prefix + "dailyocr.com/tools/broken-links-checker", "https://" + prefix + "dailyocr.com/seo-report", ]; if (!this.is_dev) { if (this.visitor_pages.find((elem) => elem === window.location.href)) { load_analitics(); } } }, check_if_dev() { if (location.hostname.indexOf("dev") !== -1) { return true; } else { return false; } }, getCookies() { var pairs = document.cookie.split(";"); var cookies = {}; for (var i = 0; i < pairs.length; i++) { var pair = pairs[i].split("="); cookies[(pair[0] + "").trim()] = unescape(pair.slice(1).join("=")); } return cookies; }, input_accept() { inpt = document.querySelector("#file"); if (inpt == null || inpt == undefined) { return false; } replace_inpt = document.querySelector("#replace_file"); attr_string = ""; this.allowed_types.forEach(function (tp) { if (tp == "pdf") { attr_string += "application/" + tp + ", "; } attr_string += "image/" + tp + ", "; }); inpt.setAttribute("accept", attr_string); if (replace_inpt !== undefined && replace_inpt !== null) { replace_inpt.setAttribute("accept", attr_string); } }, }; //console.log( app.is_dev); function clear_storage() { var conv_btn = $(".conversion-button"); window.addEventListener("beforeunload", clearHandler); conv_btn.addEventListener("click", clearHandler); } function clearHandler() { if (localStorage.getItem("order_id")) { var url = "/clear?id=" + localStorage.getItem("order_id"); sendRequest.doGet(url, null); localStorage.removeItem("order_id"); } else { token = document.querySelector("#token"); if (token) { var url = "/clear?token=" + token.value; sendRequest.doGet(url, null); } } } async function update_connection_status() { window.onbeforeunload = function () { token = $("#token").value; var url = "/user-request?close-connection&token=" + token; sendRequest.doGet(url, null); }; } function user_create() { var pass = document.querySelector("[name=password]"); var re_pass = document.querySelector("[name=retype_password]"); var sbmt = document.querySelector("[name=create]"); var user_name = document.querySelector("[name=user_name]"); var numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; sbmt.addEventListener("click", function (ev) { count = 0; Array.from(pass.value).forEach(function (elem) { if (numbers.includes(parseInt(elem))) { count++; } }); if (user_name.value.length < 5) { ev.preventDefault(); set_alert("Username must be at least 5 characters long!", "danger"); } else if (pass.value.length < 7) { ev.preventDefault(); set_alert( "Password too short. Must be at least 7 characters long.", "danger" ); } else if (count < 1) { ev.preventDefault(); set_alert( "Password must contain at least 2 alpha numeric characters!", "danger" ); } else if (pass.value !== re_pass.value) { ev.preventDefault(); set_alert("Passwords must match!", "danger"); } }); } function display_allowed_types() { var file_input = document.querySelector(".upload-span"); if (file_input !== undefined && file_input !== null) { file_input.innerHTML = file_input.innerHTML + app.allowed_types.join(", ").toUpperCase(); } } function change_convert_btn(bool, hide = false) { var btn = document.querySelector(".conversion-button"); if (bool) { btn.removeAttribute("disabled"); btn.parentElement.classList.remove("d-none"); } else { if (hide) { btn.parentElement.classList.add("d-none"); } btn.setAttribute("disabled", "disabled"); } } function split_pdf_data() { var split_type = document.querySelectorAll(".split-type"); split_type = Array.from(split_type).find((elem) => elem.hasAttribute("checked") ); var total_files = document.querySelector(".total-pdfs").innerHTML; var form_data_results = []; form_data_results["total_pdfs"] = total_files; form_data_results["split_type"] = split_type.id; var split_points = []; var removes = []; switch (split_type.id) { case "manual": var manual_splits = document.querySelectorAll(".manual-split"); var manual_removes = document.querySelectorAll(".manual-remove"); manual_splits.forEach(function (elem) { var from = parseInt( elem.querySelector(".manual-from-span").innerHTML.split(":")[1] ); var to = parseInt( elem.querySelector(".manual-to-span").innerHTML.split(":")[1] ); split_points.push(from + "-" + to); }); form_data_results["splits"] = split_points; manual_removes.forEach(function (elem) { removes.push(elem.innerHTML); }); removes.length == 0 ? (form_data_results["removes"] = "none") : (form_data_results["removes"] = removes); break; case "range": var range_splits = document.querySelectorAll(".range-split-holder"); range_splits.forEach(function (elem, idx) { var from = parseInt( elem .querySelector("#start-page-" + (idx + 1)) .querySelector(".page-number").innerHTML ); var to = parseInt( elem .querySelector("#end-page-" + (idx + 1)) .querySelector(".page-number").innerHTML ); split_points.push(from + "-" + to); }); form_data_results["splits"] = split_points; form_data_results["removes"] = "none"; break; case "all": var all_splits = document.querySelectorAll(".all-split"); all_splits.forEach(function (elem, idx) { var from = parseInt(elem.children[0].innerHTML.split(":")[1]); split_points.push(from); }); var all_removes = document.querySelectorAll(".manual-remove"); all_removes.forEach(function (elem) { removes.push(elem.innerHTML.split(":")[1]); }); form_data_results["splits"] = split_points; form_data_results["removes"] = removes; break; } document.querySelector("#zip-files").hasAttribute("checked") ? (form_data_results["has_zip"] = "true") : (form_data_results["has_zip"] = "false"); // return false;; return form_data_results; } function add_swap_pdf_pages_data() { var form_data_results = []; form_data_results["page-order"] = []; pages = document.querySelectorAll(".page-holder"); pages.forEach(function (page) { form_data_results["page-order"].push(page.id); }); removed = document.querySelectorAll(".manual-remove"); if (removed.length > 0) { form_data_results["removed"] = []; removed.forEach(function (rm) { form_data_results["removed"].push(rm.innerHTML); }); } return form_data_results; } let hex2rgb = (hex) => { if (hex.length === 4) { return fullHex(hex); } const r = parseInt(hex.slice(1, 3), 16); const g = parseInt(hex.slice(3, 5), 16); const b = parseInt(hex.slice(5, 7), 16); // return {r, g, b} return { r, g, b }; }; function add_watermark_data() { var method = document.querySelectorAll(".method"); method = Array.from(method).find((elem) => elem.hasAttribute("checked")); var form_data_results = []; form_data_results["pages"] = []; if (method.id == "manual") { pages = document.querySelectorAll(".watermarked"); if (pages.length == 0) { set_alert("Select pages to add watermark!", "danger"); return false; } to_add = []; pages.forEach(function (page) { holder = page.parentElement.previousSibling; to_add.push(parseInt(holder.querySelector(".page-number").innerHTML) - 1); }); form_data_results["pages"] = to_add; } if (method.id == "all") { form_data_results["pages"] = [1, pdf_renderer.total_pages]; removed_pages = document .querySelector(".removed-pages-list") .querySelectorAll(".manual-remove"); if (removed_pages.length > 0) { form_data_results["removed-pages"] = []; removed_pages.forEach(function (elem) { form_data_results["removed-pages"].push(elem.innerHTML); }); } } if (method.id == "range") { menus = document.querySelectorAll(".range-menu"); menus.forEach(function (menu) { inpts = menu.querySelectorAll(".range-input"); form_data_results["pages"].push([ parseInt(inpts[0].value) - 1, parseInt(inpts[1].value) - 1, ]); }); } form_data_results["method"] = method.id; form_data_results["wm-type"] = document.querySelector( ".selected-watermark" ).id; if (form_data_results["wm-type"] == "text-wm") { form_data_results["input-text"] = document.querySelector( "input[name=input-text]" ).value; if (!form_data_results["input-text"]) { set_alert("Insert text before submitting!", "danger"); return false; } form_data_results["text-font"] = document.querySelector( "select[name=font-text]" ).value; form_data_results["text-size"] = document.querySelector( "input[name=size-text]" ).value; form_data_results["text-color"] = hex2rgb( document.querySelector("input[name=color-text]").value ); form_data_results["text-dimensions"] = get_text_dimensions( form_data_results["input-text"], form_data_results["text-size"] ); text_buttons = document.querySelectorAll(".text-decoration-input"); text_buttons.forEach(function (btn) { if (btn.hasAttribute("checked")) { form_data_results[btn.name] = "yes"; } }); } else { file = document.querySelector("#wm-file"); if (!file.files) { set_alert("Please select an image as watermakr!", "danger"); return false; } form_data_results["file-name"] = file.files[0].name; } positions = []; p_boxes = document.querySelectorAll(".position-box"); p_boxes.forEach(function (bx) { if (bx.hasAttribute("checked")) { positions.push(bx.value); } }); if (positions.length == 0) { set_alert("Select a position for the watermark!", "danger"); return false; } form_data_results["positions"] = positions; form_data_results["opacity"] = document.querySelector( "select[name=opacity]" ).value; form_data_results["orientation"] = document.querySelector( "select[name=orientation]" ).value; return form_data_results; } function get_text_dimensions(str = "", size = false) { div = document.createElement("div"); div.style.position = "absolute"; div.style.visibility = "hidden"; div.style.height = "auto"; div.style.width = "auto"; div.style.whiteSpace = "nowrap"; div.innerHTML = str; document.body.appendChild(div); res = [div.clientWidth, div.clientHeight]; div.remove(); return res; } async function upload_files(convert = true) { loading(true); change_convert_btn(false); remove_download_btn(); let form_data = new FormData(); var file_selector = $("#file"); var selects = $("select", true); var boxes = $("input[type=checkbox]", true); idx = 0; if (file_selector.files.length == 0) { message = "Please upload files before converting!"; set_alert(message, "danger"); change_convert_btn(true); loading(false, true); return false; } if (file_selector.files.length > app.max_files) { message = "You can upload up to " + app.max_files + " files at the same time!"; set_alert(message, "danger"); change_convert_btn(true); loading(false, true); return false; } if (app.file_size > app.allowed_file_size) { message = "Your files have exceeded the allowed size of " + app.allowed_file_size + "MB!"; set_alert(message, "danger"); loading(false, true); change_convert_btn(true); return false; } if ( app.conversion_type === "image-to-pdf" || app.conversion_type == "merge-pdf" || app.conversion == "swap-pdf-pages" ) { form_data = order_file_list(); } else { for (const value of file_selector.files) { form_data.append("files_" + idx, value); ++idx; } } if (app.conversion_type === "split-pdf") { // var split_type = document.querySelectorAll(".split-type"); // var type = split_type.find(elem => elem.hasAttribtute("checked")) // form_data.append("split_type", type.id) var split_data = split_pdf_data(); if (split_data["splits"].length == 0) { set_alert( "Please make sure your resulted PDF contains at least 1 page!", "danger" ); change_convert_btn(true); loading(false, true); return false; } form_data.append("split_type", split_data["split_type"]); form_data.append("total_pdfs", split_data["total_pdfs"]); form_data.append("ranges", split_data["splits"]); form_data.append("removes", split_data["removes"]); form_data.append("has_zip", split_data["has_zip"]); // document.querySelector(".input-label").scrollIntoView() } if (app.conversion_type == "pdf-add-watermark") { data = add_watermark_data(); if (!data) { change_convert_btn(true); return false; } if (data["wm-type"] == "img-wm") { form_data.append( "watermark-image", document.querySelector("#wm-file").files[0] ); } form_data.append("pdf-options", JSON.stringify(Object.assign({}, data))); } if (app.conversion_type == "swap-pdf-pages") { data = add_swap_pdf_pages_data(); form_data.append("pdf-options", JSON.stringify(Object.assign({}, data))); } if (selects.length > 0) { selects.forEach(function (elem) { form_data.append(elem.id, elem.value); }); } if (boxes.length > 0) { boxes.forEach(function (elem) { form_data.append(elem.id, elem.value); }); } form_data.append("conversion", app.conversion_type); function failure(error) { loading(false); console.log("ERROR: " + error); } function success(response) { loading(false); if (response["Error"] !== null && response["Error"] !== undefined) { set_alert(response["Error"], "danger"); return false; } if (response["success"] !== null && response["success"] !== undefined) { conversion(response["success"]); } } if (!convert) { const upload_response = await fetch("/upload", { method: "POST", body: form_data, success: function (data) {}, }); return await upload_response.json(); } else { await fetch("/upload", { method: "POST", body: form_data, success: function (data) {}, }) .then((res) => res.json()) .then((response) => success(response)) .catch((error) => failure(error)); } } async function conversion(response) { processing(true); localStorage.setItem("order_id", response); function failure(error) { change_convert_btn(true); processing(false); console.log("ERROR: " + error); } function success(response) { change_convert_btn(true); processing(false); if (response["success"] !== null && response["success"] !== undefined) { create_download_btn(response["success"]); if (app.conversion_type == "ocr") { userOCRRequests.populate_dashboard_table(response["file"]); } } else if (response["Error"] !== null && response["Error"] !== undefined) { set_alert(response["Error"], "danger"); } } await fetch( "../conversion-api?id=" + response + "&type=" + app.conversion_type, {} ) .then((res) => res.json()) .then((response) => success(response)) .catch((error) => failure(error)); } function exploded_name(name) { var result = []; last_pos = name.lastIndexOf("."); result.push(name.slice(0, last_pos)); result.push(name.slice(last_pos + 1, name.length)); return result; } function check_types(file_input = false, allowed = []) { if (!file_input) { var file_input = document.querySelector("#file"); } if (allowed.length == 0) { allowed = app.allowed_types; } for (const value of file_input.files) { type = exploded_name(value.name)[1]; found = allowed.find((element) => element === type.toLowerCase()); if (found === null || found === undefined) { file_input.value = ""; return false; } } return true; } function remove_file_handler() { parent = this.parentElement.closest("li"); if (parent == null || parent == undefined) { parent = this.parentElement.parentElement; } var list_div = document.querySelector("#file-list-holder"); file_count = document.querySelector(".file-counter"); size_count = document.querySelector(".size-counter"); id = parent.id; parent.remove(); var file_input = document.querySelector("#file"); const dt = new DataTransfer(); app.file_size = 0; idx = 1; app.file_size = 0; for (const value of file_input.files) { // console.log(idx); if (parseInt(idx) != parseInt(id)) { dt.items.add(value); app.file_size += parseFloat((value.size / (1024 * 1024)).toFixed(2)); } else { } idx++; } file_input.files = dt.files; if (dt.files.length === 0) { list_div ? list_div.classList.add("d-none") : null; } if ( file_count !== undefined && file_count !== null && size_count !== undefined && size_count !== null ) { var file_count = document.querySelector(".file-counter"); var size_count = document.querySelector(".size-counter"); if (app.file_size <= app.allowed_file_size) { size_count.classList.remove("bg-danger"); } if (dt.files.length <= app.max_files) { file_count.classList.remove("bg-danger"); } file_count.innerHTML = dt.files.length; size_count.innerHTML = app.file_size.toFixed(2) + " MB"; } reset_list_ids(); } function replace_file_handler() { target = this; parent = this.parentElement.closest("li"); holder = target.parentElement.parentElement; replace_input = document.querySelector("#replace_file"); file_input = document.querySelector("#file"); replace_input.click(); replace_input.addEventListener("change", function () { if (replace_input.files.length > 0) { file_count = document.querySelector(".file-counter"); size_count = document.querySelector(".size-counter"); const dt = new DataTransfer(); idx = 0; id = holder.id; for (const value of file_input.files) { if (idx != id) { dt.items.add(value); } else { dt.items.add(replace_input.files[0]); } idx++; } file_input.files = dt.files; if (parent !== null && parent !== undefined) { parent.querySelector(".size-span").innerHTML = (replace_input.files[0].size / (1024 * 1024)).toFixed(2) + " MB"; } img = holder.querySelector("img"); if (img !== undefined && img !== null) { holder.querySelector("img").src = URL.createObjectURL( replace_input.files[0] ); } name_span = holder.querySelector(".image-name") || holder.querySelector(".file-name"); name_span.innerHTML = replace_input.files[0].name; obj = holder.querySelector("object"); if (obj !== undefined && obj !== null) { type = exploded_name(replace_input.files[0].name)[1].toLowerCase(); type == "jpeg" ? (type = "jpg") : null; obj.className = ""; obj.data = "../images/" + type + "-type.svg"; obj.classList.add(type + "-icon"); // obj.classList.add("file-icon", "blue"); } if ( file_count !== undefined && file_count !== null && size_count !== undefined && size_count !== null ) { idx = 0; app.file_size = 0; for (const value of file_input.files) { app.file_size += parseFloat((value.size / (1024 * 1024)).toFixed(2)); } var file_count = document.querySelector(".file-counter"); var size_count = document.querySelector(".size-counter"); if (app.file_size <= app.allowed_file_size) { size_count.classList.remove("bg-danger"); } if (dt.files.length <= app.max_files) { file_count.classList.remove("bg-danger"); } file_count.innerHTML = dt.files.length; size_count.innerHTML = app.file_size.toFixed(2) + " MB"; } } }); } function remove_file() { var close_btns = document.querySelectorAll(".delete"); close_btns.forEach(function (btn) { btn.addEventListener("click", remove_file_handler); }); } function replace_file() { replace_btns = document.querySelectorAll(".replace"); replace_btns.forEach(function (btn) { btn.addEventListener("click", replace_file_handler); }); } function reset_list_ids() { var lis = document.querySelectorAll(".name-li"); if (lis.length == 0) { lis = document.querySelectorAll(".list-image-holder"); } lis.forEach(function (element, i) { element.id = i + 1; }); } function clear_name_list() { // var list_div = document.querySelector("#file-list-holder"); // var image_div = document.querySelector("#image-list"); document.querySelector("#file-list-holder") !== null ? (list_div = document.querySelector("#file-list-holder")) : (list_div = document.querySelector("#image-list")); if (list_div !== null && list_div.querySelector("#name-list") !== null) { list_div.querySelector("#name-list").remove(); document.querySelector(".file-counter").classList.remove("bg-danger"); document.querySelector(".size-counter").classList.remove("bg-danger"); } } function names_list() { clear_name_list(); const db_text = $(".db-file-text"); db_text ? db_text.classList.add("d-none") : null; $("#tool-work-area") ? $("#tool-work-area").classList.remove("d-none") : null; var list_div = $("#file-list-holder"); list_div.classList.contains("d-none") ? list_div.classList.remove("d-none") : null; const label = $(".input-label") || $(".dashboard-ocr-label"); var file_count = $(".file-counter"); var size_count = $(".size-counter"); var file_input = $("#file"); var ul = $create("ul"); $("#file-list-holder").classList.remove("d-none"); ul.setAttribute("id", "name-list"); list_div.appendChild(ul); // ul.style.display = "none"; i = 1; app.file_size = 0; for (const value of file_input.files) { var li = $create("li"); var name_span = $create("span"); var icon = $create("object"); var right_container = $create("div"); var left_container = $create("div"); var size_span = $create("span"); var total_files_span = $create("span"); size_span.innerHTML = (value.size / (1024 * 1024)).toFixed(2) + " MB"; app.file_size += parseFloat((value.size / (1024 * 1024)).toFixed(2)); size_span.classList.add("size-span"); right_container.classList.add( "justify-content-end", "align-items-center", "d-flex" ); left_container.classList.add( "align-items-center", "d-flex", "overflow-hidden" ); type = exploded_name(value.name)[1].toLowerCase(); type == "jpeg" ? (type = "jpg") : null; icon.data = "../images/" + type + "-type.svg"; icon.classList.add(type + "-icon"); // icon.classList.add("file-icon", "blue"); li.classList.add( "text-start", "name-li", "list-group-item", "align-items-center", "d-flex", "justify-content-between" ); app.allowed_file_size > (value.size / (1024 * 1024)).toFixed(2) ? null : li.classList.add("list-group-item-danger"); li.setAttribute("id", i); left_container.appendChild(icon); left_container.appendChild(name_span); li.appendChild(left_container); name_span.classList.add("file-name"); name_span.innerHTML = value.name; var remove_icon = $create("i"); var replace_icon = $create("i"); var remove_btn = $create("button"); var replace_btn = $create("button"); remove_btn.setAttribute("title", "Remove File"); replace_btn.setAttribute("title", "Replace File"); remove_btn.classList.add( "btn", "btn-sm", "btn-danger", "p-2", "py-1", "delete" ); replace_btn.classList.add( "btn", "btn-sm", "btn-primary", "p-2", "py-1", "me-2", "replace" ); remove_icon.classList.add("fa-solid", "fa-trash-can"); replace_icon.classList.add("fa-solid", "fa-file-arrow-up"); total_files_span.innerHTML = "Pages: 1"; total_files_span.classList.add("me-2"); remove_btn.appendChild(remove_icon); replace_btn.appendChild(replace_icon); // right_container.appendChild(total_files_span); right_container.appendChild(replace_btn); right_container.appendChild(size_span); right_container.appendChild(remove_btn); li.appendChild(right_container); ul.appendChild(li); i++; } if (i > 0) { file_count.innerHTML = i; if (i > app.max_files) { file_count.classList.add("text-danger"); } else { file_count.classList.add("text-success"); } } if (app.file_size > 0) { size_count.innerHTML = app.file_size.toFixed(2) + " MB"; if (app.file_size > app.allowed_file_size) { size_count.classList.add("text-danger"); } else { size_count.classList.add("text-success"); } } ul.style.display = "block"; loading(false); change_convert_btn(true); remove_file(); replace_file(); } function swap_images() { function insertAfter(newNode, existingNode) { existingNode.parentNode.insertBefore(newNode, existingNode.nextSibling); } list_div = document.querySelector("#image-list"); list_div_rect = list_div.getBoundingClientRect(); right = document.querySelector(".right-arrow").parentElement; left = document.querySelector(".left-arrow").parentElement; right.addEventListener("click", function () { selected = document.querySelector(".selected"); selected_rect = selected.getBoundingClientRect(); if (selected !== null && selected !== undefined) { parent = selected.parentElement; parent_next_sibling = parent.nextSibling; if (parent_next_sibling !== null) { insertAfter(parent, parent_next_sibling); list_div.scrollLeft += selected_rect.width; } } else { return false; } }); left.addEventListener("click", function () { selected = document.querySelector(".selected"); selected_rect = selected.getBoundingClientRect(); if (selected !== null && selected !== undefined) { parent = selected.parentElement; list = parent.parentElement; parent_prev_sibling = parent.previousSibling; if (parent_prev_sibling !== null) { list.insertBefore(parent, parent_prev_sibling); list_div.scrollLeft = list_div.scrollLeft - selected_rect.width; } } else { return false; } }); } function select_image() { images = document.querySelectorAll(".list-image-holder"); images.forEach(function (elm) { elm.addEventListener("click", function () { if (elm.classList.contains("selected")) { elm.classList.remove("selected"); } else { found = Array.from(images).find((element) => element.classList.contains("selected") ); if (found) { found.classList.remove("selected"); } elm.classList.add("selected"); } }); }); } function images_list() { clear_name_list(); var list_div = document.querySelector("#image-list"); list_div.classList.remove("d-none"); list_div.innerHTML = ""; list_div.parentElement.parentElement.classList.remove("d-none"); var file_count = document.querySelector(".file-counter"); var file_input = document.querySelector("#file"); var ul = document.createElement("ul"); label = document.querySelector(".input-label") || document.querySelector(".small-input-label"); i = 1; for (const value of file_input.files) { var name_span = $create("span", false, ["image-name"]); var list_image_holder = $create("div", false, [ "list-image-holder", "m-2", "p-2", ]); var image_holder = $create("div", false, ["image-holder"]); var img = $create("img", false, ["list-image"]); var name_holder = $create("div", false, [ "d-flex", "justify-content-center", ]); img.src = URL.createObjectURL(value); var remove_icon = $create("i", false, ["fa-solid", "fa-trash-can"]); var replace_icon = $create("i", false, ["fa-solid", "fa-file-arrow-up"]); var remove_btn = $create("button", false, [ "btn", "btn-sm", "btn-danger", "position-absolute", "delete", ]); var replace_btn = $create("button", false, [ "btn", "btn-sm", "btn-primary", "position-absolute", "replace", ]); remove_btn.setAttribute("title", "Remove File"); replace_btn.setAttribute("title", "Replace File"); remove_btn.style.top = "10px"; remove_btn.style.right = "10px"; replace_btn.style.top = "10px"; replace_btn.style.left = "10px"; remove_btn.appendChild(remove_icon); replace_btn.appendChild(replace_icon); image_holder.appendChild(remove_btn); image_holder.appendChild(replace_btn); image_holder.appendChild(img); name_span.innerHTML = value.name; name_holder.appendChild(name_span); list_image_holder.appendChild(name_holder); list_image_holder.appendChild(image_holder); list_image_holder.setAttribute("id", i); list_image_holder.setAttribute("draggable", "false"); list_div.appendChild(list_image_holder); i++; } holders = document.querySelectorAll(".list-image-holder"); holders.forEach(function (image_holder) { image_holder.addEventListener("dragover", function (e) { base_handlers._handleDragover(e, image_holder); }); image_holder.addEventListener("dragleave", function (e) { base_handlers._handleDragleave(e, image_holder); }); image_holder.addEventListener("drop", function (e) { base_handlers._handleDrop(e, image_holder, true); }); image_holder.addEventListener("dragend", function () { image_holder.setAttribute("draggable", "false"); image_holder.classList.remove("text-dark"); image_holder.classList.remove("bg-white"); }); image_holder.addEventListener("dragstart", function (e) { base_handlers._handleDragStart(e, image_holder); }); image_holder.addEventListener("mousedown", function () { image_holder.setAttribute("draggable", "true"); // pdf.addEventListener("mousemove", pdf_handlers._handleDragMouseDown) }); }); remove_file(); replace_file(); loading(false); } function order_file_list() { var holders = document.querySelectorAll(".list-image-holder"); holders.length === 0 ? (holders = document.querySelectorAll(".page-holder")) : null; let data = new FormData(); // first_id = holders[0].id // var decrementor = 0; // first_id == 0 ? null : decrementor = 1; // var file_input = document.querySelector("#file"); for (j = 0; j < holders.length; j++) { let idx = parseInt(holders[j].id - 1); data.append("files_" + j, file_input.files[idx]); } return data; } function remove_alert() { alert_modal = document.querySelector(".alert-modal"); alert_box = alert_modal.querySelector(".tool-alert"); input_alert_box = alert_modal.querySelector(".input-alert"); alert_modal.classList.add("d-none"); if (alert_box.children.length > 1) { alert_box.children[0].remove(); } if (input_alert_box !== null && input_alert_box !== undefined) { input_alert_box.classList.add("d-none"); } } function redirect_to_dashboard() { if (window.location.href.indexOf("action=ocr") < 0) { window.location.href = "/dashboard?action=ocr"; } } function check_file_upload() { var file = document.querySelector("#file"); async function handleEvent(event) { if (event.type === "loadstart") { } if (event.type === "error") { set_alert( "Some problems encountered while loading the files! Please try again", "danger" ); } if (event.type === "loadend") { if (file.files.length > app.max_files) { set_alert( "You can upload up to " + app.max_files + " files!", "danger" ); const dt = new DataTransfer(); file.files = dt.files; return false; } if (check_types()) { clear_name_list(); label = document.querySelector(".input-label") || document.querySelector(".small-input-label"); switch (app.conversion_type) { case "image-to-pdf": images_list(); break; case "kw-check": // document.querySelector(".file-counter").innerHTML = file.files[0].name; break; case "split-pdf": await pdf_renderer.load_pdf(); await pdf_display.show(); await pdf_handlers.toggle_zip(); // break; case "pdf-add-watermark": await pdf_renderer.load_pdf(); await pdf_display.show(); add_manual_events(); break; case "merge-pdf": await pdf_display.display_all_first_page(); await pdf_display.make_replaceable(); break; case "swap-pdf-pages": await pdf_display.show_all(); await pdf_display.add_pdf_icons(); pdf_display.update_removed(); await pdf_display.make_replaceable(true); break; default: names_list(); break; } change_convert_btn(true); } else { message = "Some files are not compatible! Make sure your files are " + app.allowed_types.join(", ").toUpperCase() + "."; set_alert(message, "danger"); } } } function addListeners(reader) { reader.addEventListener("loadstart", handleEvent); reader.addEventListener("load", handleEvent); reader.addEventListener("loadend", handleEvent); reader.addEventListener("progress", handleEvent); reader.addEventListener("error", handleEvent); reader.addEventListener("abort", handleEvent); } function handleSelected(e) { // eventLog.textContent = ''; // for ( const fl of file.files ){ const reader = new FileReader(); const input_file = file.files[0]; if (input_file) { reader.readAsDataURL(input_file); addListeners(reader); } // } } if (file) { file.addEventListener("change", handleSelected); } } function toggle_sm_menu() { rotita = document.querySelector("#menu-toggle"); rotita.addEventListener("click", function () { if (rotita.previousElementSibling.classList.contains("closed-menu")) { rotita.previousElementSibling.classList.remove("closed-menu"); rotita.previousElementSibling.children[0].classList.remove("d-none"); rotita.querySelector("i").style.bottom = "130px"; rotita.querySelector("span").style.bottom = "105px"; } else { rotita.previousElementSibling.classList.add("closed-menu"); rotita.previousElementSibling.children[0].classList.add("d-none"); rotita.querySelector("i").style.bottom = "35px"; rotita.querySelector("span").style.bottom = "15px"; containers = document.querySelectorAll(".sm-menu-content-item"); document .querySelector("#small-menu-contents") .classList.contains("d-none") ? null : document .querySelector("#small-menu-contents") .classList.add("d-none"); containers.forEach(function (elem) { elem.classList.contains("d-none") ? null : elem.classList.add("d-none"); }); } }); } function split_pdf_menu() {} function pdf_watermark_menu() { rotita = document.querySelector("#menu-toggle"); small_menu = document.querySelector("#small-menu"); wm_option_btns = document.querySelectorAll(".wm-option-btn"); wm_option_btns.forEach(function (elem) { elem.addEventListener("click", _handleWmOptionSelect); }); function _handleWmOptionSelect() { opt = this.id.split("-")[1]; container = document.getElementById("wm-" + opt + "-options"); containers = document.querySelectorAll(".sm-menu-content-item"); if (container.classList.contains("d-none")) { container.classList.remove("d-none"); container.parentElement.classList.remove("d-none"); } else { container.classList.add("d-none"); container.parentElement.classList.add("d-none"); } containers.forEach(function (elem) { if (elem !== container) { elem.classList.contains("d-none") ? null : elem.classList.add("d-none"); } }); } } function toggle_help() { var help_btn = document.querySelector(".help-menu-holder"); var help_section = document.querySelector(".help-section"); var close_help = document.querySelector(".close-help-holder"); help_btn.addEventListener("click", function () { help_section.classList.contains("d-none") ? help_section.classList.remove("d-none") : help_section.classList.add("d-none"); }); close_help.addEventListener("click", function () { help_section.classList.contains("d-none") ? help_section.classList.remove("d-none") : help_section.classList.add("d-none"); }); } var pdf_renderer = { total_pages: 0, pdfDoc: null, icons: [], tool: document.querySelector(".conversion-button") ? document.querySelector(".conversion-button").id : null, //display divs pages_div_range: document.querySelector("#pdf-pages-range"), pages_div_manual: document.querySelector("#pdf-pages-manual"), pages_div_all: document.querySelector("#pdf-pages-all"), //result pdf lists manual_list: document.querySelector(".manual-list"), range_list: document.querySelector(".range-list"), all_list: document.querySelector(".all-list"), async load_pdf(file = false) { if (!file) { file_selector = document.querySelector("#file"); if (file_selector == null || file_selector == undefined) { return false; } file = file_selector.files[0]; } let pdfjsLib = window["pdfjs-dist/build/pdf"]; pdfjsLib.GlobalWorkerOptions.workerSrc = "https://cdnjs.cloudflare.com/ajax/libs/pdf.js/3.6.172/pdf.worker.min.js"; return new Promise(async (resolve, reject) => { let object = this; let file_reader = new FileReader(); file_reader.onload = async function () { // infos = JSON.parse(window.localStorage.get("uploaded_pdfs")); let total_pages; var typedarray = new Uint8Array(this.result); object.pdfDoc = pdfjsLib.getDocument(typedarray); await object.pdfDoc.promise.then((pdf_obj) => { object.total_pages = pdf_obj._pdfInfo.numPages; }); // localStorage.setItem("pdf_", total_pages); resolve(); }; await file_reader.readAsArrayBuffer(file); }); }, async render_all_first_page() { file_selector = document.querySelector("#file"); container = document.querySelector("#pdfs-preview"); container.innerHTML = ""; counter = 1; infos = []; window.localStorage.setItem("uploaded_pdfs", JSON.stringify(infos)); for (let file of file_selector.files) { await this.load_pdf(file); page = await this.render_page(1); number = page.querySelector(".page-number"); number.parentElement.classList.add("justify-content-center"); number.innerHTML = file.name; number.nextSibling.remove(); number.style.fontSize = "12px;"; page.setAttribute("id", counter); container.appendChild(page); counter++; } }, async render_page(page_nr, range_order = null) { var canvas = document.createElement("canvas"); canvas.classList.add("pdf-page-canvas"); var container = this.page_container(canvas, page_nr); range_order !== null ? container.setAttribute("id", range_order) : null; this.pdfDoc.promise .then((pdf) => { pdf .getPage(parseInt(page_nr)) .then(function (page) { var viewport = page.getViewport({ scale: 0.3 }); var output_scale = window.devicePixelRatio || 1; var context = canvas.getContext("2d"); canvas.width = Math.floor(viewport.width * output_scale); canvas.height = Math.floor(viewport.height * output_scale); // canvas.width = 150 // canvas.height = 200 // canvas.style.width = Math.floor(viewport.width) + "px"; // canvas.style.height = Math.floor(viewport.height) + "px"; canvas.style.width = "140px"; canvas.style.height = "200px"; var transform = output_scale !== 1 ? [output_scale, 0, 0, output_scale, 0, 0] : null; var renderContext = { canvasContext: context, transform: transform, viewport: viewport, }; page.render(renderContext); }) .catch((e) => { { throw new Error("no page found"); } }); }) .catch(() => { throw new Error("problems querying doc"); }); return container; }, page_container(contained, page_num, icons) { var container = document.createElement("div"); var icon_holder = document.createElement("div"); icon_holder.classList.add( "d-flex", "justify-content-end", "w-100", "align-items-center" ); var number_span = document.createElement("span"); number_span.classList.add("page-number"); number_span.innerHTML = page_num; var page_menu = document.createElement("div"); page_menu.classList.add( "pdf-page-menu", "d-flex", "align-items-center", "border-bottom", "mb-2" ); page_menu.appendChild(number_span); page_menu.appendChild(icon_holder); var page_element = document.createElement("div"); page_element.classList.add( "d-flex", "justify-content-center", "align-items-center", "h-100" ); var canvas_holder = document.createElement("div"); canvas_holder.classList.add("canvas-holder", "position-relative"); canvas_holder.appendChild(contained); page_element.appendChild(canvas_holder); container.appendChild(page_menu); container.appendChild(page_element); container.classList.add( "mx-3", "my-3", "d-flex", "flex-column", "page-holder" ); if (icons) { container.classList.add("col", "col-xl-2"); } container.setAttribute("id", page_num); return container; }, async render_range() { object = this; range_div = document.querySelector("#pdf-pages-range"); var range_holder = await this.create_range_inputs(1, 1, this.total_pages); var pages_holder = document.createElement("div"); pages_holder.classList.add( "range-pages", "d-flex", "justify-content-center" ); range_div.appendChild(range_holder); pages = await this.create_range_page_list(1); pages.forEach(function (page) { page.classList.remove("mx-3"); page.classList.remove("my-3"); page.classList.add("m-2"); pages_holder.appendChild(page); }); range_holder.appendChild(pages_holder); }, async create_range_page_list(range_index) { var result = []; var start_range = document.querySelector("#start-" + range_index); var end_range = document.querySelector("#end-" + range_index); page_1 = await this.render_page( start_range.value, "start-page-" + range_index ); page_2 = await this.render_page(end_range.value, "end-page-" + range_index); result.push(page_1); result.push(page_2); return result; }, async create_range_inputs(range_index = 0, from = 1, to = 2) { var range_holder = document.createElement("div"); range_holder.classList.add( "range-split-holder", "col", "col-lg-6", "col-xl-6", "border", "p-2", "m-2" ); range_holder.setAttribute("id", range_index); var range_menu_holder = document.createElement("div"); range_menu_holder.classList.add( "range-menu", "d-flex", "position-relative", "justify-content-center" ); var range_inputs_holder = document.createElement("div"); range_inputs_holder.classList.add("range-inputs"); range_holder.appendChild(range_menu_holder); var remove_range_icon = document.createElement("i"); remove_range_icon.classList.add( "fa-regular", "fa-circle-xmark", "range-remove-icon", "position-absolute" ); remove_range_icon.style.left = "95%"; remove_range_icon.addEventListener("click", function () { pdf_handlers.removeRangeHandler(range_holder); }); let start_range = document.createElement("input"); start_range.setAttribute("id", "start-" + range_index); start_range.addEventListener("change", function (ev) { pdf_handlers.rangeChangeHandler(ev, start_range); }); start_range.classList.add("range-input"); var to_span = document.createElement("span"); to_span.classList.add("mx-3"); to_span.innerHTML = "to"; let end_range = document.createElement("input"); end_range.setAttribute("id", "end-" + range_index); end_range.classList.add("range-input"); end_range.addEventListener("change", function (ev) { pdf_handlers.rangeChangeHandler(ev, end_range); }); range_menu_holder.appendChild(range_inputs_holder); range_inputs_holder.appendChild(start_range); range_inputs_holder.appendChild(to_span); range_inputs_holder.appendChild(end_range); range_menu_holder.appendChild(remove_range_icon); start_range.setAttribute("type", "text"); start_range.value = from; end_range.setAttribute("type", "text"); end_range.value = to; return range_holder; }, async render_manually() { pages_div_manual = document.querySelector("#pdf-pages-manual"); for (i = 1; i <= this.total_pages; i++) { container = await this.render_page(i); await pages_div_manual.appendChild(container); } }, async render_all() { var pages_div_all = document.querySelector("#pdf-pages-all"); for (j = 1; j <= this.total_pages; j++) { var container = await this.render_page(j); pages_div_all.appendChild(container); } }, async render_all_methods() { await this.render_all(); await this.render_manually(); await this.render_range(); }, }; var pdf_display = { method: document.querySelector("#method-selectors") ? document .querySelector("#method-selectors") .querySelector("input[checked]").id : "all", zip_input: document.querySelector("#zip-files"), add_range: document.querySelector("#add-range"), async show() { await pdf_renderer.load_pdf(); const bindFunc = pdf_handlers.methodSelectHandler.bind(null, null); let radios = document.querySelectorAll("input[name=split-select]"); radios.forEach(function (rad) { //clone the radio buttons to remove event listeners var new_rad = rad.cloneNode(true); rad.parentElement.replaceChild(new_rad, rad); var res_div = document.querySelector("#pdf-pages-" + rad.id); res_div.innerHTML = ""; rad.removeEventListener("click", bindFunc, true); }); await pdf_renderer.render_all_methods(); this.display_containers(); //asign the new radios to the "radios" value radios = document.querySelectorAll("input[name=split-select]"); this.method_select(); this.add_range ? this.add_range.addEventListener("click", pdf_handlers.addRangeHandler) : null; var zip_input = document.querySelector("#zip-files"); var new_zip = zip_input ? zip_input.cloneNode(true) : null; zip_input ? zip_input.parentElement.replaceChild(new_zip, zip_input) : null; // pdf_handlers.toggle_menu(); this.add_pdf_icons(); this.update_results(pdf_renderer.tool); }, display_containers(show = true) { if (show) { document.querySelector(".tool-holder").classList.remove("d-none"); document.querySelector("#tool-work-area").classList.remove("d-none"); // document.querySelector(".pdf-menu").classList.remove("d-none") // document.querySelector(".pdf-menu").previousElementSibling.classList.add("d-none") } else { tool_holder = document.querySelector(".tool-holder"); tool_wrapper = document.querySelector("#tool-work-area"); pdf_menu = document.querySelector(".pdf-menu"); if (!tool_holder.contains("d-none")) { tool_holder.classList.add("d-none"); } if (!tool_wrapper.contains("d-none")) { tool_wrapper.classList.add("d-none"); } if (!pdf_menu.contains("d-none")) { pdf_menu.classList.add("d-none"); } } }, async show_all() { document.querySelector("#pdf-pages-all").innerHTML = ""; await pdf_renderer.load_pdf(); await pdf_renderer.render_all(); this.display_containers(); // pdf_handlers.toggle_menu(); this.update_results(pdf_renderer.tool); }, async display_all_first_page() { await pdf_renderer.render_all_first_page(); this.display_containers(); // pdf_handlers.toggle_menu(); }, method_select() { radios = document.querySelectorAll("input[name=split-select]"); var pages_info = document.querySelector("#pdf-pages"); radios.forEach(function (elem) { elem.addEventListener("click", function () { pdf_handlers.methodSelectHandler(elem); }); }); }, update_results(tool) { this.update_removed(); f_name = "this." + tool.replaceAll("-", "_") + "_update"; eval(f_name + "()"); }, pdf_add_watermark_update() {}, swap_pdf_pages_update() {}, split_pdf_update() { switch (this.method) { case "manual": this.update_manual(); break; case "range": this.update_range(); break; case "all": this.update_all(); break; } }, update_manual() { // total_span = pdf counter let total_span = document.querySelector(".total-pdfs"); var manual_list = document.querySelector(".manual-list"); manual_list.classList.remove("d-none"); let pdf_list = document.querySelector(".pdf-list"); let manual_splits = document.querySelector(".manual-splits"); let removed_list = document.querySelector(".removed-pages-list"); let all_pages = pdf_renderer.pages_div_manual.querySelectorAll(".page-holder"); manual_splits.innerHTML = ""; // get all "action-points" var total_points = document.querySelectorAll(".action-point"); var totals; if (total_points.length == pdf_renderer.total_pages) { totals = pdf_renderer.total_pages; } else { totals = parseInt(total_points.length) + 1; } var first_split = total_points[0]; var last_split = total_points[total_points.length - 1]; if (last_split !== undefined) { if ( parseInt(last_split.parentElement.id) == 1 && total_points.length == 1 ) { totals = 1; } var found = Array.from(all_pages).find( (elem) => parseInt(elem.id) > parseInt(last_split.parentElement.id) && !elem.children[1].classList.contains("remove-point") ); if (!found) { totals = total_points.length; } else { totals = total_points.length + 1; } } total_span.innerHTML = totals; //get all "remove-ponits" var total_removes = Array.from( pdf_renderer.pages_div_manual.querySelectorAll(".remove-point") ); var span_holder = document.createElement("div"); span_holder.classList.add( "d-flex", "p-3", "result-pdf", "manual-split", "custom-shadow", "border", "border-1", "border-secondary" ); span_holder.setAttribute("id", "pdf-1"); //indicator = span containing pdf number var pdf_indicator = document.createElement("span"); pdf_indicator.classList.add("d-block", "split-pdf-label"); var from_span = document.createElement("span"); var to_span = document.createElement("span"); from_span.classList.add("manual-from-span", "range-span"); to_span.classList.add("manual-to-span", "range-span"); if (total_removes.length === pdf_renderer.total_pages) { manual_list.innerHTML = ""; return false; } //if there is no split point display the 1->totalpages(default range) if (total_points.length == 0) { from_span.innerHTML = "Page: " + 1; to_span.innerHTML = "Page: " + pdf_renderer.total_pages; pdf_indicator.innerHTML = "PDF - 1:"; icon = document.createElement("i"); icon.classList.add("fa-solid", "fa-ellipsis", "mx-2"); span_holder.appendChild(from_span); span_holder.appendChild(icon); span_holder.appendChild(to_span); manual_splits.appendChild(span_holder); } else { // for each split point create a from -> to section // clone from, to , holder and idincator nodes from above for (i = 0; i <= total_points.length; i++) { var indicator = pdf_indicator.cloneNode(); indicator.classList.add("d-block"); var holder = span_holder.cloneNode(); holder.classList.add("manual-split"); holder.setAttribute("id", "pdf-" + (i + 1)); //page number on current action-point var page_num; var from = from_span.cloneNode(); var to = to_span.cloneNode(); from.classList.add("manual-from-span", "range-span"); to.classList.add("manual-to-span", "range-span"); //when i == length there is no split point on that position if (i == total_points.length) { page_num = total_points[i - 1].parentElement.id; // if the last point is not on the last page make another from -> to section if (parseInt(page_num) !== pdf_renderer.total_pages) { to.innerHTML = "Page: " + pdf_renderer.total_pages; //last split point + 1 from.innerHTML = "Page: " + (parseInt(total_points[i - 1].parentElement.id) + 1); indicator.innerHTML = "PDF - " + (i + 1) + ":"; holder.appendChild(from); icon = document.createElement("i"); icon.classList.add("fa-solid", "fa-ellipsis", "mx-2"); holder.appendChild(icon); holder.appendChild(to); manual_splits.appendChild(holder); } } else { page_num = total_points[i].parentElement.id; to.innerHTML = "Page: " + page_num; if (i > 0) { from.innerHTML = "Page: " + (parseInt(total_points[i - 1].parentElement.id) + 1); } else { from.innerHTML = "Page: " + 1; } var from_point = parseInt(from.innerHTML.split(":")[1]); var from_res = from_point; indicator.innerHTML = "PDF - " + (i + 1) + ":"; holder.appendChild(from); icon = document.createElement("i"); icon.classList.add("fa-solid", "fa-ellipsis", "mx-2"); holder.appendChild(icon); holder.appendChild(to); manual_splits.appendChild(holder); } } } // check if there is a removed page in bewtween from and to var result_pdfs = document.querySelectorAll(".result-pdf"); var removed = document.querySelectorAll(".remove-point"); if (total_removes.length > 0) { //loop through each range and modify "from" point result_pdfs.forEach(function (elem) { let first_none_remove = false; var from_point = parseInt(elem.children[0].innerHTML.split(":")[1]); var to_point = parseInt(elem.children[2].innerHTML.split(":")[1]); //loop through each page for (j = from_point; j <= to_point; j++) { var page = document.getElementById(j); // find the first page in range that is not to be removed if ( !page.children[1].classList.contains("remove-point") && !first_none_remove ) { first_none_remove = true; elem.children[0].innerHTML = "Page: " + parseInt(page.id); } } // modify "to" point for last range || default range if (elem == result_pdfs[result_pdfs.length - 1]) { var aux = 0; var page_number = parseInt( total_removes[total_removes.length - 1].parentElement.id ); //check if the removed page is last by checking the page number + aux = number of total pages while (page_number + aux == pdf_renderer.total_pages) { total_removes.pop(); if (total_removes.length > 0) { page_number = parseInt( total_removes[total_removes.length - 1].parentElement.id ); } else { page_number = pdf_renderer.total_pages + 1; } aux++; } // if all pages are marked to be removed, remove the "result_pdf" element from page if ( parseInt(pdf_renderer.total_pages - aux) < parseInt(elem.children[0].innerHTML.split(":")[1]) ) { elem.remove(); } else { elem.children[2].innerHTML = "Page: " + (pdf_renderer.total_pages - aux); } } }); } }, update_all() { let total_span = document.querySelector(".total-pdfs"); var all_list = document.querySelector(".all-list"); all_list.innerHTML = ""; var all = pdf_renderer.pages_div_all.querySelectorAll(".page-holder"); var removed = pdf_renderer.pages_div_all.querySelectorAll(".remove-point"); removed == null ? (aux = 0) : (aux = removed.length); total_span.innerHTML = parseInt(all.length) - parseInt(aux); var counter = 0; for (i = 0; i < all.length; i++) { if (all[i].children[1].classList.contains("remove-point")) { counter++; continue; } var span_holder = document.createElement("div"); span_holder.classList.add( "d-flex", "p-3", "custom-shadow", "border", "border-secondary", "result-pdf", "all-split" ); span_holder.setAttribute("id", "pdf-" + (i + 1)); //indicator = span containing pdf number var pdf_indicator = document.createElement("span"); pdf_indicator.classList.add("d-block", "split-pdf-label"); pdf_indicator.innerHTML = "PDF - " + (i + 1 - counter) + ":"; var from_span = document.createElement("span"); var to_span = document.createElement("span"); from_span.innerHTML = "Page: " + (i + 1); to_span.innerHTML = "Page: " + (i + 1); from_span.classList.add("all-from-span", "range-span"); to_span.classList.add("all-to-span", "range-span"); span_holder.appendChild(from_span); icon = document.createElement("i"); icon.classList.add("fa-solid", "fa-ellipsis", "mx-2"); span_holder.appendChild(icon); span_holder.appendChild(to_span); all_list.appendChild(span_holder); } }, update_range() { let total_span = document.querySelector(".total-pdfs"); // document.querySelector(".total-removes").innerHTML = 0; var ranges = document.querySelectorAll(".range-split-holder"); total_span.innerHTML = ranges.length; var range_list = document.querySelector(".range-list"); range_list.innerHTML = ""; ranges.forEach(function (elem, idx) { var range_from = elem.querySelector("#start-" + (idx + 1)); var range_to = elem.querySelector("#end-" + (idx + 1)); var span_holder = document.createElement("div"); span_holder.classList.add( "d-flex", "p-3", "custom-shadow", "border", "border-secondary", "result-pdf", "range-split" ); span_holder.setAttribute("id", "pdf-" + (idx + 1)); //indicator = span containing pdf number var pdf_indicator = document.createElement("span"); pdf_indicator.classList.add("d-block", "split-pdf-label"); pdf_indicator.innerHTML = "PDF - " + (idx + 1) + ":"; var from_span = document.createElement("span"); var to_span = document.createElement("span"); from_span.innerHTML = "Page: " + range_from.value; to_span.innerHTML = "Page: " + range_to.value; from_span.classList.add("range-from-span", "range-span"); to_span.classList.add("range-to-span", "range-span"); span_holder.appendChild(from_span); icon = document.createElement("i"); icon.classList.add("fa-solid", "fa-ellipsis", "mx-2"); span_holder.appendChild(icon); span_holder.appendChild(to_span); range_list.appendChild(span_holder); }); }, update_removed() { var total_removed_span = document.querySelector(".total-removes"); switch (this.method) { case "manual": //add a span containing removed page number to the "removed pages" list var remove_points = pdf_renderer.pages_div_manual.querySelectorAll(".remove-point"); var removed_list = document.querySelector(".removed-pages-list"); removed_list.innerHTML = ""; remove_points.forEach(function (elem) { var remove_span = document.createElement("span"); remove_span.classList.add( "form-control", "form-control-sm", "manual-remove", "bg-danger" ); remove_span.setAttribute( "id", "remove-page-" + elem.parentElement.id ); remove_span.innerHTML = elem.parentElement.id; removed_list.appendChild(remove_span); }); total_removed_span.innerHTML = remove_points.length; break; case "range": break; case "all": //add a span containing removed page number to the "removed pages" list var remove_points = pdf_renderer.pages_div_all.querySelectorAll(".remove-point"); var removed_list = document.querySelector(".removed-pages-list"); var all_list = document.querySelector(".all-list"); removed_list.innerHTML = ""; remove_points.forEach(function (elem, idx) { var remove_span = document.createElement("span"); remove_span.classList.add( "form-control", "form-control-sm", "manual-remove", "bg-danger" ); remove_span.setAttribute( "id", "remove-page-" + elem.parentElement.id ); remove_span.innerHTML = elem.parentElement.id; removed_list.appendChild(remove_span); //remove the result pdf from the list var list_item = all_list ? all_list.querySelector("#pdf-" + elem.parentElement.id) : null; list_item !== null ? list_item.remove() : null; }); total_removed_span.innerHTML = remove_points.length; break; } }, add_pdf_icons() { manual_icons = ""; manual_remove_icon = false; switch (pdf_renderer.tool) { case "split-pdf": manual_icons = ["fa-solid", "fa-flag"]; manual_remove_icon = true; // icons.push(manual_icons) // icons.push(["fa-regular fa-circle-xmark "]); break; case "pdf-add-watermark": manual_icons = ["fa-solid", "fa-flag"]; break; } man_pages = pdf_renderer.pages_div_manual ? pdf_renderer.pages_div_manual.querySelectorAll(".page-holder") : []; all_pages = pdf_renderer.pages_div_all ? pdf_renderer.pages_div_all.querySelectorAll(".page-holder") : []; all_pages.forEach(function (page) { icons_container = page.querySelector(".pdf-page-menu").children[1]; var icon_remove = document.createElement("i"); icon_remove.classList.add("fa-regular", "fa-circle-xmark", "remove-icon"); icon_remove.addEventListener("click", function () { pdf_handlers.pageIconHandler(icon_remove, "remove"); }); var remove_holder = document.createElement("div"); remove_holder.classList.add("remove-icon-holder", "float-end"); remove_holder.appendChild(icon_remove, "remove"); icons_container.appendChild(remove_holder); }); man_pages.forEach(function (page) { icons_container = page.querySelector(".pdf-page-menu").children[1]; var icon_remove = document.createElement("i"); var action_icon = document.createElement("i"); action_icon.classList.add( manual_icons[0], manual_icons[1], "split-icon", "action-icon" ); action_icon.addEventListener("click", function () { pdf_handlers.pageIconHandler(action_icon, "action"); }); var action_holder = document.createElement("div"); action_holder.classList.add("split-icon-holder", "float-end", "me-2"); action_holder.appendChild(action_icon); icons_container.appendChild(action_holder); if (manual_remove_icon) { icon_remove.classList.add( "fa-regular", "fa-circle-xmark", "remove-icon" ); icon_remove.addEventListener("click", function () { pdf_handlers.pageIconHandler(icon_remove, "remove"); }); var remove_holder = document.createElement("div"); remove_holder.classList.add("remove-icon-holder", "float-end"); remove_holder.appendChild(icon_remove, "remove"); icons_container.appendChild(remove_holder); } }); }, make_replaceable(replace = false) { //based on replace value the dragged objects will push on drop the other elements to the right or left depending // on the direction it is dragged. If push == true the dropped objects will replace the elements on drop. pdfs = document.querySelectorAll(".page-holder"); pdfs.length = 0 ? (pdfs = document.querySelectorAll(".list-image-holder")) : null; pdfs.forEach(function (pdf) { pdf.classList.add("position-relative"); pdf.querySelector(".page-number").style.userSelect = "none"; pdf.setAttribute("draggable", "false"); // pdf.style.zIndex = "9999" pdf_rect = pdf.getBoundingClientRect(); window.localStorage.setItem("pdf-" + pdf.id, JSON.stringify(pdf_rect)); pdf.addEventListener("dragover", function (e) { pdf_handlers._handlePDFDragover(e, pdf); }); pdf.addEventListener("dragleave", function (e) { pdf_handlers._handlePDFDragleave(e, pdf); }); pdf.addEventListener("drop", function (e) { pdf_handlers._handlePDFDrop(e, pdf, replace); }); pdf.addEventListener("dragend", function () { pdf.setAttribute("draggable", "false"); pdf.classList.remove("text-dark"); pdf.classList.remove("bg-white"); }); pdf.addEventListener("dragstart", function (e) { pdf_handlers._handlePDFStart(e, pdf); }); pdf.addEventListener("mousedown", function () { pdf.setAttribute("draggable", "true"); // pdf.addEventListener("mousemove", pdf_handlers._handleDragMouseDown) }); pdf.addEventListener("mouseup", () => { // pdf.removeEventListener("mousemove", pdf_handlers._handleDragMouseDown); }); }); }, }; var pdf_handlers = { tool: document.querySelector(".conversion-button") ? document.querySelector(".conversion-button").id : null, _handlePDFDrop(e, pdf, replace) { parent = pdf.parentElement; pdf.classList.remove("bg-white"); pdf.classList.remove("text-dark"); pdf.classList.remove("border-danger"); dragged = document.getElementById(window.localStorage.getItem("dragged")); zone_box = pdf.getBoundingClientRect(); dragged_box = dragged.getBoundingClientRect(); // if( zone_box["top"] > dragged_box["bottom"] ){ // if( zone_box["right"] > dragged_box["right"] ){ // this.after(dragged) // }else{ // parent.insertBefore(dragged, this) // } // } // // if( zone_box["top"] > dragged_box["bottom"] ){ // if( zone_box["right"] > dragged_box["right"] ){ // this.after(dragged) // }else{ // parent.insertBefore(dragged, this) // } // } // if( zone_box["top"] == dragged_box["top"] ){ if (!replace) { if (zone_box["right"] > dragged_box["right"]) { pdf.after(dragged); } else { parent.insertBefore(dragged, pdf); } } else { cloned = pdf.cloneNode(true); all_holders = document.querySelectorAll(".page-holder"); dragged_ind = Array.from(all_holders).indexOf(dragged); pdf.replaceWith(dragged); parent.insertBefore(pdf, parent.children[dragged_ind]); } // } dragged.classList.remove("text-dark"); dragged.classList.remove("bg-white"); dragged.style.borderColor = "white"; // }, _handleDragMouseDown({ movementX, movementY }) { pdf = this; original_rect = JSON.parse(window.localStorage.getItem("pdf-" + pdf.id)); parent = pdf.parentElement; pdf_rect = pdf.getBoundingClientRect(); parent_rect = parent.getBoundingClientRect(); if ( pdf_rect["bottom"] > parent_rect["bottom"] || pdf_rect["top"] < parent_rect["top"] || pdf_rect["right"] > parent_rect["right"] || pdf_rect["left"] < parent_rect["left"] ) { pdf.style.left = 0; pdf.style.top = 0; pdf.style.transition = "none"; return false; } let getContainerStyle = window.getComputedStyle(pdf); let leftValue = parseInt(getContainerStyle.left); let topValue = parseInt(getContainerStyle.top); pdf.style.left = leftValue + movementX + "px"; pdf.style.top = topValue + movementY + "px"; }, _handlePDFStart(e, pdf) { window.localStorage.setItem("dragged", pdf.id); pdf.style.borderColor = "red"; pdf.classList.add("text-dark", "bg-white"); }, _handlePDFDragleave(e, pdf) { if (pdf.getAttribute("draggable") == "false") { pdf.classList.remove("border-danger"); pdf.classList.remove("bg-white"); pdf.classList.remove("text-dark"); } }, _handlePDFDragover(e, pdf) { e.preventDefault(); target = e.target; if (pdf.getAttribute("draggable") == "false") { pdf.classList.add("border-danger", "bg-white", "text-dark"); } }, closeDragElement() { // stop moving when mouse button is released: document.onmouseup = null; document.onmousemove = null; }, elementDrag(e) { e = e || window.event; e.preventDefault(); // calculate the new cursor position: pos1 = pos3 - e.clientX; pos2 = pos4 - e.clientY; pos3 = e.clientX; pos4 = e.clientY; // set the element's new position: }, methodSelectHandler(elem) { let total_span = document.querySelector(".total-pdfs"); let manual_help = document.querySelector("#help-manual"); let range_help = document.querySelector("#help-range"); let all_help = document.querySelector("#help-all"); var removed_pages_list = document.querySelector(".removed-pages-list"); if (!elem.hasAttribute("checked")) { radios.forEach(function (rd) { if (rd.hasAttribute("checked")) { rd.removeAttribute("checked"); } }); elem.setAttribute("checked", "checked"); pdf_display.method = elem.id; methods = ["manual", "range", "all"]; list = document.querySelector("." + pdf_display.method + "-list"); list ? list.classList.remove("d-none") : null; pages_div = document.querySelector("#pdf-pages-" + elem.id); pages_div.classList.remove("d-none"); if (pdf_display.method !== "range") { pdf_display.add_range.classList.add("d-none"); pdf_display.add_range.setAttribute("disabled", "disabled"); } else { pdf_display.add_range.classList.remove("d-none"); pdf_display.add_range.removeAttribute("disabled"); } methods.forEach(function (type) { if (type !== pdf_display.method) { list = document.querySelector("." + type + "-list"); list ? !list.classList.contains("d-none") ? list.classList.add("d-none") : null : null; page_div = document.querySelector("#pdf-pages-" + type); page_div ? !page_div.classList.contains("d-none") ? page_div.classList.add("d-none") : null : null; help = document.querySelector("#help-" + type); // console.log(help) help ? !help.classList.contains("d-none") ? help.classList.add("d-none") : null : null; } }); help = document.querySelector("#help-" + pdf_display.method); help ? help.classList.contains("d-none") ? help.classList.remove("d-none") : null : null; // removed_pages_list.innerHTML = "" } pdf_display.update_results(this.tool); }, async addRangeHandler(ev) { ev.preventDefault(); var total_ranges = document.querySelectorAll(".range-split-holder"); holder = await pdf_renderer.create_range_inputs( total_ranges.length + 1, 1, pdf_renderer.total_pages ); pdf_renderer.pages_div_range.appendChild(holder); var range_pages = await pdf_renderer.create_range_page_list( total_ranges.length + 1 ); var pages_holder = document.createElement("div"); pages_holder.classList.add( "range-pages", "d-flex", "justify-content-center" ); range_pages.forEach(function (page) { page.classList.remove("mx-3"); page.classList.remove("my-3"); page.classList.add("m-2"); pages_holder.appendChild(page); }); holder.appendChild(pages_holder); pdf_display.update_results(pdf_renderer.tool); }, async rangeChangeHandler(ev, range_input) { var old_page; var new_page; var range_index = parseInt( range_input.parentElement.parentElement.parentElement.id ); //check if input is non-numeric if (!Number.isInteger(parseInt(range_input.value))) { if (range_input.id.includes("start")) { range_input.value = 1; } else { range_input.value = pdf_renderer.total_pages; } //check if input is negtaive or above total files } else { if (range_input.id.includes("start") && parseInt(range_input.value) < 1) { range_input.value = 1; } if ( range_input.id.includes("start") && parseInt(range_input.value) > pdf_renderer.total_pages ) { range_input.value = 1; } if ( range_input.id.includes("end") && parseInt(range_input.value) > pdf_renderer.total_pages ) { range_input.value = pdf_renderer.total_pages; } if (range_input.id.includes("end") && parseInt(range_input.value) < 1) { range_input.value = pdf_renderer.total_pages; } } if (ev.srcElement.id.includes("start")) { old_page = document.querySelector("#start-page-" + range_index); try { new_page = await pdf_renderer.render_page( ev.srcElement.value, "start-page-" + range_index ); } catch (e) { console.log("yeee"); } } else { old_page = document.querySelector("#end-page-" + range_index); new_page = await pdf_renderer.render_page( ev.srcElement.value, "end-page-" + range_index ); } new_page.classList.remove("mx-3"); new_page.classList.remove("my-3"); new_page.classList.add("m-2"); old_page.parentElement.replaceChild(new_page, old_page); pdf_display.update_results(pdf_renderer.tool); }, toggle_menu() { var button = document.querySelector(".toggle-menu"); var menu = document.querySelector(".main-menu"); var selectors = document.querySelector("#method-selectors"); var results = document.querySelector(".split-results"); var removed = document.querySelector(".removed-pages"); button.addEventListener("click", function () { if (button.classList.contains("fa-chevron-right")) { button.parentElement.parentElement.classList.add("hide-menu"); // button.parentElement.classList.remove("close-menu-holder") // button.parentElement.classList.add("open-menu-holder") menu.classList.add("d-none"); button.classList.remove("fa-chevron-right"); button.classList.add("fa-chevron-left"); document.querySelector(".help-section").classList.add("d-none"); } else { menu.classList.remove("d-none"); // button.parentElement.classList.add("close-menu-holder") // button.parentElement.classList.remove("open-menu-holder") button.parentElement.parentElement.classList.remove("hide-menu", "p-3"); button.classList.add("fa-chevron-right"); button.classList.remove("fa-chevron-left"); } }); pdf_handlers.toggle_zip(); }, toggle_zip() { var inpt = document.querySelector("#zip-files"); if (!inpt) { return false; } inpt.addEventListener("click", function () { inpt.hasAttribute("checked") ? inpt.removeAttribute("checked") : inpt.setAttribute("checked", "checked"); }); }, removeRangeHandler(holder) { holder.remove(); document .querySelectorAll(".range-split-holder") .forEach(function (elem, idx) { elem.setAttribute("id", idx + 1); elem.children[1].children[0].setAttribute( "id", "start-page-" + (idx + 1) ); elem.children[1].children[1].setAttribute( "id", "end-page-" + (idx + 1) ); elem.children[0].children[0].children[0].setAttribute( "id", "start-" + (idx + 1) ); elem.children[0].children[0].children[2].setAttribute( "id", "end-" + (idx + 1) ); }); pdf_display.update_results(pdf_renderer.tool); }, pageIconHandler(icon, type) { var icon_attribute; var canvas_div = icon.parentElement.parentElement.parentElement.nextSibling; var page_div = icon.parentElement.parentElement.parentElement.parentElement; var removed_list = document.querySelector(".removed-pages-list"); switch (type) { case "action": icon_attribute = "action"; canvas_div.classList.remove("remove-point"); break; case "remove": icon_attribute = "remove"; canvas_div.classList.remove("action-point"); break; } if (!canvas_div.classList.contains(icon_attribute + "-point")) { canvas_div.classList.add(icon_attribute + "-point"); } else { canvas_div.classList.remove(icon_attribute + "-point"); if (type == "remove") { // document.querySelector("#remove-page-" + page_div.id).remove() } } pdf_display.update_results(pdf_renderer.tool); }, }; var base_handlers = { _handleDragStart(e, pdf) { window.localStorage.setItem("dragged", pdf.id); pdf.style.borderColor = "red"; pdf.classList.add("text-dark", "bg-white"); }, _handleDragleave(e, pdf) { if (pdf.getAttribute("draggable") == "false") { pdf.classList.remove("border-danger"); pdf.classList.remove("bg-dark"); pdf.classList.remove("text-dark"); } }, _handleDragover(e, pdf) { e.preventDefault(); target = e.target; if (pdf.getAttribute("draggable") == "false") { pdf.classList.add("border-danger", "bg-dark", "text-dark"); } }, _handleDrop(e, pdf, replace) { parent = pdf.parentElement; pdf.classList.remove("bg-dark"); pdf.classList.remove("text-dark"); pdf.classList.remove("border-danger"); // pdf.classList.add("border-dark") dragged = document.getElementById(window.localStorage.getItem("dragged")); zone_box = pdf.getBoundingClientRect(); dragged_box = dragged.getBoundingClientRect(); if (!replace) { if (zone_box["right"] > dragged_box["right"]) { pdf.after(dragged); } else { parent.insertBefore(dragged, pdf); } } else { cloned = pdf.cloneNode(true); all_holders = document.querySelectorAll(".list-image-holder"); dragged_ind = Array.from(all_holders).indexOf(dragged); pdf.replaceWith(dragged); parent.insertBefore(pdf, parent.children[dragged_ind]); } dragged.classList.remove("text-dark"); dragged.classList.remove("bg-white"); dragged.style.borderColor = "white"; }, }; function add_position_events() { boxes = document.querySelectorAll(".position-box"); boxes.forEach(function (box) { box.addEventListener("click", _handleSelectPosition); }); } function add_manual_events() { icons = document.querySelectorAll(".action-icon"); icons.forEach(function (i) { new_i = i.cloneNode(true); i.parentElement.appendChild(new_i); i.remove(); new_i.addEventListener("click", _handleManualWatermark); }); text_buttons = document.querySelectorAll(".text-decoration-input"); text_buttons.forEach(function (btn) { btn.addEventListener("click", _handleTextDecorationButton); }); watermark_type_selects = document.querySelectorAll(".watermark-type-select"); watermark_type_selects.forEach(function (elem) { elem.addEventListener("click", _handleChangeWmType); }); range = document.querySelector("input[name=range-size]"); inpt = document.querySelector("input[name=size-text]"); inpt.addEventListener("input", _handleTextSizeInput); range.addEventListener("input", _handleTextSizeRange); file = document.querySelector("#wm-file"); file.addEventListener("change", _handleAddWmImage); } function _handleAddWmImage() { if (!check_types(this, ["jpg", "jpeg", "png"])) { this.value = ""; set_alert("Please select a JPG, JPEG or PNG image!", "danger"); } } function _handleChangeWmType() { if (!this.classList.contains("selected-watermark")) { sibling = this.nextElementSibling || this.previousElementSibling; sibling.classList.remove("selected-watermark"); document .querySelector("#watermark-" + this.id.split("-")[0] + "-options") .classList.remove("d-none"); document .querySelector("#watermark-" + sibling.id.split("-")[0] + "-options") .classList.add("d-none"); this.classList.add("selected-watermark"); } } function _handleTextSizeRange() { document.querySelector("input[name=size-text]").value = this.value; } function _handleTextSizeInput() { if (this.value < 0) { this.value = 0; return false; } document.querySelector("input[name=range-size]").value = this.value; } function _handleTextDecorationButton() { btn = this; if (btn.hasAttribute("checked")) { btn.removeAttribute("checked"); btn.classList.remove("btn-secondary"); btn.classList.add("btn-outline-secondary"); } else { btn.classList.remove("btn-outline-secondary"); btn.classList.add("btn-secondary"); btn.setAttribute("checked", "checked"); } } function _handleManualWatermark() { icon = this; element_holder = this.parentElement.parentElement.parentElement.nextSibling.children[0]; boxes = document.querySelectorAll(".position-box"); if (element_holder.classList.contains("watermarked")) { element_holder.classList.remove("watermarked"); boxes.forEach(function (box) { mark = element_holder.querySelector("." + box.value); mark ? mark.remove() : null; }); } else { element_holder.classList.add("watermarked"); boxes.forEach(function (box) { if (box.hasAttribute("checked")) { display_mark(element_holder, box.value); } }); } } function _handleSelectPosition() { inpt = this; pages_container_all = document.querySelector("#pdf-pages-all"); pages_container_manual = document.querySelector("#pdf-pages-manual"); all_holders = pages_container_all.querySelectorAll(".canvas-holder"); manual_holders = pages_container_manual.querySelectorAll(".watermarked"); holders = Array.from(all_holders).concat(Array.from(manual_holders)); if (inpt.hasAttribute("checked")) { inpt.removeAttribute("checked"); holders.forEach(function (holder) { mark = holder.querySelector("." + inpt.value); mark ? mark.remove() : null; }); } else { inpt.setAttribute("checked", "checked"); holders.forEach(function (holder) { display_mark(holder, inpt.value); }); } } function display_mark(holder, placement) { mark = document.createElement("i"); mark.classList.add( "fa-regular", "fa-circle-dot", "position-absolute", placement ); mark.style.height = "20px"; mark.style.width = "20px"; mark.style.color = "red"; copy = holder.cloneNode(true); copy.classList.remove("position-relative"); copy.classList.add("position-absolute"); copy.style.display = "block"; copy.style.top = "-100000"; copy.style.left = "-100000"; copy.style.visibility = "hidden"; document.body.appendChild(copy); c_height = parseInt(copy.offsetHeight); c_width = parseInt(copy.offsetWidth); copy.remove(); switch (placement) { case "north-west": mark.style.top = "6px"; mark.style.left = "6px"; break; case "north": mark.style.top = "6px"; mark.style.left = c_width / 2 - 10 + "px"; break; case "north-east": mark.style.top = "6px"; mark.style.right = "6px"; break; case "west": mark.style.top = c_height / 2 - 15 + "px"; mark.style.left = "6px"; break; case "center": mark.style.top = c_height / 2 - 15 + "px"; mark.style.left = c_width / 2 - 10 + "px"; break; case "east": mark.style.top = c_height / 2 - 15 + "px"; mark.style.right = "6px"; break; case "south-west": mark.style.left = "6px"; mark.style.bottom = "16px"; break; case "south": mark.style.bottom = "16px"; mark.style.left = c_width / 2 - 10 + "px"; break; case "south-east": mark.style.right = "6px"; mark.style.bottom = "16px"; break; } holder.appendChild(mark); } function clear_file_info(file_counter = null, size_counter = null) { file_counter === null ? (file_counter = document.querySelector(".file-counter")) : null; size_counter === null ? (size_counter = document.querySelector(".size-counter")) : null; if (file_counter) { file_counter.innerHTML = ""; file_counter.classList.add("d-none"); } if (size_counter) { size_counter.innerHTML = ""; size_counter.classList.add("d-none"); } } function loading(visible, hide_after_done = false) { var loading_box = document.getElementById("loading"); if (loading_box !== null && loading_box !== undefined) { if (visible) { loading_box.parentElement.classList.contains("hidden") ? loading_box.parentElement.classList.remove("hidden") : null; loading_box.parentElement.parentElement.classList.contains("hidden") ? loading_box.parentElement.parentElement.classList.remove("hidden") : null; loading_box.classList.remove("hidden"); // document.querySelector("#upload_text").setAttribute("hidden", "true"); } else { !loading_box.parentElement.classList.contains("hidden") ? loading_box.parentElement.classList.add("hidden") : null; if (hide_after_done) { !loading_box.parentElement.parentElement.classList.contains("hidden") ? loading_box.parentElement.parentElement.classList.add("hidden") : null; } loading_box.classList.add("hidden"); } } } function processing(visible, hide_after_done = false) { var loading_box = document.getElementById("processing"); if (loading_box !== null && loading_box !== undefined) { if (visible) { loading_box.parentElement.classList.contains("hidden") ? loading_box.parentElement.classList.remove("hidden") : null; loading_box.parentElement.parentElement.classList.contains("hidden") ? loading_box.parentElement.parentElement.classList.remove("hidden") : null; loading_box.classList.remove("hidden"); // document.querySelector("#upload_text").setAttribute("hidden", "true"); } else { !loading_box.parentElement.classList.contains("hidden") ? loading_box.parentElement.classList.add("hidden") : null; if (hide_after_done) { !loading_box.parentElement.parentElement.classList.contains("hidden") ? loading_box.parentElement.parentElement.classList.add("hidden") : null; } loading_box.classList.add("hidden"); } } } function window_close() { window.onbeforeunload = function () { return "Are you sure"; }; } function load_analitics() { var include_tag = document.createElement("script"); include_tag.src = "https://googletagmanager.com/gtag/js?id=G-JMJ9E5GWL9"; document.getElementsByTagName("head")[0].appendChild(include_tag); var script_tag = document.createElement("script"); script_tag.setAttribute("async", "async"); script_tag.innerHTML = "window.dataLayer = window.dataLayer || [];\n function gtag(){dataLayer.push(arguments);}\n gtag('js', new Date());\n gtag('config', 'G-JMJ9E5GWL9');"; document.getElementsByTagName("head")[0].appendChild(script_tag); } function load_pdfjs() { var pdf_min = document.createElement("script"); var pdf_viewer = document.createElement("link"); pdf_min.src = "https://cdn.jsdelivr.net/npm/pdfjs-dist@3.6.172/build/pdf.min.js"; pdf_viewer.href = "https://cdn.jsdelivr.net/npm/pdfjs-dist@3.6.172/web/pdf_viewer.min.css"; document.getElementsByTagName("head")[0].appendChild(pdf_min); document.getElementsByTagName("head")[0].appendChild(pdf_viewer); } function create_download_btn(url = "") { var button_holder = $create("div"); var main_parent = $(".conversion-tab") || $("#results") || $("#download-section"); main_parent.style.display = "none" ? (main_parent.style.display = "block") : null; if ( app.conversion_type == "split-pdf" || app.conversion_type == "ocr" || app.conversion_type == "pdf-add-watermark" || app.conversion_type == "merge-pdf" || app.conversion_type == "swap-pdf-pages" ) { main_parent = $("#download-section"); main_parent.classList.remove("d-none"); } if ($("div[id=button-holder]") !== null) { $("div[id=button-holder]").remove(); } var btn = $create("a"); btn.setAttribute("id", "download"); var lable = $create("lable"); button_holder.setAttribute("id", "button-holder"); if (isValidUrl(url)) { fetch(url, { method: "get", mode: "no-cors", referrerPolicy: "no-referrer", }) .then((res) => res.blob()) .then((res) => { btn.setAttribute("download", "dailyocr-file"); const href = URL.createObjectURL(res); btn.href = href; btn.setAttribute("target", "_blank"); // btn.click(); }); } else { btn.target = "_blank"; btn.setAttribute("href", url); } btn.style.textDecoration = "none"; if ( app.conversion_type == "pdf-to-image" || app.conversion_type == "split-pdf" ) { button_holder.classList.add("form-group", "text-center", "m-auto", "w-100"); btn.classList.add("btn-sample", "form-control", "text-center", "m-auto"); btn.innerHTML = "Download"; } else { btn.classList.add("text-center", "m-auto"); btn.innerHTML = url; button_holder.classList.add("text-center", "m-auto", "text-break"); button_holder.style.maxWidth = "100%"; } button_holder.appendChild(btn); main_parent.appendChild(button_holder); // main_parent.scrollIntoView() processing(false); } async function multiple_download_links(urls) { var button_holder = document.createElement("div"); var main_parent = document.querySelector("#results-wrapper"); button_holder.classList.add( "text-center", "m-auto", "text-break", "w-100", "mb-2", "basic-download-link" ); counter = 0; for (url of urls) { var btn = document.createElement("a"); btn.style.fontSize = "18px"; btn.classList.add("text-center", "m-auto", "d-block"); btn.innerHTML = url; await fetch(url, { method: "get", mode: "no-cors", referrerPolicy: "no-referrer", }) .then((res) => res.blob()) .then((res) => { btn.setAttribute("download", "dailyocr-file-" + counter); const href = URL.createObjectURL(res); btn.href = href; btn.setAttribute("target", "_blank"); }); button_holder.appendChild(btn); counter++; } main_parent.appendChild(button_holder); } function remove_download_btn() { var btn = document.querySelector("#button-holder"); if (btn !== null && btn !== undefined) { btn.remove(); } } function enable_convert_button() { btn = $(".conversion-button"); btn.hasAttribute("hidden") ? btn.removeAttribute("hidden") : null; btn.removeAttribute("disabled"); } function disable_convert_button() { btn = $(".conversion-button"); btn.setAttribute("disabled", "disabled"); } function active_link() { var links_elements = document.querySelectorAll(".nav-link"); Array.from(links_elements).find(function (link) { // console.log( link.href ); if (link.href === window.location.href) { link.classList.add("active", "fw-bold"); } }); } function isEmpty(obj) { return Object.keys(obj).length === 0; } // function user_request(){ // let buttons = document.querySelectorAll("button"); // buttons.forEach(function(btn){ // btn.addEventListener("click", function(){ // // var inputs = {}; // if( this.id = "submit_log_in"){ // var name = document.querySelector("#user_name").value; // var pwd = document.querySelector("#password").value; // } // // let request_type = this.id; // let xml = new XMLHttpRequest(); // xml.onreadystatechange = function(){ // if( this.readyState == 4 && this.status == 200){ // if(this.response){ // // } // } // } // xml.open("POST","user_request.php?request_type=" + request_type); // xml.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); // xml.send("isus=cristos"); // }) // }) // } function landing_upload() { var input = document.querySelector("#file"); input.addEventListener("change", function () { if (check_types()) { var upload_span = document.querySelector(".upload-file-name"); var btn = document.querySelector(".conversion-button"); upload_span.innerHTML = input.files[0].name; var size = parseFloat((input.files[0].size / (1024 * 1024)).toFixed(2)); btn.removeAttribute("disabled"); if (size > app.allowed_file_size) { set_alert( "File size must not exceed " + app.allowed_file_size + " MB!", "danger" ); return false; } redirect_to_ocr(btn, input.files[0].name, size); } else { set_alert( "Bad file type! Make sure your file is " + app.allowed_types.join(", ").toUpperCase(), "danger" ); } }); } function _handleSitemapBoxClick() { clicked = this; clicked.setAttribute("value", "true"); var bxs = document.querySelectorAll("input[type=checkbox]"); bxs.forEach(function (elem) { if (elem !== clicked) { elem.removeAttribute("value"); elem.checked = false; } }); } function sitemap_check_select() { var boxes = document.querySelectorAll("input[type=checkbox]"); boxes.forEach(function (box) { box.addEventListener("click", _handleSitemapBoxClick); }); } function sitemap_home_click() { btn = document.querySelector(".conversion-button"); btn.addEventListener("click", _handleSitemapHomeRedirect); } function _handleSitemapHomeRedirect() { check_type = document.querySelector("input[value=true]"); url = document.querySelector("input[name=url]"); if (!url.value) { set_alert("Please insert a valid ULR.", "danger"); return false; } if (!check_type) { type = "validate"; } else { type = check_type.name; } localStorage.setItem("sitemap_home_url", url.value); localStorage.setItem("sitemap_home_type", type); var url; switch (type) { case "validate": url = "/tools/seo-sitemap-checker"; break; case "broken-links": url = "/tools/sitemap-broken-links"; break; case "generate": url = "/tools/sitemap-generator"; break; } window.location.href = url; // console.log("") } function handle_sitemap_home_redirect() { type = localStorage.getItem("sitemap_home_type"); url = localStorage.getItem("sitemap_home_url"); if (type && url) { input = document.querySelector("input[name=url]"); input.innerHTML = url; input.value = url; seo_check(); } localStorage.removeItem("sitemap_home_type"); localStorage.removeItem("sitemap_home_url"); } function redirect_to_ocr(btn, file_name, size) { btn.addEventListener("click", async function (ev) { ev.preventDefault(); var upload_status; await upload_files(false) .then((data) => (upload_status = data)) .catch((reason) => console.log("Message:" + reason.message)); if ( upload_status["success"] !== null && upload_status["success"] !== undefined ) { localStorage.setItem("order_id", upload_status["success"]); localStorage.setItem("file_name", file_name); localStorage.setItem("size", size); window.location.replace("/tools/ocr"); } return false; }); } function create_file_list_landing(name, size) { document.querySelector("#tool-files").classList.remove("d-none"); var li = document.createElement("li"); var file_list_div = document.querySelector("#file-list-holder"); var file_count = document.querySelector(".file-counter"); var size_count = document.querySelector(".size-counter"); var name_span = document.createElement("span"); var icon = document.createElement("object"); var remove_span = document.createElement("span"); var right_container = document.createElement("div"); var left_container = document.createElement("div"); var size_span = document.createElement("span"); var ul = document.createElement("ul"); ul.setAttribute("id", "name-list"); ul.style.display = "block"; size_span.innerHTML = size + " MB"; app.file_size = size; size_span.classList.add("size-span"); right_container.classList.add( "justify-content-end", "align-items-center", "w-50", "d-flex" ); left_container.classList.add( "align-items-center", "d-flex", "overflow-hidden", "w-100" ); type = exploded_name(name)[1].toLowerCase(); type == "jpeg" ? (type = "jpg") : null; li.classList.add( "text-start", "name-li", "list-group-item", "align-items-center" ); // app.allowed_file_size > (value.size/(1024*1024)).toFixed(2) ? li.classList.add("list-group-item-success"): li.classList.add("list-group-item-danger") icon.data = "../images/" + type + "-type.svg"; icon.classList.add(type + "-icon"); icon.classList.add("file-icon", "blue"); left_container.appendChild(icon); left_container.appendChild(name_span); li.appendChild(left_container); name_span.classList.add("file-name"); name_span.innerHTML = name; remove_span.classList.add("remove-file", "delete"); remove_span.innerHTML = "✕"; right_container.appendChild(size_span); right_container.appendChild(remove_span); li.appendChild(right_container); ul.appendChild(li); file_count.innerHTML = "Total files: " + 1; if (app.file_size > 0) { size_count.innerHTML = "Total size: " + size + " MB"; if (app.file_size > app.allowed_file_size) { size_count.classList.add("bg-danger"); } } file_list_div.appendChild(ul); loading(false); change_convert_btn(true); remove_file(); } async function get_landing_file() { let order = localStorage.getItem("order_id"); var host = "https://" + location.hostname + "/"; if (order && document.referrer == host) { let name = localStorage.getItem("file_name"); let size = localStorage.getItem("size"); create_file_list_landing(name, size); await conversion(order); localStorage.removeItem("size"); } } async function preview_image() { var images = document.querySelectorAll(".image-content"); images.forEach(async (img) => { url = img.nextElementSibling.children[0].getAttribute("href-a-data"); await fetch(url, { method: "get" }) .then((res) => res.blob()) .then((res) => { const src = URL.createObjectURL(res); // var reader = new FileReader(); // reader.onload = function(e) { // img.querySelector("img").src = e.target.result; // } // reader.readAsDataURL(res); img.querySelector("img").src = src; }); img.addEventListener("click", function () { var image = img.children[0]; var modal = document.querySelector(".modal"); modal.style.display = "block"; modal_img = modal.children[1]; modal_img.src = image.src; close_image(modal); }); }); } function close_image(modal) { var close_btn = modal.querySelector(".close"); close_btn.addEventListener("click", function () { modal.style.display = "none"; }); } function include_on_click() { boxes = document.querySelectorAll(".page-include"); boxes.forEach(function (box) { box.addEventListener("click", function () { if (box.value === "") { box.value = true; } else { box.value = ""; } }); }); } function source_select() { let tabs = document.querySelector("#source-nav").querySelectorAll("span"); let holders = document.querySelectorAll(".source-input-holder"); holders[0].style.maxHeight = "500px"; tabs.forEach(function (elem) { elem.addEventListener("click", function (ev) { tabs.forEach(function (tb) { if (tb.classList.contains("active")) { tb.classList.remove("active"); } }); holders.forEach(function (el) { if (el.style.maxHeight !== "0px") { el.style.maxHeight = 0; el.style.overflow = "hidden"; } }); elem.classList.add("active"); document.querySelector( "#kw-source-" + elem.dataset.source ).style.maxHeight = "500px"; document.querySelector( "#kw-source-" + elem.dataset.source ).style.overflow = "auto"; }); }); } function uncheck_method() { boxes = document.querySelectorAll(".kw-method"); boxes.forEach(function (box) { box.addEventListener("click", function () { if (box.value === "") { box.value = true; } else { box.value = ""; } boxes.forEach(function (elem) { if (elem !== box) { elem.checked = false; elem.value = ""; } }); }); }); } function density_on_key() { window.addEventListener("keypress", function (event) { if (event.key === "Enter") { event.preventDefault(); density(); } }); } // async function that fetches response from "find-density.php"; // bound to "Calculate Density" button; async function density() { processing(true); // the div where the results and messages will be displayed let results_div = document.querySelector("#main-results"); // create a FormData and append the url and checkboxes values; let form_data = new FormData(); let method = ""; url_selector = document.querySelector("#main-url"); competitor_url_selector = document.querySelector("#competitor-url"); include_boxes = document.querySelectorAll(".page-include"); method_boxes = document .querySelector("#source-nav") .querySelectorAll(".nav-link"); method = Array.from(method_boxes).find((element) => element.classList.contains("active") ); method = method.dataset.source; form_data.append("method", method); if (method == "link") { if (url_selector.value == "") { set_alert( "Please insert the url to your webpage before proceeding!", "danger" ); return false; } form_data.append("url", url_selector.value); if (competitor_url_selector.value.trim()) { form_data.append("competitor-url", competitor_url_selector.value); } include_boxes.forEach(function (box, i) { if (box.value === "true") { form_data.append(box.name, box.value); } }); } if (method == "text") { text_area = document.querySelector("#kw-text"); custom_kw = document.querySelector("#kw-input-text").value; if (custom_kw.trim() !== "") { form_data.append("custom-keywords", custom_kw); } if (text_area.value == "") { set_alert( "Please insert text in the input area before proceeding!", "danger" ); return false; } form_data.append("text", text_area.value); } if (method == "file") { var file_selector = document.querySelector("#file"); if (file_selector.files.length == 0) { set_alert("Please select a file before proceeding!", "danger"); return false; } var upload_status; await upload_files(false) .then((data) => (upload_status = data)) .catch((reason) => console.log("Message:" + reason.message)); if (upload_status !== false) { form_data.append("id", upload_status["success"]); custom_kw = document.querySelector("#kw-input-file").value; if (custom_kw.trim() !== "") { form_data.append("custom-keywords", custom_kw); } } else { set_alert( "We encountered some problems. Please try again or try again later!", "danger" ); } loading(false); change_convert_btn(true); } // function called when the fetch has succeeded // @param { json = JSON }; function success(json) { clear_results(); if (json["status"] !== null && json["status"] !== undefined) { set_alert(json["status"], "danger"); } else { for (const type in json) { if (method == "link") { url = document.querySelector("#" + type + "-url"); results_div = document.querySelector("#" + type + "-results"); indicator = document.createElement("span"); indicator.innerHTML = "Results for: " + url.value; hr = document.createElement("hr"); // hr.classList.add('mt-0') results_div.appendChild(indicator); // results_div.appendChild(hr) } if ( method == "link" && json[type]["density"]["keywords"].length === 0 ) { var alert = document.createElement("div"); alert.classList.add("alert", "alert-danger", "p-2", "mb-2"); alert.innerHTML = "The Page does not have Meta Keywords!"; alert.style.fontSize = "15px"; results_div.appendChild(alert); hr = document.createElement("hr"); // results_div.appendChild(hr) } create_tables(json[type]["density"], method, type); statistics(json[type]["statistics"], type); } } processing(false); results_div.removeAttribute("hidden"); scrollToTargetAdjusted(results_div); } function failure(e) { console.log(e); } await fetch("/find-density", { method: "POST", body: form_data, success: function (data) {}, }) .then((res) => res.json()) .then((response) => success(response)) .catch((error) => failure(error)); } // cleares the results div function clear_results() { arr = ["main", "competitor"]; arr.forEach(function (elem) { result_div = document.querySelector("#" + elem + "-results"); result_div.classList.remove("d-none"); stats_div = document.querySelector(".statistics"); density_div = document.querySelector(".density"); if (stats_div !== null && density_div !== null) { stats_div.innerHTML = ""; density_div.innerHTML = ""; } else { result_div.innerHTML = ""; } }); } function statistics(json, type) { main_res = document.querySelector("#" + type + "-results"); var results_div = main_res.querySelector("#phrases"); var span_holder = document.createElement("div"); span_holder.classList.add("p-2", "alert", "alert-primary", "mb-2"); span_holder.style.fontSize = "15px"; for (const [stats, vals] of Object.entries(json)) { var span = document.createElement("span"); span.classList.add("me-2"); span.innerHTML = stats + ": " + "" + vals + ""; span_holder.appendChild(span); } results_div.insertBefore(span_holder, results_div.children[0]); } // creates tables containing the results and adds headers for each table // @params { json = json recieved from fetch, tables = array with tables ids}; function create_tables(json, method, type) { let tables = [ "keywords", "one-word", "two-words", "three-words", "four-words", ]; results_div = document.querySelector("#" + type + "-results"); if (method == "link") { var table_heads = [ "Keyword", "Frequency", "Title", "Description", "H-tags", "Density", ]; } else { var table_heads = ["Keyword", "Frequency", "Density"]; } buttons_holder = document.createElement("div"); buttons_holder.classList.add("nav", "nav-tabs"); // results_div.classList.add("p-3"); // results_div.style.backgroundColor = "#FCFCFB"; words_table_container = document.createElement("div"); words_table_container.classList.add("w-100"); tables_and_menu_holder = document.createElement("div"); tables_and_menu_holder.setAttribute("id", "phrases"); tables_and_menu_holder.classList.add("d-flex", "flex-column"); tables_and_menu_holder.appendChild(buttons_holder); tables_and_menu_holder.appendChild(buttons_holder); tables_and_menu_holder.appendChild(words_table_container); results_div.appendChild(tables_and_menu_holder); // results_div.appendChild(results_div) tables.forEach((id, index) => { if (json[id].length === 0) { return; } result_table = document.createElement("table"); result_table.classList.add("word-density-table"); var heading = document.createElement("h5"); heading.innerHTML = "Results for " + id.replace("-", " "); heading.classList.add("mt-3", "kw-table-name"); if (id == "keywords") { result_table.classList.add( "table", "table-success", "table-striped", "m-auto" ); } else { result_table.classList.add( "table", "table-primary", "table-striped", "m-auto" ); } let table_holder = document.createElement("div"); table_holder.setAttribute("id", id); result_table.setAttribute("id", id); table_head = document.createElement("thead"); th_r = document.createElement("tr"); table_head.appendChild(th_r); table_heads.forEach((thead) => { head = document.createElement("th"); head.innerHTML = thead; head.classList.add("kw-table-heading"); th_r.appendChild(head); }); result_table.appendChild(table_head); table_body = document.createElement("tbody"); // table_body.classList.add("custom-shadow") result_table.appendChild(table_body); // the keywords table will be the first to be desplayed in a different manner hr = document.createElement("hr"); if (id === "keywords") { collapse_btn = document.createElement("button"); collapse_btn.classList.add( "btn", "btn-sm", "btn-primary", "shadow-none", "border-0", "rounded-0", "d-flex", "justify-content-between", "w-100" ); collapse_btn.style.backgroundColor = "#777"; collapse_btn.addEventListener("click", _handleKWTableDropDown); show_span = document.createElement("span"); show_span.innerHTML = "Hide Keywords"; icon = document.createElement("i"); icon.classList.add("fa-solid", "fa-caret-down"); collapse_btn.appendChild(show_span); collapse_btn.appendChild(icon); result_table.classList.add("w-100", "mb-2"); // table_holder.appendChild(heading); table_holder.appendChild(collapse_btn); table_holder.appendChild(result_table); // console.log(results_div) if (method == "link") { results_div.insertBefore(table_holder, results_div.children[1]); } else { results_div.insertBefore(table_holder, results_div.children[0]); } // results_div.insertBefore(hr, results_div.children[1]); } else { btn = document.createElement("span"); btn_name = id.replace("-", " "); btn_name = btn_name.charAt(0).toUpperCase() + btn_name.slice(1); btn.innerHTML = btn_name; btn.style.fontSize = "15px"; btn.setAttribute("onclick", "_handleShowTable(this)"); btn.setAttribute("id", id + "-toggle"); buttons_holder.appendChild(btn); result_table.classList.add("w-100"); if (id !== "one-word") { table_holder.classList.add("d-none"); btn.classList.add("nav-link", "flex-fill"); } else { btn.classList.add("active"); btn.classList.add("nav-link", "flex-fill"); } // table_holder.appendChild(heading); // table_holder.classList.add("mt-3") table_holder.appendChild(result_table); words_table_container.appendChild(table_holder); } populate_table(json[id], result_table); }); } function _handleKWTableDropDown() { target = this.nextElementSibling; if (!target.classList.contains("d-none")) { target.classList.add("d-none"); this.querySelector("i").classList.remove("fa-caret-down"); this.querySelector("i").classList.add("fa-caret-up"); this.querySelector("span").innerHTML = "Show Keywords"; this.classList.add("mb-2"); } else { target.classList.remove("d-none"); this.querySelector("i").classList.remove("fa-caret-up"); this.querySelector("i").classList.add("fa-caret-down"); this.querySelector("span").innerHTML = "Hide Keywords"; this.classList.remove("mb-2"); } } function _handleShowTable(target) { current_btn = target.parentElement.parentElement.querySelector(".active"); if (current_btn == target) { return false; } target.classList.remove("btn-outline-primary"); table_name = target.id.split("-"); table_name = table_name[0] + "-" + table_name[1]; next_table = target.parentElement.parentElement.querySelector( "#" + table_name ); next_table.classList.remove("d-none"); target.classList.add("active"); current_btn.classList.remove("active"); // current_btn.classList.add("btn-outline-primary") prev_table_name = current_btn.id.split("-"); prev_table_name = prev_table_name[0] + "-" + prev_table_name[1]; target.parentElement.parentElement .querySelector("#" + prev_table_name) .classList.add("d-none"); } // populates created tables with results from json // @params { result = array of results from first JSON entry; res_table = HTML table element } function populate_table(result, res_table) { for (const [word, vals] of Object.entries(result)) { if (result.length === 0) { return; } var row = res_table.querySelector("tbody").insertRow(); var cell = row.insertCell(0); cell.classList.add("kw-table-cell", "kw-table-cell-words"); cell.innerHTML = word; Object.values(vals).forEach(function (val, index) { if (res_table.id == "keywords" && index == 0 && val == 0) { row.classList.add("table-danger"); } var cell = row.insertCell(index + 1); cell.classList.add("kw-table-cell", "align-middle"); cell.innerHTML = val; }); } } function make_token(length) { let result = ""; const characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; const charactersLength = characters.length; let counter = 0; while (counter < length) { result += characters.charAt(Math.floor(Math.random() * charactersLength)); counter += 1; } return result; } function set_progress_token() { token_inpt = document.querySelector("#token"); if (token_inpt) { token_inpt.setAttribute("value", make_token(5)); } } function restart_seo_report(target) { var form_data = new FormData(); form_data.append("url", target.dataset.url); form_data.append("to-check", "create-seo-report"); form_data.append("redo-report", "true"); } function start_seo_report(target) { var url = $("#url"); var prot = $("#prot"); var form_data = new FormData(); if (prot) { // url += "&prot=" + prot.value if (!isValidUrl(url.value) && !isValidUrl(prot.value + "://" + url.value)) { set_alert("Please insert a valid URL!", "danger"); return false; } form_data.append("prot", prot.value); } if (target.dataset.url) { form_data.append("url", target.dataset.url); form_data.append("redo-report", true); } else { form_data.append("url", url.value); } form_data.append("to-check", "create-seo-report"); function success(json) { // clearInterval(request_update); if (json["status"] == "success") { if (json["results"]["status"] !== "finished") { window.localStorage.setItem("start-process-report", true); } window.location.replace(json["results"]["url"]); } else { set_alert("Something went wrong. Please try again later.", "danger"); } } function failure(e) { console.log(e); // clearInterval(request_update); } api = "/seo-check"; fetch(api, { async: true, keepalive: true, body: form_data, method: "POST", success: function (data) { // console.log(data) }, }) .then((res) => res.json()) .then((response) => success(response)); } function get_payload() { let payload = {}; let ids = ["url", "prot", "to-check", "token", "user-agent", "country"]; ids.forEach(function (id) { const elem = $("#" + id); if (elem) { payload[id] = elem.value; } }); return payload; } async function update_seo_check(payload) { function failure_update(e) { clearInterval(request_update); console.log(e); } async function success_update(data) { let processed_thresh = 500; let interval_multiplier = 0; switch (payload["to-check"]) { case "sitemap-generator": if (data["total-urls"]) { if ( parseInt(Object.values(data["total-urls"])[0]) >= processed_thresh ) { processed_links_string = Object.values( data["total-urls"] )[0].toString(); interval_multiplier += 5; if (interval_multiplier >= 10) { power = parseInt(processed_links_string.length) - parseInt(parseInt(interval_multiplier.toString().length) - 1); } else { power = parseInt(processed_links_string.length); } power = 3; // payload["update-interval"] = parseInt(interval_multiplier) * 10 ** power; processed_thresh = payload["update-interval"]; clearInterval(request_update); // payload["update-interval"] = 5000; request_update = setInterval( await update_seo_check(payload, request_update), payload["update-interval"] ); data["time-update"] = { "Updating every:": parseInt(payload["update-interval"]) / 1000 + " seconds", }; } // } // debugger; } data["time-update"] = { "Updating every: ": parseInt(payload["update-interval"]) / 1000 + " seconds", }; break; case "broken-links": // console.log(data) break; } update_data(data, payload["to-check"]); } fetch( "/progress-data?data=" + payload["to-check"] + "&token=" + payload["token"], { async: true, method: "GET", keepalive: true, success: function (data) {}, } ) .then((res) => res.json()) .then((response) => success_update(response)) .catch((error) => failure_update(error)); } async function seo_check() { clear_storage(); clear_display_area(); processing(true); // change_convert_btn(false) const payload = get_payload(); if (payload["prot"]) { // console.log(!isValidUrl(prot.value + "://" + url.value)) if (!isValidUrl(payload["prot"] + "://" + payload["url"])) { set_alert("Please insert a valid URL!", "danger"); change_convert_btn(true); return false; } } else { if (!isValidUrl(payload["url"])) { set_alert("Please insert a valid URL!", "danger"); change_convert_btn(true); return false; } } var form_data = new FormData(); for (const itm in payload) { form_data.append(itm, payload[itm]); } let update_tools = [ "sitemap", "sitemap-urls", "sitemap-generator", "website-structure", "broken-links", ]; if (update_tools.indexOf(payload["to-check"]) > -1) { xhr_check(form_data, payload["to-check"]); return; } var result_div = $("#results"); var result_alert = $("#no-result"); result_div ? result_div.remove() : null; result_alert ? result_alert.remove() : null; let request_update; let update_holder = $("#update-holder-" + payload["to-check"]); if (update_holder !== null && update_holder !== undefined) { update_holder.remove(); } function success(json) { clearInterval(request_update); processing(false, true); change_convert_btn(true); if (json["failure"] !== undefined) { set_alert(json["failure"], "danger"); return false; } if (json["status"] == "success") { let update_holder = $("#update-holder-" + payload["to-check"]); if (update_holder !== null && update_holder !== undefined) { update_holder.remove(); } if (json["results"]) { if (payload["to-check"] == "seo-report") { window.location.replace(json["results"]); } else { // $("#results-wrapper").appendChild(node_from_string(parse_html_tags(json["results"]))) display_indicator(payload["to-check"], payload["url"]); display_tool_results(json["results"], payload["to-check"]); } } else { multiple_download_links(json["links"]); } } else { const alert = document.createElement("div"); alert.classList.add("alert", "alert-danger", "p-2", "mb-0", "mt-2"); alert.setAttribute("id", "no-result"); alert.style.fontSize = "15px"; alert.innerHTML = json["status"]; $("#results-wrapper").appendChild(alert); // set_alert(json["status"], "danger") } if (json["data"] !== undefined) { // console.log(json["data"]) } } function failure(e) { clearInterval(request_update); console.log(e); } if (payload["to-check"] === "seo-report") { clear_report_nav(); } fetch("/seo-check", { async: true, keepalive: true, body: form_data, method: "POST", success: function (data) { // console.log(data) }, }) .then((res) => res.json()) .then((response) => success(response)) .catch((error) => failure(error)); } function xhr_check(data, to_check) { $(".update-holder").classList.remove("d-none"); $("#results-wrapper").innerHTML = ""; disable_convert_button(); XHR.addCallback(XMLHttpRequest.OPENED, function (data) {}); XHR.addCallback(XMLHttpRequest.DONE, function (data) { processing(false); const parsed = parse_commaless_json(data); if (parsed[0]["status"] == "failure") { set_alert(parsed[0]["message"], "danger"); return false; } try { const last_item = parsed[parsed.length - 1]; // update_results(last_item["data"]); end_request(last_item, to_check); } catch (e) { console.log("Not a valid Json!"); console.log(e); } enable_convert_button(); }); XHR.addCallback(XMLHttpRequest.LOADING, function (data) { try { const parsed = parse_commaless_json(data); const last_item = parsed[parsed.length - 1]; update_results(last_item, to_check); } catch (e) { console.log("Not a valid Json!"); console.log(e); } }); XHR.open("POST", "/seo-check", true); XHR.send(data); function update_results(itm, to_check) { if (!itm) { return false; } for (const idx in itm) { const elem = $("#" + idx); if (elem) { elem.innerHTML = itm[idx]; } } switch (to_check) { case "broken-links": for (lnk in itm["blinks"]) { spn = document.createElement("span"); code_spn = document.createElement("span"); code_spn.innerHTML = " - " + itm["blinks"][lnk]["response_code"]; spn.innerHTML = lnk; spn.appendChild(code_spn); spn.classList.add("d-block"); $("#broken-links-holder").appendChild(spn); } break; } } function end_request(data, to_check) { $(".update-holder").classList.add("d-none"); display_indicator(to_check, $("#url").value); switch (to_check) { case "sitemap-generator": multiple_download_links(data["links"]); break; case "website-structure": $("#results-wrapper").innerHTML += data["results"]; break; case "sitemap": display_tool_results(data["results"], to_check); break; case "sitemap-urls": display_tool_results(data, to_check); break; case "broken-links": display_tool_results(data, to_check); break; } } } function clear_display_area() { const res_div = $("#tool-results"); if (res_div) { res_div.remove(); } const indicators = $(".tool-indicator", true); indicators.forEach(function (elem) { elem.remove(); }); } function display_indicator(test, url) { const indicator = $create("span", false, ["tool-indicator"]); let test_name = (test.charAt(0).toUpperCase() + test.slice(1)) .replace("-", " ") .replace("_", " "); indicator.innerHTML = "" + test_name + "" + " results"; if (test !== "page-size") { indicator.innerHTML += " for: " + url + ""; } $("#results-wrapper").appendChild(indicator); } function display_tool_results(results, test) { const results_wrapper = $("#results-wrapper"); const data_div = $create("div", "tool-results-data"); const results_div = $create("div", "tool-results"); results_wrapper.appendChild(results_div); if (test !== "page-size" && test !== "sitemap") { results_div.appendChild(display_messages(results)); } results_div.appendChild(data_div); if (test !== "heading") { display_content(results); } const display_data = tool_results_data(results, test); if (display_data) { data_div.appendChild(display_data); } scrollToTargetAdjusted(results_div); } function scrollToTargetAdjusted(element) { var headerOffset = 150; var elementPosition = element.getBoundingClientRect().top; var offsetPosition = elementPosition + window.pageYOffset - headerOffset; window.scrollTo({ top: offsetPosition, behavior: "smooth", }); } function display_messages(results) { // debugger const messages_div = $create("div", "results-messages"); const custom_msgs = results["Messages"]; const alerts = { passed: "success", failed: "danger", warning: "warning", }; //custom messages = messages not stored in db if (custom_msgs) { for (msg_type in custom_msgs) { for (msg in custom_msgs[msg_type]) { const message_wrapper = $create("div", false, [ "alert", "alert-" + alerts[msg_type], "p-1", "mb-1", ]); const message = $create( "span", false, [msg_type + "-audit"], custom_msgs[msg_type][msg] ); message_wrapper.appendChild(message); messages_div.appendChild(message_wrapper); } } } else { //console.log(results.length); if (!results.length) { results = [results]; } results.forEach(function (res) { if (!res["message"]) { return; } const message_wrapper = $create("div", false, [ "alert", "alert-" + alerts[res["status"]], "p-1", "mb-1", ]); const message = $create("span", false, [res["status"] + "-audit"]); message.innerHTML = res["message"] .replace("[b]", "") .replace("[/b]", ""); message_wrapper.appendChild(message); messages_div.appendChild(message_wrapper); }); //data } //console.log(messages_div); return messages_div; } function display_content(results) { const data_div = $("#tool-results-data"); // if (results["data"] && results["data"]["text-content"]) { const text_content_wrapper = $create("div", "text-content-wrapper", [ "my-3", ]); const text_content_holder = $create("div", "text-content-holder"); text_content_holder.innerHTML = results["data"]["text-content"]; text_content_wrapper.appendChild(text_content_holder); data_div.appendChild(text_content_wrapper); delete results["data"]["text-content"]; } } function tool_results_data(results, test) { const data_div = $("#tool-results-data"); // const table = $create("table", false, ["table", "mt-1", "mb-0"]); const thead = $create("thead"); const tbody = $create("tbody"); table.appendChild(thead); table.appendChild(tbody); switch (test) { case "heading": return heading_display(); case "title": if (results["prev-data"] && results["prev-data"]["title"]) { return meta_display(); } break; case "description": if (results["prev-data"] && results["prev-data"]["description"]) { return meta_display(); } break; case "page-size": return page_size_display(); case "website-structure": return display_web_structure(); default: return display_data(); } function display_web_structure() { return node_from_string(results["data"]); } function page_size_display() { const tr = $create("tr"); const th_text = $create("th", false, false, "URL"); const th_type = $create("th", false, ["text-center"], "Page Size"); tr.appendChild(th_text); tr.appendChild(th_type); thead.appendChild(tr); for (const itm in results["data"]) { let tr = $create("tr"); let td = $create("td"); td.innerHTML = results["data"][itm]["url"]; td.style.maxWidth = "400px"; td.style.wordWrap = "break-word"; tr.appendChild(td); let td_val = $create( "td", false, ["text-center", results["data"][itm]["status"] + "-audit"], results["data"][itm]["value"] ); tr.appendChild(td_val); tbody.appendChild(tr); } return table; } function display_data() { if (!results["data"]) { return false; } const tr = $create("tr"); thead.appendChild(tr); let holder = $create("div"); holder.classList.add("check-results-list"); let ul = $create("ul"); ul.classList.add("check-results-list"); let main_li = $create("li"); main_li.classList.add("results-content-header"); data = results["data"]; if (data[0] && data[0]["check-results"]) { //if check results have a url dispaly it if (data[0]["url"]) { const th_text = $create("th"); th_text.style.maxWidth = "400px"; switch (test) { case "opengraph": th_text.innerHTML = "OG Tag"; break; case "page-objects": th_text.innerHTML = "Resource"; // span.classList.add("res-name") break; default: th_text.innerHTML = "URL"; break; } tr.appendChild(th_text); } let keys = Object.keys(data[0]["check-results"]); keys.forEach(function (k) { let name = k.replace("-", " "); name = name.charAt(0).toUpperCase() + name.slice(1); const th_type = $create("th", false, ["text-center"], name); tr.appendChild(th_type); }); } ul.appendChild(main_li); for (const itm in data) { let tr = $create("tr"); //if the check results have a url display it if (data[itm]["url"]) { let td = $create("td", false, ["align-middle", "text-break"]); tr.appendChild(td); const span = $create("span"); span.innerHTML = data[itm]["url"]; td.appendChild(span); td.style.maxWidth = "400px"; //if any custom message for this specific url, display them const check_messages = data[itm]["Messages"]; if (check_messages) { for (const type in check_messages) { for (const msg in check_messages[type]) { const span = $create("span", false, ["d-block", "check-message"]); if (type == "failed") { span.classList.add("alert-danger", "p-1"); } span.innerHTML = check_messages[type][msg]; td.appendChild(span); } } } } let td = $create("td", false, ["align-middle", "text-break"]); for (const key in data[itm]["check-results"]) { let td = $create("td", false, [ "text-center", "align-middle", "text-break", ]); td.innerHTML = data[itm]["check-results"][key]; if ( data[itm]["success-check"] && data[itm]["success-check"] !== "yes" ) { td.classList.add("text-danger"); } tr.appendChild(td); } tbody.appendChild(tr); } console.log(ul); return table; } function heading_display() { const tr = $create("tr"); const th_text = $create("th", false, false, "Heading Text"); const th_type = $create("th", false, ["text-center"], "Heading Type"); tr.appendChild(th_text); tr.appendChild(th_type); thead.appendChild(tr); const headings = results[results.length - 1]["data"]; headings.forEach(function (elem) { const tr = $create("tr"); const td_text = $create("td"); const td_type = $create("td", false, ["text-center"]); td_text.innerHTML = elem.text; td_type.innerHTML = elem.type; tr.appendChild(td_text); tr.appendChild(td_type); tbody.appendChild(tr); }); return table; } function meta_display() { const preview = google_preview(results["prev-data"]); return preview; } } function update_data(data, to_check) { // console.log(data); first_update = true; // var result_div = document.querySelector("#results"); // result_div.classList.remove("d-none"); data_types = []; main_content_holder = document.querySelector("#results-wrapper"); main_content_holder.querySelector("#update-holder-" + to_check) == null || main_content_holder.querySelector("#update-holder-" + to_check) == undefined ? (first_update = true) : (first_update = false); if (first_update) { update_holder = document.createElement("div"); update_holder.setAttribute("id", "update-holder-" + to_check); update_holder.classList.add("m-auto", "p-2", "custom-shadow", "mb-2"); update_holder.style.backgroundColor = "#FCFCFB"; for (type in data) { if (data[type] === null || data[type] === undefined) { continue; } var prop_names = Object.keys(data[type]); data_holder = document.createElement("div"); data_holder.classList.add("data-holder-" + to_check); if (type == "processed-pages") { // console.log(data) links = Object.values(data[type])[0]; h_span = document.createElement("span"); h_span.innerHTML = "Broken links found: "; data_holder.appendChild(h_span); h_span.classList.add("d-block"); data_holder.appendChild(document.createElement("hr")); for (lnk in links) { spn = document.createElement("span"); code_spn = document.createElement("span"); code_spn.innerHTML = " - " + links[lnk]["response_code"]; spn.innerHTML = lnk; spn.appendChild(code_spn); spn.classList.add("d-block"); data_holder.appendChild(spn); } update_holder.appendChild(data_holder); continue; } data_message_span = document.createElement("span"); data_message_span.innerHTML = prop_names[0]; data_span = document.createElement("span"); data_message_span.setAttribute("id", type); data_span.innerHTML = Object.values(data[type])[0]; data_holder.appendChild(data_message_span); data_holder.appendChild(data_span); update_holder.appendChild(data_holder); } if (to_check == "sitemap-urls") { spinner = node_from_string(spinners["primary"]); update_holder.appendChild(spinner); percent = Math.floor( (parseInt(Object.values(data["total-processed"])[0]) / parseInt(Object.values(data["total-urls"])[0])) * 100 ); spinner.querySelector(".progress-bar").innerHTML = percent + "%"; spinner.querySelector(".progress-bar").style.width = percent + "%"; } } else { update_holder = document.querySelector("#update-holder-" + to_check); count = 0; for (type in data) { if (data[type] === null || data[type] === undefined) { continue; } var prop_names = Object.keys(data[type]); data_holder = update_holder.querySelectorAll(".data-holder-" + to_check)[ count ]; if (type == "processed-pages") { links = Object.values(data[type])[0]; for (lnk in links) { spn = document.createElement("span"); code_spn = document.createElement("span"); code_spn.innerHTML = " - " + links[lnk]["response_code"]; spn.innerHTML = lnk; spn.appendChild(code_spn); spn.classList.add("d-block"); data_holder.appendChild(spn); } continue; } data_span = data_holder.querySelector("#" + type); if (data_span) { data_span.nextSibling.innerHTML = Object.values(data[type])[0]; data_holder.children[0].innerHTML = prop_names[0]; count++; } } if (to_check == "sitemap-urls") { spinner = document.querySelector(".progress"); update_holder.appendChild(spinner); if ( data["total-processed"] !== undefined && data["total-processed"] !== null ) { percent = Math.floor( (parseInt(Object.values(data["total-processed"])[0]) / parseInt(Object.values(data["total-urls"])[0])) * 100 ); spinner.querySelector(".progress-bar").innerHTML = percent + "%"; spinner.querySelector(".progress-bar").style.width = percent + "%"; } } } if (first_update) { main_content_holder.appendChild(update_holder); } if (data["added"] !== undefined) { span = document.createElement("span"); span.innerHTML = data["added"]; span.classList.add("d-block"); main_content_holder.appendChild(span); } } function tool_link_btn(to_check) { if (app.seo_tags.includes(to_check)) { var tool_link = document.createElement("a"); tool_link.classList.add("btn", "btn-sample", "btn-sm"); tool_link.innerHTML = "Create SEO " + to_check.charAt(0).toUpperCase() + to_check.slice(1); tool_link.href = "/tools/write-seo-" + to_check; } else { if (to_check === "sitemap") { var tool_link = document.createElement("button"); tool_link.classList.add("btn", "btn-sample", "btn-sm"); tool_link.innerHTML = "Test Sitemap URLs"; // tool_link.href = "/tools/sitemap-url-checker" tool_link.addEventListener("click", sitemapToolLinkHandler(link)); } } return tool_link; } function sitemapToolLinkHandler(link) { var source = event.target || event.srcElement; event.preventDefault(); localStorage.setItem( "sitemap", source.parentElement.parentElement.children[0].textContent ); // console.log(source.parentElement.children[0].textContent) // window.location.replace("/tools/sitemap-broken-links"); window.open("/tools/sitemap-broken-links", "_blank"); } function sitemap_redirect_check() { let storage_sitemap = localStorage.getItem("sitemap"); var host = "https://" + location.hostname + "/tools/seo-sitemap-checker"; if (storage_sitemap && document.referrer == host) { document.querySelector("#url").value = storage_sitemap; set_progress_token(); seo_check(); localStorage.removeItem("sitemap"); } } function isValidUrl(string) { try { const url = new URL(string); //console.log(url); return true; } catch (err) { return false; } } function escape_html(unsafe) { return unsafe .replace(/&/g, "&") .replace(//g, ">") .replace(/"/g, """) .replace(/'/g, "'"); } function parse_html_tags(unsafe) { unsafe = unsafe.replaceAll("&", "&"); unsafe = unsafe.replaceAll("&", "&"); unsafe = unsafe.replaceAll("<", "<"); unsafe = unsafe.replaceAll(">", ">"); // unsafe = unsafe.replaceAll("nbsp;", " ") return unsafe; // .replace(/"/g, """ ) // .replace(/'/g, "'"); } function node_from_string(string) { if (!string) { return false; } var div = document.createElement("div"); div.innerHTML = string.trim(); return div.firstChild; } function messages_rows(json, to_check) { container = document.querySelector(".results-container"); msg_count = Object.keys(json["Messages"]).length; if ( json["Messages"]["failed-audits"] == null || json["Messages"]["failed-audits"] == undefined ) { container.querySelector("#failed-audits").remove(); } else { container.querySelector("#failed-audits").style.width = 100 / msg_count + "%"; } if ( json["Messages"]["passed-audits"] == null || json["Messages"]["passed-audits"] == undefined ) { container.querySelector("#passed-audits").remove(); } else { container.querySelector("#passed-audits").style.width = 100 / msg_count + "%"; } if ( json["Messages"]["warnings"] == null || json["Messages"]["warnings"] == undefined ) { container.querySelector("#warnings").remove(); } else { container.querySelector("#warnings").style.width = 100 / msg_count + "%"; } for (message_type in json["Messages"]) { message_div = container.querySelector("#" + message_type); json["Messages"][message_type].forEach(function (elem) { msg_container = document.createElement("div"); var msg_span = document.createElement("span"); // var mark_span = document.createElement("span") var mark_span = node_from_string(spans["mark-" + message_type]); msg_span.innerHTML = elem; msg_container.appendChild(mark_span); msg_container.appendChild(msg_span); message_div.appendChild(msg_container); }); } } function general_row(json, to_check) { // app.seo_tags.includes(to_check) ? table = document.querySelector("#seo-tag-table") : table = document.querySelector("#base-table") table = document.querySelector("." + to_check + "-table-results"); if (json["general"] == null || json["general"] == undefined) { table.querySelector("#general-row").remove(); return false; } if (app.seo_tags.includes(to_check)) { //Legnth, remaining, limit for (stat_type in json["general"]) { //pixel, char for (stat in json["general"][stat_type]) { table.querySelector("." + stat).innerHTML = json["general"][stat_type][stat]; } } table.querySelector("#tool-link").href = "/tools/write-seo-" + to_check; table.querySelector("#tool-link").innerHTML = "Create SEO " + to_check.charAt(0).toUpperCase() + to_check.slice(1); stats_text(); } else { if (table.querySelector("#general-row") !== null) { cell = table.querySelector("#general-row").insertCell(); cell.setAttribute("id", "general-message"); // if( to_check == "sitemap"){ // if( json["total-sitemaps"] !== null && json["total-sitemaps"] !== undefined ){ // var span = node_from_string(spans.message_span); // span.innerHTML = "Found sitemaps: "; // span.classList.remove("p-2") // cell.appendChild(span) // for( sitemap of json["total-sitemaps"] ){ // var div = document.createElement("div"); // div.classList.add("d-block", "border-bottom", "border-light", "m-0", "p-1", "d-flex", "justify-content-between") // var span = document.createElement("span") // var link = node_from_string(links.sitemap_url_redirect) // div.appendChild(span) // div.appendChild(link) //// span.classList.add( "border-bottom", "border-light") // span.classList.add("text-info") // span.innerHTML = sitemap // cell.appendChild(div) // } // } // } for (gen_mess in json["general"]["messages"]) { var msg_span = document.createElement("span"); msg_span.innerHTML = json["general"]["messages"][gen_mess]; msg_span.classList.add("text-info", "d-block"); cell.appendChild(msg_span); } var to_check_indicator = document.createElement("span"); to_check_indicator.classList.add("d-block"); to_check_indicator.innerHTML = "Analysed " + to_check + ": " + json[to_check]; cell.appendChild(to_check_indicator); } } } function results_table(table, json, to_check) { var result_div = document.querySelector("#results"); json_entries = ["Messages", "Result Content"]; json_entries.forEach((elem) => { if (elem == "Result Content") { table = document.createElement("table"); table.classList.add("table", "seo-table", "table-dark"); // result_div.appendChild(table); } for (type in json[elem]) { var row = table.insertRow(); var type_cell = row.insertCell(); var message_cell = row.insertCell(); type_cell.setAttribute("colspan", 1); type_cell.innerHTML = type; var type_class = type.replace(" ", "-"); type_class = type_class.toLowerCase(); type_cell.classList.add("seo-table-head", "p-2"); var check_span = document.createElement("span"); if (type == "Passed Audits") { row.classList.add("table-success"); check_span.classList.add("seo-check-mark"); check_span.innerHTML = " ✔"; } else if (type == "Failed Audits") { row.classList.add("table-danger"); check_span.classList.add("seo-uncheck-mark"); check_span.innerHTML = " ✘"; } else if (type == "Warnings") { row.classList.add("table-warning"); check_span.classList.add("seo-warning-mark", "text-warning"); check_span.innerHTML = " ⚠"; } else { row.classList.add("table-warning"); } message_cell.setAttribute("colspan", 4); message_cell.classList.add("seo-message-cell"); if (typeof json[elem][type] === "object") { Array.from(json[elem][type]).forEach(function (content) { var message_span = document.createElement("span"); message_span.innerHTML = content; message_span.classList.add("d-block", "my-2"); if (elem == "Messages") { message_span.appendChild(check_span.cloneNode(true)); } message_cell.appendChild(message_span); }); } else { var message_span = document.createElement("span"); message_span.innerHTML = json[elem][type]; message_span.classList.add("d-block", "my-2"); if (elem == "Messages") { message_span.appendChild(check_span.cloneNode(true)); } message_cell.appendChild(message_span); } } if ( json[elem] !== undefined && parseInt(Object.keys(json[elem]).length) > 0 ) { var header = table.createTHead(); var h_row = header.insertRow(); var h_desc_cell = h_row.insertCell(); h_desc_cell.classList.add("text-center", "align-middle"); if (elem == "Messages") { h_desc_cell.innerHTML = to_check.charAt(0).toUpperCase() + to_check.slice(1) + " Status"; h_desc_cell.setAttribute("colspan", "5"); } else { var h_code_cell = h_row.insertCell(0); h_code_cell.classList.add("text-center", "align-middle"); if (to_check === "sitemap-urls") { h_desc_cell.innerHTML = "Found URLS"; h_code_cell.innerHTML = "HTTP Code"; } if (to_check === "h-tag") { h_code_cell.innerHTML = "Tag Type"; h_desc_cell.innerHTML = "Tag Text"; } } } }); if ( json["Contents"] !== undefined && parseInt(Object.keys(json["Contents"]).length) > 0 ) { var content_div = document.createElement("div"); content_div.classList.add("mb-3"); var content_span = document.createElement("span"); var content_holder = document.createElement("span"); content_holder.classList.add( "border", "p-2", "border-2", "seo-content", "text-center" ); content_holder.innerHTML = json["Contents"]; content_span.innerHTML = "Your " + to_check + " contents: "; content_span.classList.add("text-center", "d-block"); content_div.appendChild(content_span); content_div.appendChild(content_holder); result_div.appendChild(content_div); } } function stats_text() { var pix_length = document.querySelector(".pixel-length"); var char_count = document.querySelector(".character-count"); // var remaining_pix = document.querySelector(".remaining-pixels"); // var remaining_char = document.querySelector(".remaining-characters"); // // if( remaining_pix.innerHTML < 0 ){ // remaining_pix.classList.add("text-danger") // }else{ // remaining_pix.classList.add("text-success") // } // if( remaining_char.innerHTML < 0 ){ // remaining_char.classList.add("text-danger") // }else{ // remaining_char.classList.add("text-success") // } var pix_lim = document.querySelector(".recomended-pixels-limit"); var char_lim = document.querySelector(".recomended-characters-limit"); pix_lim.classList.add("text-info"); char_lim.classList.add("text-info"); if ( parseInt(pix_length.innerHTML) > parseInt(pix_lim.innerHTML.split(",")[0]) && parseInt(pix_length.innerHTML) < parseInt(pix_lim.innerHTML.split(",")[1]) ) { pix_length.classList.add("text-success"); } else { pix_length.classList.add("text-danger"); } if ( parseInt(char_count.innerHTML) > parseInt(char_lim.innerHTML.split(",")[0]) && parseInt(char_count.innerHTML) < parseInt(char_lim.innerHTML.split(",")[1]) ) { char_count.classList.add("text-success"); } else { char_count.classList.add("text-danger"); } } // --- end functions for create_seo_tables function seo_tag_create() { var content_input = document.querySelector("#seo-tag"); var result_div = document.querySelector("#results"); var char_count = document.querySelector(".char-count"); var pix_length = document.querySelector(".pix-length"); var result_text = document.querySelector("#result-text"); var canvas = document.createElement("canvas"); var remaining_char = document.querySelector(".remaining-char"); var remaining_pix = document.querySelector(".remaining-pix"); var char_limit = document .querySelector(".char-limit") .innerHTML.replaceAll(" ", "") .split("-"); var pix_limit = document .querySelector(".pix-limit") .innerHTML.replaceAll(" ", "") .split("-"); let f = new FontFace("fnt", "url(/arial.ttf)", {}); f.load().then(function (font) { document.fonts.add(font); }); var font_size = 0; canvas.height = window.innerHeight; canvas.width = window.innerWidth; var ctx = canvas.getContext("2d"); if (content_input.name == "title") { font_size = 15; ctx.wordSpacing = "0.65px"; } else { font_size = 10.5; ctx.wordSpacing = "-0.2px"; } ctx.font = font_size + "pt fnt"; content_input.addEventListener("keyup", function () { result_text.classList.contains("d-none") ? result_text.classList.remove("d-none") : null; result_text.innerHTML = " "; var new_content = content_input.value; var char_span = document.createElement("div"); var pixel_span = document.createElement("div"); var duplicate_span = document.createElement("div"); // Ready to use the font in a canvas context // ctx.letterSpacing = "0.4px"; var width = ctx.measureText(new_content).width; pixel_span.classList.add("alert", "p-2", "m-0"); char_span.classList.add("alert", "p-2", "m-0"); duplicate_span.classList.add("alert", "p-2", "m-0"); remaining_char.innerHTML = char_limit[1] - new_content.length; remaining_pix.innerHTML = pix_limit[1] - Math.ceil(width); if (remaining_char.innerHTML < 0) { remaining_char.style.color = "#dc3545"; } else { remaining_char.style.color = "#198754"; } if (remaining_pix.innerHTML < 0) { remaining_pix.style.color = "#dc3545"; } else { remaining_pix.style.color = "#198754"; } if (duplicate_words(new_content)) { // duplicate_span.innerHTML = "Contains duplicate words!"; // duplicate_span.classList.add("alert-danger"); // result_text.appendChild(duplicate_span); } if (width < pix_limit[0] || width > pix_limit[1]) { pix_length.style.color = "#dc3545"; // pixel_span.innerHTML = "Pixel length out of limits!"; // pixel_span.classList.add("alert-danger") } else { pix_length.style.color = "#198754"; // pixel_span.innerHTML = "Pixel length is ok!";f // pixel_span.classList.add("alert-success") } if ( new_content.length < char_limit[0] || new_content.length > char_limit[1] ) { // char_span.innerHTML = "Character count out of limits!"; char_count.style.color = "#dc3545"; // char_span.classList.add("alert-danger") } else { char_count.style.color = "#198754"; // char_span.innerHTML = "Character count is ok!"; // char_span.classList.add("alert-success") } result_text.appendChild(char_span); result_text.appendChild(pixel_span); pix_length.innerHTML = Math.ceil(width); char_count.innerHTML = new_content.length; // result_div.appendChild(canvas) // ctx.strokeText(new_content, 100,100); }); } function duplicate_words(string) { var words_arr = string .toLowerCase() .replace(/[^\w\s]/gi, "") .split(" "); var filtered = words_arr.filter(function (el) { return el != ""; }); var duplicates = filtered.filter( (item, index) => filtered.indexOf(item) !== index ); if (duplicates.length == 0) { return false; } else { return true; } } async function verify_pass() { var input_pass = document.querySelector("[name=input-pass]"); function failure(error) { console.log("ERROR: " + error); } function success(response) { if (response === "failed") { remove_alert(); set_alert("Incorect Password!", "danger"); } if (response === "success") { var form = document.querySelector("#details-form"); var sbmt = document.querySelector("[name=change-details"); var hidden = document.createElement("input"); hidden.setAttribute("hidden", "hidden"); hidden.name = "change-details"; form.appendChild(hidden); // sbmt.click(); form.submit(); } } await fetch("/verify-pass?pass=" + input_pass.value, {}) .then((res) => res.json()) .then((response) => success(response)) .catch((error) => failure(error)); } function download_file(url, fileName) { fetch(url, { method: "get", mode: "no-cors", referrerPolicy: "no-referrer" }) .then((res) => res.blob()) .then((res) => { const aElement = document.createElement("a"); aElement.setAttribute("download", fileName); const href = URL.createObjectURL(res); aElement.href = href; aElement.setAttribute("target", "_blank"); aElement.click(); URL.revokeObjectURL(href); }); } function set_transitions() { elements = document.querySelectorAll(".no-transition"); elements.forEach(function (elem) { elem.classList.remove("no-transition"); }); } function toggle_nav() { btn = document.querySelector(".navbar-toggler"); nav = document.querySelector("#navbar_collapse"); main_nav = $("nav"); btn.addEventListener("click", function () { if (nav.classList.contains("show")) { nav.classList.remove("show"); change_nav_color(); } else { nav.classList.add("show"); change_nav_color(); } }); } function toggleLinkList(target) { if ( target.parentElement.children[ target.parentElement.children.length - 1 ].classList.contains("d-none") ) { target.parentElement.children[ target.parentElement.children.length - 1 ].classList.remove("d-none"); target.classList.remove("tree-list-arrow-right"); target.classList.add("tree-list-arrow-down"); } else { target.classList.remove("tree-list-arrow-down"); target.classList.add("tree-list-arrow-right"); target.parentElement.children[ target.parentElement.children.length - 1 ].classList.add("d-none"); } } function lazy_load() { let images = document.querySelectorAll(".lazy"); let options = { root: null, rootMargin: "0px 0px 50px 0px", threshold: 0.5, }; let callback = (entries, observer) => { entries.forEach((entry) => { if (entry.isIntersecting) { const img = entry.target; if (img.getAttribute("data-srcset")) { const src = img.getAttribute("data-srcset"); img.setAttribute("srcset", src); img.classList.remove("lazy"); img.classList.add("lazy-loaded"); observer.unobserve(img); } else if (img.getAttribute("data-src")) { const src = img.getAttribute("data-src"); img.setAttribute("src", src); img.classList.remove("lazy"); img.classList.add("lazy-loaded"); observer.unobserve(img); } } // and some other methods }); }; let observer = new IntersectionObserver(callback, options); images.forEach((image) => { observer.observe(image); }); } function hex(c) { var s = "0123456789abcdef"; var i = parseInt(c); if (i == 0 || isNaN(c)) return "00"; i = Math.round(Math.min(Math.max(0, i), 255)); return s.charAt((i - (i % 16)) / 16) + s.charAt(i % 16); } /* Convert an RGB triplet to a hex string */ function convertToHex(rgb) { return hex(rgb[0]) + hex(rgb[1]) + hex(rgb[2]); } /* Remove '#' in color hex string */ function trim(s) { return s.charAt(0) == "#" ? s.substring(1, 7) : s; } /* Convert a hex string to an RGB triplet */ function convertToRGB(hex) { var color = []; color[0] = parseInt(trim(hex).substring(0, 2), 16); color[1] = parseInt(trim(hex).substring(2, 4), 16); color[2] = parseInt(trim(hex).substring(4, 6), 16); return color; } function generateColor(colorStart, colorEnd, colorCount) { // The beginning of your gradient var start = convertToRGB(colorStart); // The end of your gradient var end = convertToRGB(colorEnd); // The number of colors to compute var len = colorCount; //Alpha blending amount var alpha = 0.0; var saida = []; for (i = 0; i < len; i++) { var c = []; alpha += 1.0 / len; c[0] = start[0] * alpha + (1 - alpha) * end[0]; c[1] = start[1] * alpha + (1 - alpha) * end[1]; c[2] = start[2] * alpha + (1 - alpha) * end[2]; saida.push(convertToHex(c)); } return saida; } // Usage example function calculate_element_visibility(elem) { const rect = elem.getBoundingClientRect(); const window_h = window.innerHeight; const scroll = window.scrollY; // const elem_pos = elem.offsetTop const elem_pos = rect.top + document.documentElement.scrollTop; const elem_height = rect.height; const hidden_before = scroll - elem_pos; const hidden_after = elem_pos + elem_height - (scroll + window_h); // console.log(elem.offsetTop) // console.log(elem_pos) // console.log($("#seo-analyzer-teaser").offsetTop) // console.log("------------") if (scroll > elem_pos + elem_height || elem_pos > scroll + window_h) { return 0; } else { // console.log(elem) if (hidden_before > 0) { return 100 - (hidden_before * 100) / elem_height; } if (hidden_after > 0) { return 100 - (hidden_after * 100) / elem_height; } } } function report_section_in_viewport() { const sections = $(".report-section", true); const nav_links = $(".section-li", true); sections.forEach(function (section) { const percent = calculate_element_visibility(section); const active = $(".section-li-in-view"); if (!active && percent > 0) { const link = Array.from(nav_links).find( (elem) => section.id.replace("-", " ") == elem.children[0].children[0].innerHTML.toLowerCase() ); link.classList.add("section-li-in-view"); } if (percent >= 35) { if (active) { active.classList.remove("section-li-in-view"); } const link = Array.from(nav_links).find( (elem) => section.id.replace("-", " ") == elem.children[0].children[0].innerHTML.toLowerCase() ); link.classList.add("section-li-in-view"); } // console.log(section) // console.log(percent) }); } function scroll_more_tools() { const btn = $("#page-button"); if (!btn) { return; } btn.addEventListener("click", function () { if (btn.classList.contains("more-tools-button")) { $("#more-tools").scrollIntoView(); } else { window.scrollTo(0, 0); } }); } function document_scroll() { document.addEventListener( "scroll", function (ev) { // console.log(ev) if (!app.is_user_page) { change_nav_color(); } // report_section_in_viewport() change_page_button(); }, true ); } function change_page_button() { const btn = $("#page-button"); if (!btn) { return; } const more_tools = $("#more-tools"); const percent = calculate_element_visibility(more_tools); if (percent >= 25 || percent == undefined) { btn.classList.remove("more-tools-button"); btn.classList.add("scroll-up-button"); btn.children[1].classList.remove("d-none"); btn.children[0].classList.add("d-none"); } else { btn.classList.remove("scroll-up-button"); btn.classList.add("more-tools-button"); btn.children[1].classList.add("d-none"); btn.children[0].classList.remove("d-none"); } } function change_nav_color() { const nav = $("nav"); const rect = nav.getBoundingClientRect(); const items = $(".navbar-nav a, .navbar-nav span", true); // console.log(window.scrollY) var logo = document.querySelector("#logo-link"); var logoLetters = document.querySelectorAll(".logo-span-colored"); var nav_menu = $("#navbar_collapse"); if (nav_menu.classList.contains("show")) { if (logo) { //logo.classList.add("text-dark") logo.classList.add("text-white"); logo.classList.add("ribbon"); } if (logoLetters) { logoLetters.forEach(function (element) { element.classList.add("text-white"); //element.classList.remove("text-white"); }); } //document.querySelector(".services > a:first-child:after").style.color = "black"; items.forEach(function (el) { el.classList.add("text-dark"); //el.classList.remove("text-shadoe-class"); }); nav.classList.add("nav-bg"); return true; } if (window.scrollY > rect.height) { if (logo) { //logo.classList.add("text-dark") logo.classList.add("text-white"); logo.classList.add("ribbon"); } if (logoLetters) { logoLetters.forEach(function (element) { element.classList.add("text-white"); //element.classList.remove("text-white"); }); } //document.querySelector(".services > a:first-child:after").style.color = "black"; items.forEach(function (el) { el.classList.add("text-dark"); //el.classList.remove("text-shadoe-class"); }); nav.classList.add("nav-bg"); } else { if (logo) { logo.classList.remove("text-dark"); logo.classList.add("text-white"); } if (logoLetters) { logoLetters.forEach(function (element) { //element.classList.remove("text-dark"); element.classList.add("text-white"); }); } items.forEach(function (el) { el.classList.remove("text-dark"); //el.classList.add("text-white"); //el.classList.add("text-shadoe-class"); }); if (logo) { logo.classList.add("text-white"); logo.classList.remove("text-dark"); logo.classList.remove("ribbon"); } nav.classList.remove("nav-bg"); //document.querySelector(".services > a:first-child:after").style.color = "white"; } } function landing_report() { const btn = $("#landing-report-btn"); const inpt = $("input[name=website_url]"); btn.addEventListener("click", function (event) { event.preventDefault(); if (!isValidUrl(inpt.value)) { set_alert("Please insert a valid URL", "danger"); return false; } start_seo_report(event.target); // console.log("aaa") }); } function toggle_forgot() { const btn = $("#forgot-pass-toggler"); let form = $("#forgot-pass-form"); btn.addEventListener("click", function () { if (form.style.maxHeight == "0px" || form.style.maxHeight == "") { form.style.maxHeight = "500px"; } else { form.style.maxHeight = "0"; } }); } function slide_cards() { const cards = $(".service-slider-item", true); counter = 0; slide_interval = setInterval(function () { if (counter >= cards.length - 1) { hide_card(counter); counter = 0; display_card(counter); } else { hide_card(counter); display_card(counter + 1); counter++; } }, 8000); } function hide_card(idx) { $(".service-slider-item", true)[idx].classList.remove("enter"); // $(".service-slider-item", true)[idx].classList.add("exit"); setTimeout(() => { // $(".service-slider-item", true)[idx].classList.remove("exit"); }, 1500); } function display_card(idx) { $(".service-slider-item", true)[idx].classList.remove("exit"); $(".service-slider-item", true)[idx].classList.add("enter"); } function call_index() { subscribe(); slide_cards(); } function write_seo_title() { seo_tag_create(); } function write_seo_description() { seo_tag_create(); } function ocr() { clear_storage(); check_file_upload(); } function image_to_pdf() { clear_storage(); check_file_upload(); // swap_images(); } function split_pdf() { check_file_upload(); clear_storage(); toggle_sm_menu(); load_pdfjs(); toggle_help(); btn = document.querySelector("#toggle-pdf-list"); btn.addEventListener("click", function () { list = document.querySelector(".pdf-list"); list.parentElement.classList.contains("d-none") ? list.parentElement.classList.remove("d-none") : list.parentElement.classList.add("d-none"); list.parentElement.parentElement.classList.contains("d-none") ? list.parentElement.parentElement.classList.remove("d-none") : list.parentElement.parentElement.classList.add("d-none"); }); } function pdf_add_watermark() { check_file_upload(); clear_storage(); load_pdfjs(); add_position_events(); toggle_sm_menu(); pdf_watermark_menu(); toggle_help(); } function merge_pdf() { load_pdfjs(); check_file_upload(); clear_storage(); } function swap_pdf_pages() { load_pdfjs(); check_file_upload(); clear_storage(); } function pdf_to_image() { clear_storage(); check_file_upload(); var zip_files = document.querySelector("#zip-files"); zip_inpt = document.querySelector("#download_type"); zip_inpt.addEventListener("click", function () { if (this.checked) { this.checked = false; this.value = "link"; } else { this.checked = true; this.value = "zip"; } }); zip_files ? zip_files.addEventListener("click", _handleZipFiles) : null; function _handleZipFiles() { inpt = this.querySelector("input"); if (inpt.checked) { inpt.checked = false; inpt.value = "link"; } else { inpt.checked = true; inpt.value = "zip"; } } } function keyword_density() { source_select(); include_on_click(); density_on_key(); uncheck_method(); check_file_upload(); } function seo_title_checker() {} function seo_description_desc() {} function sitemap_broken_links() { sitemap_redirect_check(); set_progress_token(); handle_sitemap_home_redirect(); } function seo_sitemap_checker() { set_progress_token(); handle_sitemap_home_redirect(); } function tool_sitemap_generator() { set_progress_token(); update_connection_status(); clear_storage(); handle_sitemap_home_redirect(); } function seo_robots_checker() {} function seo_heading_checker() {} function broken_links_checker() { set_progress_token(); update_connection_status(); } function check_http_header() { set_progress_token(); } function domain_age_checker() { set_progress_token(); } function website_tree_structure() { set_progress_token(); update_connection_status(); } function seo_report() { // toggle_report_info(); set_progress_token(); (function () { var requestAnimationFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || window.msRequestAnimationFrame; window.requestAnimationFrame = requestAnimationFrame; })(); } function user_login() { toggle_forgot(); } function sitemap_monitor() {} function sitemap_generator() { const btn = $(".sm-landing-button"); if (btn) { btn.addEventListener("click", function (ev) { if (app.is_logged) { window.location.href = "/dashboard?action=sitemap-generator"; } else { window.location.href = "/user-login"; } }); } } function call() { var loc = location.href.split("/").slice(3); let fname = false; let is_tool = false; if (loc[0] == "tools") { loc.shift(); is_tool = true; } if (loc.length >= 1) { fname = loc[0].replaceAll("-", "_"); if (fname.indexOf("?") !== -1) { fname = fname.substring(0, fname.indexOf("?")); } if (fname == "seo_report" && loc.length > 1) { fname += "_page"; } } if (fname == "") { call_index(); } if (fname == "sitemap_generator") { if (is_tool) { tool_sitemap_generator(); } else { sitemap_generator(); } } else { if (fname && typeof window[fname] === "function") { window[fname](); } } } //calling global functions if (app.conversion_type !== null) { // display_allowed_types(); app.input_accept(); } call(); app.init(); active_link(); set_transitions(); toggle_nav(); lazy_load(); scroll_more_tools(); document_scroll();