/*
* User related JS
*
*
*
*
*/
// GLOBAL VARIABLES
var spinners = {
'primary': '
',
'primary-spinner': '' +
'Loading...' +
'
',
}
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,
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
}
}
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",
];
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 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
}
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 = document.querySelector("#file");
var selects = document.querySelectorAll("select");
var boxes = document.querySelectorAll("input[type=checkbox]");
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"]);
}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 = 0;
app.file_size = 0;
for (const value of file_input.files){
if( idx != id){
dt.items.add(value)
app.file_size += parseFloat( (value.size/(1024*1024)).toFixed(2));
}
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;
})
}
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();
document.querySelector("#tool-work-area").classList.remove("d-none");
var list_div = document.querySelector("#file-list-holder");
list_div.classList.contains("d-none") ? list_div.classList.remove("d-none") : null;
label = document.querySelector(".input-label") || document.querySelector(".small-input-label");
if( label.classList.contains("input-label")){
// label.classList.add("small-input-label", "flex-row")
// label.classList.remove("input-label","flex-column")
// document.querySelector(".input-label-wrapper").classList.add("d-inline-block")
// document.querySelector("#conversion-btn-holder").classList.add("d-inline-block")
}
var file_count = document.querySelector(".file-counter");
var size_count = document.querySelector(".size-counter");
var file_input = document.querySelector("#file");
var ul = document.createElement("ul");
ul.setAttribute("id","name-list");
list_div.appendChild(ul);
// ul.style.display = "none";
i = 0;
app.file_size = 0;
for( const value of file_input.files){
var li = document.createElement("li");
var name_span = document.createElement("span");
var icon = document.createElement("object");
var right_container = document.createElement("div");
var left_container = document.createElement("div");
var size_span = document.createElement("span");
var total_files_span = document.createElement("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 = document.createElement("i");
var replace_icon = document.createElement("i");
var remove_btn = document.createElement("button")
var replace_btn = document.createElement("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");
if( label.classList.contains("input-label")){
label.classList.add("small-input-label", "flex-row")
label.classList.remove("input-label","flex-column")
document.querySelector(".input-label-wrapper").classList.add("d-inline-block", "float-end")
document.querySelector("#conversion-btn-holder").classList.add("d-inline-block")
}
i = 0;
for( const value of file_input.files){
var name_span = document.createElement("span");
var list_image_holder = document.createElement("div");
var image_holder = document.createElement("div")
var img = document.createElement("img");
var name_holder = document.createElement("div");
img.classList.add("list-image")
img.src = URL.createObjectURL(value);
list_image_holder.classList.add("list-image-holder", "m-2","p-2")
image_holder.classList.add("image-holder")
var remove_icon = document.createElement("i");
var replace_icon = document.createElement("i");
var remove_btn = document.createElement("button")
var replace_btn = document.createElement("button")
remove_btn.setAttribute("title", "Remove File")
replace_btn.setAttribute("title", "Replace File")
remove_btn.classList.add("btn", "btn-sm", "btn-danger","position-absolute","delete")
replace_btn.classList.add("btn", "btn-sm", "btn-primary","position-absolute","replace")
remove_icon.classList.add("fa-solid","fa-trash-can");
replace_icon.classList.add("fa-solid","fa-file-arrow-up");
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.classList.add("image-name");
name_span.innerHTML = value.name;
name_holder.classList.add("d-flex", "justify-content-center")
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++){
data.append("files_" + j, file_input.files[holders[j].id] )
}
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 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();
if( label.classList.contains("input-label")){
label.classList.add("small-input-label", "flex-row")
label.parentElement.classList.add("d-inline-block", "float-end")
label.classList.remove("input-label","flex-column")
}
break;
case "pdf-add-watermark":
await pdf_renderer.load_pdf();
await pdf_display.show();
add_manual_events();
if( label.classList.contains("input-label")){
label.classList.add("small-input-label", "flex-row")
label.parentElement.classList.add("d-inline-block", "float-end")
label.classList.remove("input-label","flex-column")
}
break;
case "merge-pdf":
await pdf_display.display_all_first_page();
await pdf_display.make_replaceable();
if( label.classList.contains("input-label")){
label.classList.add("small-input-label", "flex-row")
label.parentElement.classList.add("d-inline-block", "float-end")
label.classList.remove("input-label","flex-column")
}
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);
if( label.classList.contains("input-label")){
label.classList.add("small-input-label", "flex-row")
label.parentElement.classList.add("d-inline-block", "float-end")
label.classList.remove("input-label","flex-column")
}
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);
}
// }
}
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 : null ,
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 = document.createElement("div");
var main_parent = document.querySelector(".conversion-tab") || document.querySelector("#results") || document.querySelector("#download-section");
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 = document.querySelector("#download-section")
main_parent.classList.remove("d-none")
}
if(document.querySelector("div[id=button-holder]") !== null){
document.querySelector("div[id=button-holder]").remove();
}
var btn = document.createElement("a");
btn.setAttribute("id","download");
var lable = document.createElement("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("#tool-wrapper")
button_holder.classList.add("text-center" ,"m-auto","text-break", "w-100", "mb-2");
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 = document.querySelector(".conversion-button");
btn.hasAttribute("hidden") ? btn.removeAttribute("hidden") : null;
btn.removeAttribute("disabled");
}
function disable_convert_button(){
btn = document.querySelector(".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");
}
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 + " phrases";
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){
console.log(Object.entries(result))
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));
}
}
async function seo_check(){
clear_storage();
processing(true);
change_convert_btn(false)
var form_data = new FormData();
var url = document.querySelector("#url");
var prot = document.querySelector("#prot")
if( prot ){
// console.log(!isValidUrl(prot.value + "://" + url.value))
if( !isValidUrl(prot.value + "://" + url.value) ){
set_alert("Please insert a valid URL!","danger");
change_convert_btn(true)
return false;
}
}else{
if( !isValidUrl(url.value) ){
set_alert("Please insert a valid URL!","danger");
change_convert_btn(true)
return false;
}
}
var to_check = document.querySelector("#to-check")
var token = document.querySelector("#token");
token ? token = token.value : null;
var user_agent = document.querySelector("#user-agent")
var country = document.querySelector("#country")
var result_div = document.querySelector("#results");
var result_alert = document.querySelector("#no-result");
result_div ? result_div.remove() : null;
result_alert ? result_alert.remove() : null;
let update_interval = 2000;
let request_update
let interval_multiplier = 0
let processed_thresh = 500
let update_holder = document.querySelector("#update-holder-" + to_check.value);
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 = document.querySelector("#update-holder-" +to_check.value);
if( update_holder !== null && update_holder !== undefined ){
update_holder.remove();
}
if(json["results"]){
// document.querySelector(".main").appendChild(node_from_string(parse_html_tags(json["results"])))
document.querySelector("#results-wrapper").appendChild(node_from_string(parse_html_tags(json["results"])))
}else{
multiple_download_links(json["links"])
}
}else{
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"];
document.querySelector("#tool-wrapper").children[1].appendChild(alert)
// set_alert(json["status"], "danger")
}
if( json["data"] !== undefined ){
// console.log(json["data"])
}
}
function failure(e){
clearInterval(request_update)
console.log(e);
}
function failure_update(e){
clearInterval(request_update)
console.log(e);
}
async function success_update(data){
switch (to_check.value){
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
//
update_interval = (parseInt(interval_multiplier) * (10**(power)))
processed_thresh = update_interval
clearInterval(request_update)
// update_interval = 5000;
request_update = setInterval( await update, update_interval )
data["time-update"] = {"Updating every:": parseInt(update_interval) / 1000 + " seconds"}
}
// }
// debugger;
}
data["time-update"] = {"Updating every: ": parseInt(update_interval) / 1000 + " seconds"}
break;
case "broken-links":
// console.log(data)
break;
}
update_data(data, to_check.value);
}
form_data.append("url",url.value)
form_data.append("to-check",to_check.value)
// url = "/seo-check?url=" + url.value + "&to-check=" + to_check.value
url = "/seo-check"
if( prot ){
// url += "&prot=" + prot.value
form_data.append("prot",prot.value)
}
if( token ){
form_data.append("token",token)
// url += "&token="+token
}
if( user_agent ){
form_data.append("user-agent",user_agent.value)
}
if( country ){
form_data.append("country",country.value)
}
fetch( url,{
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));
// var eSource = new EventSource("/progress-data");
// eSource.onmessage = function(event) {
// //write the received data to the page
// console.log(event.data)
// console.log("inside")
// };
async function update(){
fetch("/progress-data?data=" + to_check.value + "&token="+token,{
async: true,
method: "GET",
keepalive: true,
success: function(data){
}
}).then(res => res.json())
.then(response => success_update(response))
.catch(error => failure_update(error))
}
request_update = setInterval( await update, update_interval );
}
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("#tool-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 {
new URL(string);
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!";
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")
btn.addEventListener("click", function(){
nav.classList.contains("show") ? nav.classList.remove("show") : nav.classList.add("show")
})
}
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 call_index(){
// landing_upload();
//subscribe();
}
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();
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();
}
function merge_pdf(){
load_pdfjs();
check_file_upload();
toggle_help();
clear_storage()
}
function swap_pdf_pages(){
load_pdfjs();
check_file_upload();
clear_storage()
toggle_help();
}
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_chekcer(){
set_progress_token()
handle_sitemap_home_redirect()
}
function 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()
}
window.onload = function() {
subscribe();
}
//calling global functions
if( app.conversion_type !== null ){
// display_allowed_types();
app.input_accept();
}
var loc = location.href.split("/").slice(3)
let fname = false;
if( loc[0] == "tools" ){
loc.shift();
}
if(loc.length >= 1 ){
fname = loc[0].replaceAll("-","_");
}
if( fname && typeof window[fname] === "function"){
window[fname]();
}
active_link();
set_transitions();
toggle_nav();
lazy_load();
//sendToServer();
//
// // dont call on index.php
// if( loc !== "" && loc !== " "){
// window.onload = function (){
// //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();
// });
// }
//};
//
// }