From 12c1d3d9ed8a23c8fba6a8e94b6e7cae7ad5f3eb Mon Sep 17 00:00:00 2001 From: Offerel Date: Fri, 9 May 2025 15:00:06 +0200 Subject: [PATCH] version --- CHANGELOG.md | 3 +++ index.php | 2 +- install | 0 js/syncmarks.js | 7 +++---- js/syncmarks.min.js | 4 ++-- smsw.js | 2 +- 6 files changed, 10 insertions(+), 8 deletions(-) delete mode 100644 install diff --git a/CHANGELOG.md b/CHANGELOG.md index 9b34977..4137d9a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,7 @@ # ChangeLog +## 2.1.0 +- Added install wizard + ## 2.0.5 - Fix change user - Fix tabSync diff --git a/index.php b/index.php index c7d6271..0fbc156 100644 --- a/index.php +++ b/index.php @@ -2,7 +2,7 @@ /** * SyncMarks * - * @version 2.0.5 + * @version 2.1.0 * @author Offerel * @copyright Copyright (c) 2025, Offerel * @license GNU General Public License, version 3 diff --git a/install b/install deleted file mode 100644 index e69de29..0000000 diff --git a/js/syncmarks.js b/js/syncmarks.js index 873835f..ce476c8 100644 --- a/js/syncmarks.js +++ b/js/syncmarks.js @@ -1,7 +1,7 @@ /** * SyncMarks * - * @version 2.0.5 + * @version 2.1.0 * @author Offerel * @copyright Copyright (c) 2025, Offerel * @license GNU General Public License, version 3 @@ -9,10 +9,9 @@ const dbName = "syncmarks"; const dbStoreName = "bookmarks"; let db, translation; -//let dbRequest = indexedDB.open(dbName); +let dbRequest = indexedDB.open(dbName); document.addEventListener("DOMContentLoaded",function() { - /* if ("serviceWorker" in navigator) { try { const registration = navigator.serviceWorker.register("smsw.js"); @@ -70,7 +69,7 @@ document.addEventListener("DOMContentLoaded",function() { navigator.serviceWorker.addEventListener("controllerchange", event => { //confirm('sw changed'); }); - */ + setLanguage(document.documentElement.lang); if(window.location.href.slice(-1) === '?') window.history.replaceState({}, null, window.location.href.substring(0, window.location.href.length - 1)); diff --git a/js/syncmarks.min.js b/js/syncmarks.min.js index 50e92f1..869c705 100644 --- a/js/syncmarks.min.js +++ b/js/syncmarks.min.js @@ -1,2 +1,2 @@ -function addBookmarkEvents(){var e;document.addEventListener("mouseup",function(){document.removeEventListener("mousemove",resize,!1)},!1),document.querySelectorAll(".file").forEach(function(e){/iPhone|iPad|iPod|Android/i.test(navigator.userAgent)&&e.children[0].setAttribute("draggable",!1),e.addEventListener("contextmenu",onContextMenu,!1),e.addEventListener("mouseup",clicCheck,!1),e.addEventListener("dragstart",function(e){e.target.style.opacity=".3",e.dataTransfer.effectAllowed="move"}),e.addEventListener("dragend",function(e){e.target.style.opacity=""})}),document.querySelectorAll(".folder").forEach(e=>e.addEventListener("mouseup",clicCheck,!1)),document.querySelectorAll(".folder").forEach(e=>e.addEventListener("contextmenu",onContextMenu,!1)),document.querySelectorAll(".lbl").forEach(function(t){t.addEventListener("mouseup",openFolderBookmarks,!1),t.addEventListener("dragover",function(e){e.preventDefault(),e.dataTransfer.dropEffect="move"}),t.addEventListener("dragenter",function(){this.style="background-color: lightblue;"}),t.addEventListener("dragleave",function(){this.style="background-color: unset;"}),t.addEventListener("drop",function(t){t.preventDefault();let n=t.target.htmlFor.substring(2);0===bmIDs.length&&bmIDs.push(e.target.id),bmIDs.forEach(e=>sendRequest(bmmv,n,e)),t.target.style="background-color: unset;"})}),document.addEventListener("drag",function(t){e=t}),document.getElementById("bookmarks").addEventListener("keyup",rmBm),document.querySelectorAll(".file").forEach(e=>e.addEventListener("contextmenu",onContextMenu,!1)),document.querySelectorAll(".file").forEach(e=>e.addEventListener("mouseup",clicCheck,!1)),document.querySelectorAll(".folder").forEach(e=>e.addEventListener("mouseup",clicCheck,!1)),document.querySelectorAll(".folder").forEach(e=>e.addEventListener("contextmenu",onContextMenu,!1))}async function setLanguage(e){let t=await fetch("locale/"+e+".json");translation=await t.json(),document.getElementById("footer")&&wsize()}function wsize(){document.getElementById("footer").innerText=/iPhone|iPad|iPod|Android/i.test(navigator.userAgent)?" + ":translation.actions.addBookmark}function clicCheck(e){let t=this.children[0];switch(e.button){case 0:e.ctrlKey?t.classList.contains("bmMarked")?(-1!==bmIDs.indexOf(t.id)&&bmIDs.splice(bmIDs.indexOf(t.id),1),t.classList.remove("bmMarked")):(t.classList.add("bmMarked"),bmIDs.push(t.id)):void 0!==e.srcElement.dataset.url&&window.open(e.srcElement.dataset.url,"_blank","noopener,noreferrer");break;case 1:void 0!==e.srcElement.dataset.url&&window.open(e.srcElement.dataset.url,"_blank","noopener,noreferrer")}}function addBD(){menubg=document.getElementById("mnubg"),menubg.style.visibility="visible",document.getElementById("mnubg").style.visibility="visible"}function openFolderBookmarks(e){if(e.ctrlKey&&0==e.button||1==e.button){this.htmlFor.substring(2);let e=this.parentElement.children[2].childNodes;e.forEach(function(e){if(null!=e.className&&e.className.indexOf("file")>-1){let t=e.children[0];t.click()}})}}function rmBm(e){if(46==e.keyCode&&bmIDs.length>0){let e=translation.messages.delCount;mconfirm(e.replace("%count%",bmIDs.length),JSON.stringify(bmIDs))}}function sendRequest(e,t=null,n=null){const d={action:e.name,client:0,data:t,add:n,sync:null},l=new XMLHttpRequest;l.open("POST",document.location.href,!0),l.setRequestHeader("Content-type","application/x-www-form-urlencoded"),l.responseType="json",l.onreadystatechange=function(){if(4===l.readyState)if(l.status>199&&l.status<299)e(l.response,n);else{let t=`Error ${l.status}: ${l.statusText}`;console.warn(e.name,t),pwaMessage(e.name+": "+t,"error")}},l.onerror=function(){let t="Error: "+l.status+" | "+l.response;return console.warn(e.name,url,t),!1};const o=new URLSearchParams(d);l.send(o)}function pwaMessage(e,t){var n=document.getElementById("pwamessage");return n.classList.add(t),n.innerText=e,n.classList.add("show"),setTimeout(function(){n.className=n.classList.remove("show")},7e3),!1}function testDB(e){let t=document.getElementById("dbhost"),n=document.getElementById("dbname"),d=document.getElementById("dbuser"),l=document.getElementById("dbpwd"),o=document.getElementById("dbpath"),i=document.getElementById("cdb"),s=document.getElementById("idb");switch(e.code){case 200:t.classList.add("valid"),n.classList.add("valid"),d.classList.add("valid"),l.classList.add("valid"),o.classList.add("valid"),i.classList.add("valid"),i.disabled=!0,s.disabled=!1,l.classList.remove("invalid"),d.classList.remove("invalid"),i.classList.remove("invalid");break;case 250:console.warn(e.message),pwaMessage(e.message,"error"),s.disabled=!0,e.message.includes("Access denied")&&(l.classList.add("invalid"),d.classList.add("invalid"),i.classList.add("invalid"),n.classList.add("valid"),o.classList.add("valid"));break;default:console.error(e.message),s.disabled=!0}}function initDB(e){let t=document.getElementById("idb"),n=document.getElementById("nextSetup");switch(e.code){case 200:t.classList.add("valid"),t.classList.remove("warn"),t.disabled=!0,n.disabled=!1;break;case 250:t.classList.add("warn"),pwaMessage(e.message,"error");break;default:t.classList.add("invalid")}}function saveSettings(e){switch(console.log(e),e.code){case 200:location.reload();break;case 250:default:document.getElementById("nextSettings").classList.add("warn"),pwaMessage(e.message,"error")}}function getclients(e){let t=e.clients;var n=document.getElementById("mngcform");n.childNodes.length&&n.removeChild(n.firstChild);var d=document.createElement("ul");t.forEach(function(e,t){if("0"!=e.id){let t=document.createElement("li");t.title=e.id,t.dataset.type=e.type.toLowerCase(),t.id=e.id,t.classList="client";let n=document.createElement("div");n.classList="clientname",n.appendChild(document.createTextNode(e.name?e.name:e.id)),t.appendChild(n);let l=document.createElement("input");l.type="text",l.name="cname",l.value=e.name,n.appendChild(l);let o=document.createElement("div");o.classList="lastseen",o.innerText="0"!=e.date?"Sync: "+new Date(parseInt(e.date)).toLocaleString(navigator.language,{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"}):"Sync: -- -- ---- -- --",n.appendChild(o);let i=document.createElement("div");i.classList="fa-edit rename",i.addEventListener("click",mvClient,!1),t.appendChild(i);let s=document.createElement("div");s.classList="fa-trash remove",s.addEventListener("click",delClient,!1),t.appendChild(s),d.appendChild(t)}}),n.appendChild(d),addBD(),document.getElementById("mngcform").style.display="block",document.querySelector("#bookmarks").addEventListener("click",hideMenu,!1)}function langupdate(e){location.reload()}function addmark(e){let t=translation.messages.bmAddedOK;200!==e.code?t=translation.messages.bmAddedFail:(document.getElementById("bookmarks").innerHTML=e.html_bookmarks,document.querySelectorAll(".file").forEach(e=>e.addEventListener("contextmenu",onContextMenu,!1)),document.querySelectorAll(".file").forEach(e=>e.addEventListener("mouseup",clicCheck,!1)),document.querySelectorAll(".folder").forEach(e=>e.addEventListener("mouseup",clicCheck,!1)),document.querySelectorAll(".folder").forEach(e=>e.addEventListener("contextmenu",onContextMenu,!1))),console.info(t);let n=t.includes("not")?"warn":"success";pwaMessage(t,n)}function muedt(e){document.getElementById("db-spinner")&&document.getElementById("db-spinner").remove(),e=""+e,-1!=e.indexOf("failed")?(console.error("Syncmarks: "+e),show_noti({title:"Syncmarks - Error",url:e,key:""},!1)):-1!=e.indexOf("not send")&&(console.warn("Syncmarks: "+e),pwaMessage(e,"error")),sendRequest(getUsers)}function getUsers(e){let t=e;if(-1!=t.indexOf("not allowed"))console.warn("SyncMarks - Warning: "+t),show_noti({title:"Syncmarks - Warning",url:t,key:""},!1);else{document.getElementById("mnguform")&&document.getElementById("mnguform").remove(),document.querySelector("#bookmarks").addEventListener("click",hideMenu,!1);let e=document.createElement("div");e.id="mnguform",e.classList.add("mbmdialog","show-menu");let n=document.createElement("h6");n.appendChild(document.createTextNode("Manage Users")),e.appendChild(n);let d=document.createElement("select");d.id="userSelect";let l=document.createElement("option");l.text=translation.messages.newUser,l.value=0,d.appendChild(l),mngUform(t,d);let o=document.createElement("input");o.id="nuser",o.placeholder=translation.messages.mail,o.type="text",o.required=!0,o.autocomplete="username";let i=document.createElement("input");i.id="npwd",i.placeholder=translation.messages.password,i.type="password",i.autocomplete="password";let s=document.createElement("select");s.id="userLevel";let a=document.createElement("option");a.text="Normal",a.value=1,s.appendChild(a);let r=document.createElement("option");r.text="Admin",r.value=2,s.appendChild(r);let c=document.createElement("div");c.classList.add("dbutton");let m=document.createElement("button");m.id="muadd",m.type="submit",m.disabled=!0,m.innerText=translation.actions.save;let u=document.createElement("button");u.id="mudel",u.type="submit",u.disabled=!0,u.innerText=translation.actions.delete,c.appendChild(m),c.appendChild(u),d.addEventListener("change",function(e){0!=e.target.options[e.target.selectedIndex].value?(o.value=e.target.options[e.target.selectedIndex].text,s.value=e.target.options[e.target.selectedIndex].dataset.lvl,u.disabled=!1):(o.value="",s.value=1,u.disabled=!0)}),o.addEventListener("input",function(){m.disabled=this.originalValue==this.value&&""==this.value}),i.addEventListener("input",function(){m.disabled=this.originalValue==this.value&&""==this.value}),s.addEventListener("change",function(){m.disabled=!1}),e.appendChild(d),e.appendChild(o),e.appendChild(i),e.appendChild(s),e.appendChild(c),addBD(),document.querySelector("body").appendChild(e),m.addEventListener("click",function(e){e.preventDefault();let t=document.createElement("div");t.classList.add("db-spinner"),t.id="db-spinner",document.querySelector("body").appendChild(t);let n=0==d.selectedIndex?1:2,l=JSON.stringify({type:n,p:i.value,userLevel:s.value,nuser:o.value,userSelect:d.options[d.selectedIndex].value});console.log(l),sendRequest(muedt,l)}),u.addEventListener("click",function(e){e.preventDefault();let t=document.createElement("div");t.classList.add("db-spinner"),t.id="db-spinner",document.querySelector("body").appendChild(t);let n=JSON.stringify({type:3,userLevel:s.value,nuser:o.value,userSelect:d.options[d.selectedIndex].value});sendRequest(muedt,n)})}return!1}function cmail(e){if(1==e)document.getElementById("userMail").innerText=mput.value,console.info("Mail changed."),mailform.remove();else{let t=e;console.error(t),show_noti({title:"Syncmarks - Error",url:t,key:""},!1),pwaMessage(t,"error")}}function checkdups(e){delete e.version;var t=Object.values(e);if(t.length>0){let e=document.createElement("div"),n=document.createElement("h6"),d=translation.messages.duplicatesFound;n.innerText=d.replace("%count%",t.length);let l=document.createElement("span");l.innerText=translation.messages.duplicateDelete,e.id="dubDIV",e.classList.add("mbmdialog"),e.appendChild(n),e.appendChild(l),document.querySelector("body").appendChild(e);let o=document.createElement("ul");o.id="dubMenu",t.forEach(function(t){let n=document.createElement("ul");n.classList.add("dubSub");let d=document.createElement("li");d.id="dub_"+t.bmID,d.innerText=t.bmTitle,d.dataset.url=t.bmURL,d.title=t.bmURL,t.subs.forEach(function(e){let t=document.createElement("li");t.classList.add("menuitem"),t.innerText=e.bmTitle,t.dataset.bmid=e.bmID,t.addEventListener("click",function(){let e=this;sendRequest(mdel,JSON.stringify([e.dataset.bmid]),1);let t=document.createElement("div");t.classList.add("db-spinner"),t.id="db-spinner",document.querySelector("body").appendChild(t)});let d=document.createElement("span");d.innerHTML=e.fway,d.title=d.innerHTML,t.appendChild(d),n.appendChild(t)}),d.appendChild(n),o.appendChild(d),e.appendChild(o),addBD(),e.style.display="block"}),document.getElementById("db-spinner")&&document.getElementById("db-spinner").remove()}else document.getElementById("db-spinner")&&document.getElementById("db-spinner").remove(),console.info("No duplicates found"),pwaMessage(translation.messages.duplicateNo,"warn")}function logRefresh(){let e=document.getElementById("arefresh").checked,t=document.getElementById("logfile");"visible"===t.style.visibility&&sendRequest(mrefresh),!0===e&&setTimeout(logRefresh,3e4)}function rmessage(e,t="aNoti"){let n="#"+t,d=(new DOMParser).parseFromString(e,"text/html"),l=document.querySelector(n+" .NotiTable .NotiTableBody");for(;l.firstChild;)l.removeChild(l.lastChild);Array.from(d.body.children).forEach(e=>{e.children[1].children[0].addEventListener("click",delMessage,!1),l.appendChild(e)}),addBD(),document.getElementById("nmessagesform").style.display="block",document.querySelector("#bookmarks").addEventListener("click",hideMenu,!1),document.getElementById("db-spinner")&&document.getElementById("db-spinner").remove()}function bexport(e){let t=new Date,n=t.getDate(),d=t.getMonth()+1;n<10&&(n="0"+n),d<10&&(d="0"+d),t=n+"-"+d+"-"+t.getFullYear();let l=document.createElement("a");if(Array.isArray(e.bookmarks)){const t=e.bookmarks.map(e=>(delete e.userID,e));let n=new Blob([JSON.stringify(t)],{type:"application/json"});l.href=window.URL.createObjectURL(n)}else{let t=new Blob([e.bookmarks],{type:"text/html"});l.href=window.URL.createObjectURL(t)}l.download="bookmarks_"+t,l.click(),console.info("Export successfully, please look in your download folder."),pwaMessage(translation.messages.exportOK,"success"),hideMenu()}function mlog(e){const t=document.getElementById("lfiletext");for(;t.firstChild;)t.firstChild.remove();let n=e.split("\n");n.forEach(function(e){let n=document.createElement("span");e.indexOf("debug")>0?n.classList.add("debug"):e.indexOf("notice")>0?n.classList.add("notice"):e.indexOf("warn")>0?n.classList.add("warn"):e.indexOf("error")>0&&n.classList.add("error"),n.innerText=e,t.appendChild(n)}),moveEnd()}function mclear(e){const t=document.getElementById("lfiletext");for(;t.firstChild;)t.firstChild.remove();let n=e.split("\n");n.forEach(function(e){let n=document.createElement("span");e.indexOf("debug")>0?n.classList.add("debug"):e.indexOf("notice")>0?n.classList.add("notice"):e.indexOf("warn")>0?n.classList.add("warn"):e.indexOf("error")>0&&n.classList.add("error"),n.innerText=e,t.appendChild(n)}),moveEnd(),console.info("Logfile should now be empty.")}function mrefresh(e){const t=document.getElementById("lfiletext");for(;t.firstChild;)t.firstChild.remove();let n=e.split("\n");n.forEach(function(e){let n=document.createElement("span");e.indexOf("debug")>0?n.classList.add("debug"):e.indexOf("notice")>0?n.classList.add("notice"):e.indexOf("warn")>0?n.classList.add("warn"):e.indexOf("error")>0&&n.classList.add("error"),n.innerText=e,t.appendChild(n)}),moveEnd()}function cfolder(e){if(1==e)location.href=location.href;else{let e=translation.messages.folderFail;console.error(e),show_noti({title:"Syncmarks - Error",url:e,key:""},!1),pwaMessage(e,"error")}hideMenu()}function bmedt(e){if(1==e)location.reload();else{let e=translation.messages.changeBMFail;console.error(e),show_noti({title:"Syncmarks - Error",url:e,key:""},!1),pwaMessage(e,"error")}}function bmmv(e){if(!1!==e){let t=document.getElementById(e.id).parentElement,n=document.getElementById("f_"+e.folder);t.remove(),n.lastChild.appendChild(t),t.children[0].classList.remove("bmMarked"),bmIDs.shift()}else{let e=translation.messages.moveFail;show_noti({title:"Syncmarks - Error",url:e,key:""},!1),console.error(e),pwaMessage(e,"error")}}function adel(e){document.getElementById("mngcform").innerHTML=e,document.querySelectorAll("#mngcform li div.remove").forEach(function(e){e.addEventListener("click",delClient,!1)}),document.querySelectorAll("#mngcform li div.rename").forEach(function(e){e.addEventListener("click",mvClient,!1)})}function arename(e){document.getElementById("mngcform").innerHTML=e,document.querySelectorAll("#mngcform li div.remove").forEach(function(e){e.addEventListener("click",delClient,!1)}),document.querySelectorAll("#mngcform li div.rename").forEach(function(e){e.addEventListener("click",mvClient,!1)}),document.getElementById("db-spinner")&&document.getElementById("db-spinner").remove()}function mdel(e){delete e.version,e=Object.values(e),hideMenu(),document.getElementById("db-spinner")&&document.getElementById("db-spinner").remove(),Array.isArray(e)?e[0].forEach(function(e){document.getElementById(e).parentNode.remove()}):(show_noti({title:"Syncmarks - Error",url:e,key:""},!1),console.error(e),pwaMessage(e,"error"))}function soption(e){if("true"==e)console.info("Option saved."),pwaMessage(translation.messages.optionsSaved,"success");else{let e=translation.messages.optionsIssue;show_noti({title:"Syncmarks - Error",url:e,key:""},!1),console.error(e),pwaMessage(e,"error")}}function pushHide(e){if("1"==e)console.info("Notification removed");else{let e=translation.messages.notificationIssue;console.error(e),show_noti({title:"Syncmarks - Error",url:e,key:""},!1),pwaMessage(e,"error")}}function gurls(e){let t=e.notifications;Array.isArray(t)&&t.length>0&&1==e.enabled&&t.forEach(function(e){show_noti(e)}),sessionStorage.setItem("gNoti","1"),navigator.serviceWorker.controller.postMessage({type:"checkIDB"})}function mngUform(e,t){t.options.length=1,e.forEach(function(e){let n=document.createElement("option");n.text=e.userName,n.value=e.userID,n.dataset.lvl=e.userType,t.appendChild(n)})}function delClient(e){sendRequest(adel,e.target.parentElement.id)}function mvClient(e){let t=document.createElement("div");t.classList.add("db-spinner"),t.id="db-spinner",document.querySelector("body").appendChild(t),sendRequest(arename,e.target.parentElement.children[0].children.cname.value,e.target.parentElement.id)}function resize(e){let t=window.innerWidth-parseInt(e.x);document.getElementById("logfile").style.width=t+"px"}function moveEnd(){let e=document.getElementById("lfiletext");e.scrollTop=e.scrollHeight}function delBookmark(e,t){const n=[e];let d=translation.messages.delTitle;mconfirm(d.replace("%bookmark%",t),JSON.stringify(n))}function enableSave(){document.getElementById("url").value.length>7?document.getElementById("save").disabled=!1:document.getElementById("save").disabled=!0}function showMenu(e,t){let n=document.getElementById("cmenu"),d=window.innerHeight-120,l=window.innerWidth-140;return t>=d&&(t=d),e>=l&&(e=l),n.style.left=e+"px",n.style.top=t+"px",n.classList.add("show-menu"),addBD(),!1}function hideMenu(e=!0){let t=document.querySelectorAll(".menu");t.forEach(e=>{e.classList.remove("show-menu")});let n=document.querySelectorAll(".mbmdialog");if(n.forEach(e=>{e.classList.remove("show-menu")}),document.querySelectorAll(".mmenu").forEach(function(e){e.style.display="none"}),document.getElementById("mnubg").style.visibility="hidden",document.getElementById("dubDIV")&&document.querySelector("body").removeChild(document.getElementById("dubDIV")),document.getElementById("mnguform")&&document.getElementById("mnguform").remove(),e){let e=document.querySelectorAll(".bmMarked");for(let t=0;t{n[0].focus()}),n[0].focus(),["text","url","tel"].indexOf(n[0].type)>=0&&n[0].setSelectionRange(0,0)}function onContextMenu(e){e.preventDefault(),e.stopPropagation(),e.cancelBubble=!0,e.returnValue=!1,hideMenu();let t=document.querySelector(".menu");return t.style.display="block",this.querySelector("span").classList.add("bmMarked"),e.target.attributes.id?(document.getElementById("bmid").value=e.target.attributes.id.value,document.getElementById("bmid").title=e.target.attributes.title.value,document.getElementById("btnMove").setAttribute("style","display:block !important"),document.getElementById("btnFolder").setAttribute("style","display:block !important")):(document.getElementById("bmid").value=e.target.nextElementSibling.value,document.getElementById("bmid").title=e.target.textContent,document.getElementById("btnMove").setAttribute("style","display:none !important"),document.getElementById("btnFolder").setAttribute("style","display:none !important")),document.querySelector("#btnEdit").addEventListener("click",onMenuClick,!1),document.querySelector("#btnMove").addEventListener("click",onMenuClick,!1),document.querySelector("#btnDelete").addEventListener("click",onMenuClick,!1),document.querySelector("#btnFolder").addEventListener("click",onMenuClick,!1),showMenu(e.pageX,e.pageY),!1}function onMenuClick(e){var t=155,n=window.innerHeight-200,d=e.pageX,l=e.pageY;switch(d<=t&&(d=t),l>=n&&(l=n),addBD(),this.id){case"btnEdit":document.getElementById("edtitle").value=document.getElementById("bmid").title.split(/\r?\n|\r|\n/g)[0],document.getElementById("edid").value=document.getElementById("bmid").value,document.getElementById(document.getElementById("bmid").value)?(document.getElementById("edurl").value=document.getElementById(document.getElementById("bmid").value).dataset.url,document.getElementById("bmarkedt").firstChild.innerText=translation.messages.editBookmark,document.getElementById("edurl").type="text"):(document.getElementById("edurl").value="",document.getElementById("edurl").type="hidden",document.getElementById("bmarkedt").firstChild.innerText=translation.messages.editFolder),hideMenu(),showDialog("bmarkedt");break;case"btnMove":document.getElementById("mvtitle").innerText=document.getElementById("bmid").title.split(/\r?\n|\r|\n/g)[0],document.getElementById("mvtitle").title=document.getElementById("bmid").title.split(/\r?\n|\r|\n/g)[0],document.getElementById("mvid").value=document.getElementById("bmid").value,hideMenu(),showDialog("bmamove");break;case"btnDelete":setTimeout(delBookmark,5,document.getElementById("bmid").value,document.getElementById("bmid").title.split(/\r?\n|\r|\n/g)[0]);break;case"btnFolder":hideMenu(),showDialog("folderf"),document.getElementById("fbid").value=document.getElementById("bmid").value}document.removeEventListener("click",onMenuClick)}function openMessages(e){var t,n,d;for(n=document.getElementsByClassName("tabcontent"),t=0;t=0&&(window.open(e.url),sendRequest(pushHide,e.nkey))}}}function mconfirm(e,t){hideMenu(!1),addBD(),showDialog("reqdialog");var n=document.getElementById("reqdialog");n.querySelector("span").innerText=e;let d=document.getElementById("ydialog"),l=document.getElementById("ndialog");n.addEventListener("keyup",e=>{const t=["ArrowLeft","ArrowUp","ArrowRight","ArrowDown"];t.includes(e.key)&&(document.activeElement==l?d.focus():document.activeElement==d&&l.focus())}),d.addEventListener("click",delbm,!1),l.addEventListener("click",delbm,!1),d.myparam=t,l.myparam=null}function delbm(e){if("ydialog"==this.id){sendRequest(mdel,e.target.myparam);let t=document.createElement("div");t.classList.add("db-spinner"),t.id="db-spinner",document.querySelector("body").appendChild(t)}hideMenu()}function grndm(e){const t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";let n=" ";const d=t.length;for(let l=0;l{e.addEventListener("click",e=>{hideMenu()})}),window.addEventListener("resize",wsize),document.getElementById("bookmarks")){var e=document.getElementById("bookmarks").cloneNode(!0);document.querySelector("#menu input").addEventListener("keyup",function(t){var n=this.value,d=document.querySelectorAll("#bookmarks li.file"),l=document.getElementById("bookmarks");l.innerHTML="",d.forEach(e=>{l.appendChild(e),e.innerText.toUpperCase().includes(n.toUpperCase())||e.firstChild.dataset.url.toUpperCase().includes(n.toUpperCase())?(e.style.display="block",e.style.paddingLeft="20px"):e.style.display="none"}),""!=n&&27!=t.keyCode||(l.innerHTML=e.innerHTML,document.querySelector("#menu input").value="")}),document.querySelector("#menu button").addEventListener("click",function(){"×"==document.querySelector("#menu button").innerHTML?(document.querySelector("#menu input").blur(),document.querySelector("#menu button").innerHTML="⌕",document.querySelector("#menu button").classList.remove("asform"),document.querySelector("#menu input").classList.remove("asform"),document.querySelector("#menu input").classList.add("isform"),document.getElementById("tbar").style.display="block",document.getElementById("bookmarks").innerHTML=e.innerHTML):(document.querySelector("#menu button").innerHTML="×",document.querySelector("#menu button").classList.add("asform"),document.querySelector("#menu input").classList.remove("isform"),document.querySelector("#menu input").classList.add("asform"),document.getElementById("tbar").style.display="none",document.querySelector("#menu input").focus()),document.querySelector("#menu input").value="",hideMenu()}),document.getElementById("tbar").addEventListener("click",function(){document.querySelector("#menu input").value="","×"==document.querySelector("#menu button").innerHTML?(document.querySelector("#menu input").blur(),document.querySelector("#menu button").innerHTML="⌕",document.querySelector("#menu button").classList.remove("asform"),document.querySelector("#menu input").classList.remove("asform"),document.querySelector("#menu input").classList.add("isform"),document.getElementById("tbar").style.display="block"):(document.querySelector("#menu button").innerHTML="×",document.querySelector("#menu button").classList.add("asform"),document.querySelector("#menu input").classList.remove("isform"),document.querySelector("#menu input").classList.add("asform"),document.getElementById("tbar").style.display="none",document.querySelector("#menu input").focus()),hideMenu()}),document.getElementById("bmsearch").addEventListener("keydown",function(t){"Escape"===t.key&&(document.querySelector("#menu input").blur(),document.querySelector("#menu button").innerHTML="⌕",document.querySelector("#menu button").classList.remove("asform"),document.querySelector("#menu input").classList.remove("asform"),document.querySelector("#menu input").classList.add("isform"),document.getElementById("tbar").style.display="block",document.getElementById("bookmarks").innerHTML=e.innerHTML)}),document.getElementById("logfile")&&document.getElementById("logfile").addEventListener("mousedown",function(e){e.offsetX<3&&document.addEventListener("mousemove",resize,!1)},!1),document.querySelectorAll(".tablinks").forEach(e=>e.addEventListener("click",openMessages,!1)),document.querySelectorAll(".NotiTableCell .fa-trash").forEach(e=>e.addEventListener("click",delMessage,!1)),document.querySelector("#cnoti").addEventListener("change",eNoti,!1),1!=sessionStorage.getItem("gNoti")&&sendRequest(gurls),document.addEventListener("keydown",e=>{"Escape"===e.key&&hideMenu()}),document.querySelector("#mngcform input[type='text']")&&document.querySelector("#mngcform input[type='text']").addEventListener("focus",function(){this.select()}),document.getElementById("save").addEventListener("click",function(e){e.preventDefault(),hideMenu();let t=JSON.stringify({id:Math.random().toString(24).substring(2,14),url:document.getElementById("url").value,title:"",type:"bookmark",folder:document.getElementById("folder").value,nfolder:"More Bookmarks",added:(new Date).valueOf()});sendRequest(addmark,t,2)}),document.getElementById("npwd")&&document.getElementById("npwd").addEventListener("input",function(){checkuform()}),document.getElementById("nuser")&&document.getElementById("nuser").addEventListener("input",function(){checkuform()}),document.getElementById("userLevel")&&document.getElementById("userLevel").addEventListener("input",function(){checkuform()}),document.getElementById("hmenu").addEventListener("click",function(){var e=document.getElementById("mainmenu");document.querySelector("#bookmarks")&&document.querySelector("#bookmarks").addEventListener("click",hideMenu,!1),"block"===e.style.display?e.style.display="none":(hideMenu(),addBD(),e.style.display="block")}),document.getElementById("mngusers")&&document.getElementById("mngusers").addEventListener("click",function(){hideMenu(),sendRequest(getUsers)}),document.getElementById("muser").addEventListener("click",function(e){e.preventDefault(),hideMenu(),addBD(),showDialog("userform"),document.querySelector("#bookmarks").addEventListener("click",hideMenu,!1)}),document.getElementById("mmail").addEventListener("click",function(e){e.preventDefault(),document.getElementById("mailform")&&document.getElementById("mailform").remove(),hideMenu();let t=document.createElement("div");t.id="mailform",t.classList.add("mbmdialog");let n=document.createElement("h6");n.appendChild(document.createTextNode(translation.messages.changeMail));let d=document.createElement("input");d.id="mput",d.value=document.getElementById("userMail").innerText;let l=document.createElement("div");l.classList.add("dbutton");let o=document.createElement("button");o.id="mchange",o.type="submit",o.disabled=!0,o.innerText=translation.actions.save,l.appendChild(o),d.addEventListener("input",function(){ -o.disabled=this.originalValue==this.value&&""==this.value}),o.addEventListener("click",function(){sendRequest(cmail,d.value)});let i=document.createElement("span");i.classList.add("dclose"),i.innerHTML="×",i.addEventListener("click",hideMenu,!1),t.appendChild(n),t.appendChild(d),t.appendChild(l),t.appendChild(i),document.querySelector("body").appendChild(t),addBD(),document.getElementById("mailform").style.display="block",document.querySelector("#bookmarks").addEventListener("click",hideMenu,!1)}),document.querySelectorAll(".mdcancel").forEach(e=>e.addEventListener("click",function(){hideMenu()})),document.getElementById("mpassword").addEventListener("click",function(){hideMenu(),addBD(),showDialog("passwordform"),document.querySelector("#bookmarks").addEventListener("click",hideMenu,!1)}),document.getElementById("ntfy").addEventListener("click",function(){hideMenu(),addBD(),showDialog("pushform"),document.querySelector("#bookmarks").addEventListener("click",hideMenu,!1)}),document.getElementById("bexport").addEventListener("click",function(){hideMenu(),addBD(),showDialog("expimpform"),document.querySelector("#bookmarks").addEventListener("click",hideMenu,!1)}),document.getElementById("nmessages").addEventListener("click",function(){hideMenu();let e=document.createElement("div");e.classList.add("db-spinner"),e.id="db-spinner",document.querySelector("body").appendChild(e),sendRequest(rmessage,null,"aNoti")}),document.getElementById("clientedt").addEventListener("click",function(){hideMenu(),sendRequest(getclients)}),document.getElementById("psettings").addEventListener("click",function(){hideMenu(),addBD(),document.getElementById("mngsform").style.display="block",document.querySelector("#bookmarks").addEventListener("click",hideMenu,!1)}),document.getElementById("duplicates").addEventListener("click",function(){hideMenu();let e=document.createElement("div");e.classList.add("db-spinner"),e.id="db-spinner",document.querySelector("body").appendChild(e),sendRequest(checkdups)}),document.getElementById("ibfile").addEventListener("change",async function(e){var t=new FormData;t.append("file",this.files[0]),t.append("action","bimport"),t.append("data","bimport"),t.append("add","bimport");const n=await fetch(".",{method:"POST",body:t}),d=await n.json();200==d.code?(hideMenu(),pwaMessage(translation.messages.importOK,"success")):pwaMessage(translation.messages.importFail,"error")}),document.getElementById("bmf_im").addEventListener("click",function(e){e.preventDefault(),e.stopPropagation(),document.getElementById("ibfile").click()}),document.getElementById("bmf_ex").addEventListener("click",function(e){e.preventDefault(),e.stopPropagation();let t=document.getElementsByName("eiformat"),n="";for(i=0;i{isValidUrl(e)&&(document.getElementById("url").value=e)}).catch(e=>{console.warn("Failed to read clipboard contents: ",e)}),url.focus(),url.setSelectionRange(0,0),url.addEventListener("input",enableSave)}),document.getElementById("mlog")&&document.getElementById("mlog").addEventListener("click",function(){hideMenu(),addBD();let e=document.getElementById("logfile");"visible"===e.style.visibility?(e.style.visibility="hidden",document.getElementById("close").style.visibility="hidden"):(e.style.visibility="visible",document.getElementById("close").style.visibility="visible",sendRequest(mlog))}),document.getElementById("mclear")&&document.getElementById("mclear").addEventListener("click",function(){sendRequest(mclear)}),document.getElementById("mrefresh")&&document.getElementById("mrefresh").addEventListener("click",logRefresh),document.getElementById("arefresh")&&document.getElementById("arefresh").addEventListener("change",logRefresh),document.getElementById("mclose")&&document.getElementById("mclose").addEventListener("click",function(){"visible"===document.getElementById("logfile").style.visibility&&(document.getElementById("logfile").style.visibility="hidden",document.getElementById("close").style.visibility="hidden",hideMenu())}),document.querySelectorAll("#mngcform .clientname").forEach(function(e){e.addEventListener("touchstart",function(){this.children[0].style.display="block"})}),document.querySelectorAll("#mngcform li div.clientname input").forEach(function(e){e.addEventListener("mouseleave",function(){this.defaultValue!=this.value&&(this.style.display="block",this.parentElement.parentElement.children[2].classList.add("renamea"),this.parentElement.parentElement.children[1].classList.add("renamea"),this.parentElement.parentElement.children[1].classList.remove("rename"),this.parentElement.parentElement.children[2].classList.remove("remove"))})}),document.getElementById("fname").addEventListener("input",function(){document.getElementById("fsave").disabled=!1}),document.getElementById("edtitle").addEventListener("input",function(){document.getElementById("edsave").disabled=!1}),document.getElementById("edurl").addEventListener("input",function(){document.getElementById("edsave").disabled=!1}),document.getElementById("mvfolder").addEventListener("change",function(){document.getElementById("mvsave").disabled=!1}),document.getElementById("fsave").addEventListener("click",function(e){e.preventDefault(),sendRequest(cfolder,document.getElementById("fname").value,document.getElementById("fbid").value)}),document.getElementById("edsave").addEventListener("click",function(e){e.preventDefault();let t=JSON.stringify({id:document.getElementById("edid").value,url:document.getElementById("edurl").value,title:document.getElementById("edtitle").value});sendRequest(bmedt,t)}),document.getElementById("mvsave").addEventListener("click",function(e){e.preventDefault(),sendRequest(bmmv,document.getElementById("mvfolder").value,document.getElementById("mvid").value),document.getElementById("bmamove").style.display="none"}),document.getElementById("mnubg").addEventListener("click",function(){hideMenu()}),document.getElementById("language")&&document.getElementById("language").addEventListener("change",function(e){sendRequest(langupdate,this.value)}),addBookmarkEvents(),navigator.serviceWorker.ready.then(e=>{e.active&&e.active.postMessage({type:"bookmarks",data:document.getElementById("bookmarks").innerHTML})})}if(document.getElementById("sdatabase")){let e=document.getElementById("sdatabase"),l=document.getElementById("mform"),o=document.getElementById("sform"),i=document.getElementById("cdb"),s=document.getElementById("idb"),a=document.getElementById("dbhost"),r=document.getElementById("dbname"),c=document.getElementById("dbuser"),m=document.getElementById("dbpwd"),u=document.getElementById("dbpath");function t(){let t=!1;"mysql"===e.value?t=a.value.length>0&&r.value.length>0&&c.value.length>0&&m.value.length>0:"sqlite"===e.value&&(t=u.value.length>0),i.disabled=!t}function n(){let t={};t.type=e.value,"mysql"===e.value?(t.host=a.value,t.name=r.value,t.user=c.value,t.pwd=m.value):"sqlite"===e.value&&(t.name=u.value),sendRequest(testDB,JSON.stringify(t))}function d(){sendRequest(initDB)}document.querySelectorAll(".next").forEach(e=>{e.addEventListener("click",e=>{if("nextSettings"===e.target.id){let e={};e.logfile=document.getElementById("lfpath").value,e.realm=document.getElementById("realm").value,e.loglevel=document.getElementById("loglevel").value,e.sender=document.getElementById("sender").value,e.suser=document.getElementById("suser").value,e.spwd=document.getElementById("spwd").value,e.enckey=document.getElementById("enckey").value,e.enchash=document.getElementById("enchash").value,e.expireDays=document.getElementById("expireDays").value,sendRequest(saveSettings,JSON.stringify(e))}else e.target.parentElement.style.display="none",e.target.parentElement.nextElementSibling.style.display="block"})}),e.addEventListener("change",()=>{o.style.display="none",l.style.display="none",i.disabled=!0,"mysql"===e.value?(l.style.display="block",o.style.display="none",a.focus()):"sqlite"===e.value&&(l.style.display="none",o.style.display="block",u.focus())}),i.addEventListener("click",n),s.addEventListener("click",d),a.addEventListener("change",t),r.addEventListener("change",t),c.addEventListener("change",t),m.addEventListener("change",t),u.addEventListener("change",t)}},!1),window.addEventListener("keydown",function(e){e.ctrlKey&&"KeyF"===e.code&&(e.preventDefault(),document.getElementById("bmsearch").focus(),document.querySelector("#menu button").innerHTML="×",document.querySelector("#menu input").value="",document.querySelector("#menu button").classList.add("asform"),document.querySelector("#menu input").classList.remove("isform"),document.querySelector("#menu input").classList.add("asform"),document.getElementById("tbar").style.display="none",document.querySelector("#menu input").focus()),rmBm(e)});var bmIDs=new Array;const isValidUrl=e=>{let t;try{t=new URL(e)}catch(e){return!1}return"http:"===t.protocol||"https:"===t.protocol}; \ No newline at end of file +function addBookmarkEvents(){var e;document.addEventListener("mouseup",function(){document.removeEventListener("mousemove",resize,!1)},!1),document.querySelectorAll(".file").forEach(function(e){/iPhone|iPad|iPod|Android/i.test(navigator.userAgent)&&e.children[0].setAttribute("draggable",!1),e.addEventListener("contextmenu",onContextMenu,!1),e.addEventListener("mouseup",clicCheck,!1),e.addEventListener("dragstart",function(e){e.target.style.opacity=".3",e.dataTransfer.effectAllowed="move"}),e.addEventListener("dragend",function(e){e.target.style.opacity=""})}),document.querySelectorAll(".folder").forEach(e=>e.addEventListener("mouseup",clicCheck,!1)),document.querySelectorAll(".folder").forEach(e=>e.addEventListener("contextmenu",onContextMenu,!1)),document.querySelectorAll(".lbl").forEach(function(t){t.addEventListener("mouseup",openFolderBookmarks,!1),t.addEventListener("dragover",function(e){e.preventDefault(),e.dataTransfer.dropEffect="move"}),t.addEventListener("dragenter",function(){this.style="background-color: lightblue;"}),t.addEventListener("dragleave",function(){this.style="background-color: unset;"}),t.addEventListener("drop",function(t){t.preventDefault();let n=t.target.htmlFor.substring(2);0===bmIDs.length&&bmIDs.push(e.target.id),bmIDs.forEach(e=>sendRequest(bmmv,n,e)),t.target.style="background-color: unset;"})}),document.addEventListener("drag",function(t){e=t}),document.getElementById("bookmarks").addEventListener("keyup",rmBm),document.querySelectorAll(".file").forEach(e=>e.addEventListener("contextmenu",onContextMenu,!1)),document.querySelectorAll(".file").forEach(e=>e.addEventListener("mouseup",clicCheck,!1)),document.querySelectorAll(".folder").forEach(e=>e.addEventListener("mouseup",clicCheck,!1)),document.querySelectorAll(".folder").forEach(e=>e.addEventListener("contextmenu",onContextMenu,!1))}async function setLanguage(e){let t=await fetch("locale/"+e+".json");translation=await t.json(),document.getElementById("footer")&&wsize()}function wsize(){document.getElementById("footer").innerText=/iPhone|iPad|iPod|Android/i.test(navigator.userAgent)?" + ":translation.actions.addBookmark}function clicCheck(e){let t=this.children[0];switch(e.button){case 0:e.ctrlKey?t.classList.contains("bmMarked")?(-1!==bmIDs.indexOf(t.id)&&bmIDs.splice(bmIDs.indexOf(t.id),1),t.classList.remove("bmMarked")):(t.classList.add("bmMarked"),bmIDs.push(t.id)):void 0!==e.srcElement.dataset.url&&window.open(e.srcElement.dataset.url,"_blank","noopener,noreferrer");break;case 1:void 0!==e.srcElement.dataset.url&&window.open(e.srcElement.dataset.url,"_blank","noopener,noreferrer")}}function addBD(){menubg=document.getElementById("mnubg"),menubg.style.visibility="visible",document.getElementById("mnubg").style.visibility="visible"}function openFolderBookmarks(e){if(e.ctrlKey&&0==e.button||1==e.button){this.htmlFor.substring(2);let e=this.parentElement.children[2].childNodes;e.forEach(function(e){if(null!=e.className&&e.className.indexOf("file")>-1){let t=e.children[0];t.click()}})}}function rmBm(e){if(46==e.keyCode&&bmIDs.length>0){let e=translation.messages.delCount;mconfirm(e.replace("%count%",bmIDs.length),JSON.stringify(bmIDs))}}function sendRequest(e,t=null,n=null){const d={action:e.name,client:0,data:t,add:n,sync:null},o=new XMLHttpRequest;o.open("POST",document.location.href,!0),o.setRequestHeader("Content-type","application/x-www-form-urlencoded"),o.responseType="json",o.onreadystatechange=function(){if(4===o.readyState)if(o.status>199&&o.status<299)e(o.response,n);else{let t=`Error ${o.status}: ${o.statusText}`;console.warn(e.name,t),pwaMessage(e.name+": "+t,"error")}},o.onerror=function(){let t="Error: "+o.status+" | "+o.response;return console.warn(e.name,url,t),!1};const l=new URLSearchParams(d);o.send(l)}function pwaMessage(e,t){var n=document.getElementById("pwamessage");return n.classList.add(t),n.innerText=e,n.classList.add("show"),setTimeout(function(){n.className=n.classList.remove("show")},7e3),!1}function testDB(e){let t=document.getElementById("dbhost"),n=document.getElementById("dbname"),d=document.getElementById("dbuser"),o=document.getElementById("dbpwd"),l=document.getElementById("dbpath"),i=document.getElementById("cdb"),a=document.getElementById("idb");switch(e.code){case 200:t.classList.add("valid"),n.classList.add("valid"),d.classList.add("valid"),o.classList.add("valid"),l.classList.add("valid"),i.classList.add("valid"),i.disabled=!0,a.disabled=!1,o.classList.remove("invalid"),d.classList.remove("invalid"),i.classList.remove("invalid");break;case 250:console.warn(e.message),pwaMessage(e.message,"error"),a.disabled=!0,e.message.includes("Access denied")&&(o.classList.add("invalid"),d.classList.add("invalid"),i.classList.add("invalid"),n.classList.add("valid"),l.classList.add("valid"));break;default:console.error(e.message),a.disabled=!0}}function initDB(e){let t=document.getElementById("idb"),n=document.getElementById("nextSetup");switch(e.code){case 200:t.classList.add("valid"),t.classList.remove("warn"),t.disabled=!0,n.disabled=!1;break;case 250:t.classList.add("warn"),pwaMessage(e.message,"error");break;default:t.classList.add("invalid")}}function saveSettings(e){switch(console.log(e),e.code){case 200:location.reload();break;case 250:default:document.getElementById("nextSettings").classList.add("warn"),pwaMessage(e.message,"error")}}function getclients(e){let t=e.clients;var n=document.getElementById("mngcform");n.childNodes.length&&n.removeChild(n.firstChild);var d=document.createElement("ul");t.forEach(function(e,t){if("0"!=e.id){let t=document.createElement("li");t.title=e.id,t.dataset.type=e.type.toLowerCase(),t.id=e.id,t.classList="client";let n=document.createElement("div");n.classList="clientname",n.appendChild(document.createTextNode(e.name?e.name:e.id)),t.appendChild(n);let o=document.createElement("input");o.type="text",o.name="cname",o.value=e.name,n.appendChild(o);let l=document.createElement("div");l.classList="lastseen",l.innerText="0"!=e.date?"Sync: "+new Date(parseInt(e.date)).toLocaleString(navigator.language,{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"}):"Sync: -- -- ---- -- --",n.appendChild(l);let i=document.createElement("div");i.classList="fa-edit rename",i.addEventListener("click",mvClient,!1),t.appendChild(i);let a=document.createElement("div");a.classList="fa-trash remove",a.addEventListener("click",delClient,!1),t.appendChild(a),d.appendChild(t)}}),n.appendChild(d),addBD(),document.getElementById("mngcform").style.display="block",document.querySelector("#bookmarks").addEventListener("click",hideMenu,!1)}function langupdate(e){location.reload()}function addmark(e){let t=translation.messages.bmAddedOK;200!==e.code?t=translation.messages.bmAddedFail:(document.getElementById("bookmarks").innerHTML=e.html_bookmarks,document.querySelectorAll(".file").forEach(e=>e.addEventListener("contextmenu",onContextMenu,!1)),document.querySelectorAll(".file").forEach(e=>e.addEventListener("mouseup",clicCheck,!1)),document.querySelectorAll(".folder").forEach(e=>e.addEventListener("mouseup",clicCheck,!1)),document.querySelectorAll(".folder").forEach(e=>e.addEventListener("contextmenu",onContextMenu,!1))),console.info(t);let n=t.includes("not")?"warn":"success";pwaMessage(t,n)}function muedt(e){document.getElementById("db-spinner")&&document.getElementById("db-spinner").remove(),e=""+e,-1!=e.indexOf("failed")?(console.error("Syncmarks: "+e),show_noti({title:"Syncmarks - Error",url:e,key:""},!1)):-1!=e.indexOf("not send")&&(console.warn("Syncmarks: "+e),pwaMessage(e,"error")),sendRequest(getUsers)}function getUsers(e){let t=e;if(-1!=t.indexOf("not allowed"))console.warn("SyncMarks - Warning: "+t),show_noti({title:"Syncmarks - Warning",url:t,key:""},!1);else{document.getElementById("mnguform")&&document.getElementById("mnguform").remove(),document.querySelector("#bookmarks").addEventListener("click",hideMenu,!1);let e=document.createElement("div");e.id="mnguform",e.classList.add("mbmdialog","show-menu");let n=document.createElement("h6");n.appendChild(document.createTextNode("Manage Users")),e.appendChild(n);let d=document.createElement("select");d.id="userSelect";let o=document.createElement("option");o.text=translation.messages.newUser,o.value=0,d.appendChild(o),mngUform(t,d);let l=document.createElement("input");l.id="nuser",l.placeholder=translation.messages.mail,l.type="text",l.required=!0,l.autocomplete="username";let i=document.createElement("input");i.id="npwd",i.placeholder=translation.messages.password,i.type="password",i.autocomplete="password";let a=document.createElement("select");a.id="userLevel";let s=document.createElement("option");s.text="Normal",s.value=1,a.appendChild(s);let r=document.createElement("option");r.text="Admin",r.value=2,a.appendChild(r);let c=document.createElement("div");c.classList.add("dbutton");let m=document.createElement("button");m.id="muadd",m.type="submit",m.disabled=!0,m.innerText=translation.actions.save;let u=document.createElement("button");u.id="mudel",u.type="submit",u.disabled=!0,u.innerText=translation.actions.delete,c.appendChild(m),c.appendChild(u),d.addEventListener("change",function(e){0!=e.target.options[e.target.selectedIndex].value?(l.value=e.target.options[e.target.selectedIndex].text,a.value=e.target.options[e.target.selectedIndex].dataset.lvl,u.disabled=!1):(l.value="",a.value=1,u.disabled=!0)}),l.addEventListener("input",function(){m.disabled=this.originalValue==this.value&&""==this.value}),i.addEventListener("input",function(){m.disabled=this.originalValue==this.value&&""==this.value}),a.addEventListener("change",function(){m.disabled=!1}),e.appendChild(d),e.appendChild(l),e.appendChild(i),e.appendChild(a),e.appendChild(c),addBD(),document.querySelector("body").appendChild(e),m.addEventListener("click",function(e){e.preventDefault();let t=document.createElement("div");t.classList.add("db-spinner"),t.id="db-spinner",document.querySelector("body").appendChild(t);let n=0==d.selectedIndex?1:2,o=JSON.stringify({type:n,p:i.value,userLevel:a.value,nuser:l.value,userSelect:d.options[d.selectedIndex].value});console.log(o),sendRequest(muedt,o)}),u.addEventListener("click",function(e){e.preventDefault();let t=document.createElement("div");t.classList.add("db-spinner"),t.id="db-spinner",document.querySelector("body").appendChild(t);let n=JSON.stringify({type:3,userLevel:a.value,nuser:l.value,userSelect:d.options[d.selectedIndex].value});sendRequest(muedt,n)})}return!1}function cmail(e){if(1==e)document.getElementById("userMail").innerText=mput.value,console.info("Mail changed."),mailform.remove();else{let t=e;console.error(t),show_noti({title:"Syncmarks - Error",url:t,key:""},!1),pwaMessage(t,"error")}}function checkdups(e){delete e.version;var t=Object.values(e);if(t.length>0){let e=document.createElement("div"),n=document.createElement("h6"),d=translation.messages.duplicatesFound;n.innerText=d.replace("%count%",t.length);let o=document.createElement("span");o.innerText=translation.messages.duplicateDelete,e.id="dubDIV",e.classList.add("mbmdialog"),e.appendChild(n),e.appendChild(o),document.querySelector("body").appendChild(e);let l=document.createElement("ul");l.id="dubMenu",t.forEach(function(t){let n=document.createElement("ul");n.classList.add("dubSub");let d=document.createElement("li");d.id="dub_"+t.bmID,d.innerText=t.bmTitle,d.dataset.url=t.bmURL,d.title=t.bmURL,t.subs.forEach(function(e){let t=document.createElement("li");t.classList.add("menuitem"),t.innerText=e.bmTitle,t.dataset.bmid=e.bmID,t.addEventListener("click",function(){let e=this;sendRequest(mdel,JSON.stringify([e.dataset.bmid]),1);let t=document.createElement("div");t.classList.add("db-spinner"),t.id="db-spinner",document.querySelector("body").appendChild(t)});let d=document.createElement("span");d.innerHTML=e.fway,d.title=d.innerHTML,t.appendChild(d),n.appendChild(t)}),d.appendChild(n),l.appendChild(d),e.appendChild(l),addBD(),e.style.display="block"}),document.getElementById("db-spinner")&&document.getElementById("db-spinner").remove()}else document.getElementById("db-spinner")&&document.getElementById("db-spinner").remove(),console.info("No duplicates found"),pwaMessage(translation.messages.duplicateNo,"warn")}function logRefresh(){let e=document.getElementById("arefresh").checked,t=document.getElementById("logfile");"visible"===t.style.visibility&&sendRequest(mrefresh),!0===e&&setTimeout(logRefresh,3e4)}function rmessage(e,t="aNoti"){let n="#"+t,d=(new DOMParser).parseFromString(e,"text/html"),o=document.querySelector(n+" .NotiTable .NotiTableBody");for(;o.firstChild;)o.removeChild(o.lastChild);Array.from(d.body.children).forEach(e=>{e.children[1].children[0].addEventListener("click",delMessage,!1),o.appendChild(e)}),addBD(),document.getElementById("nmessagesform").style.display="block",document.querySelector("#bookmarks").addEventListener("click",hideMenu,!1),document.getElementById("db-spinner")&&document.getElementById("db-spinner").remove()}function bexport(e){let t=new Date,n=t.getDate(),d=t.getMonth()+1;n<10&&(n="0"+n),d<10&&(d="0"+d),t=n+"-"+d+"-"+t.getFullYear();let o=document.createElement("a");if(Array.isArray(e.bookmarks)){const t=e.bookmarks.map(e=>(delete e.userID,e));let n=new Blob([JSON.stringify(t)],{type:"application/json"});o.href=window.URL.createObjectURL(n)}else{let t=new Blob([e.bookmarks],{type:"text/html"});o.href=window.URL.createObjectURL(t)}o.download="bookmarks_"+t,o.click(),console.info("Export successfully, please look in your download folder."),pwaMessage(translation.messages.exportOK,"success"),hideMenu()}function mlog(e){const t=document.getElementById("lfiletext");for(;t.firstChild;)t.firstChild.remove();let n=e.split("\n");n.forEach(function(e){let n=document.createElement("span");e.indexOf("debug")>0?n.classList.add("debug"):e.indexOf("notice")>0?n.classList.add("notice"):e.indexOf("warn")>0?n.classList.add("warn"):e.indexOf("error")>0&&n.classList.add("error"),n.innerText=e,t.appendChild(n)}),moveEnd()}function mclear(e){const t=document.getElementById("lfiletext");for(;t.firstChild;)t.firstChild.remove();let n=e.split("\n");n.forEach(function(e){let n=document.createElement("span");e.indexOf("debug")>0?n.classList.add("debug"):e.indexOf("notice")>0?n.classList.add("notice"):e.indexOf("warn")>0?n.classList.add("warn"):e.indexOf("error")>0&&n.classList.add("error"),n.innerText=e,t.appendChild(n)}),moveEnd(),console.info("Logfile should now be empty.")}function mrefresh(e){const t=document.getElementById("lfiletext");for(;t.firstChild;)t.firstChild.remove();let n=e.split("\n");n.forEach(function(e){let n=document.createElement("span");e.indexOf("debug")>0?n.classList.add("debug"):e.indexOf("notice")>0?n.classList.add("notice"):e.indexOf("warn")>0?n.classList.add("warn"):e.indexOf("error")>0&&n.classList.add("error"),n.innerText=e,t.appendChild(n)}),moveEnd()}function cfolder(e){if(1==e)location.href=location.href;else{let e=translation.messages.folderFail;console.error(e),show_noti({title:"Syncmarks - Error",url:e,key:""},!1),pwaMessage(e,"error")}hideMenu()}function bmedt(e){if(1==e)location.reload();else{let e=translation.messages.changeBMFail;console.error(e),show_noti({title:"Syncmarks - Error",url:e,key:""},!1),pwaMessage(e,"error")}}function bmmv(e){if(!1!==e){let t=document.getElementById(e.id).parentElement,n=document.getElementById("f_"+e.folder);t.remove(),n.lastChild.appendChild(t),t.children[0].classList.remove("bmMarked"),bmIDs.shift()}else{let e=translation.messages.moveFail;show_noti({title:"Syncmarks - Error",url:e,key:""},!1),console.error(e),pwaMessage(e,"error")}}function adel(e){document.getElementById("mngcform").innerHTML=e,document.querySelectorAll("#mngcform li div.remove").forEach(function(e){e.addEventListener("click",delClient,!1)}),document.querySelectorAll("#mngcform li div.rename").forEach(function(e){e.addEventListener("click",mvClient,!1)})}function arename(e){document.getElementById("mngcform").innerHTML=e,document.querySelectorAll("#mngcform li div.remove").forEach(function(e){e.addEventListener("click",delClient,!1)}),document.querySelectorAll("#mngcform li div.rename").forEach(function(e){e.addEventListener("click",mvClient,!1)}),document.getElementById("db-spinner")&&document.getElementById("db-spinner").remove()}function mdel(e){delete e.version,e=Object.values(e),hideMenu(),document.getElementById("db-spinner")&&document.getElementById("db-spinner").remove(),Array.isArray(e)?e[0].forEach(function(e){document.getElementById(e).parentNode.remove()}):(show_noti({title:"Syncmarks - Error",url:e,key:""},!1),console.error(e),pwaMessage(e,"error"))}function soption(e){if("true"==e)console.info("Option saved."),pwaMessage(translation.messages.optionsSaved,"success");else{let e=translation.messages.optionsIssue;show_noti({title:"Syncmarks - Error",url:e,key:""},!1),console.error(e),pwaMessage(e,"error")}}function pushHide(e){if("1"==e)console.info("Notification removed");else{let e=translation.messages.notificationIssue;console.error(e),show_noti({title:"Syncmarks - Error",url:e,key:""},!1),pwaMessage(e,"error")}}function gurls(e){let t=e.notifications;Array.isArray(t)&&t.length>0&&1==e.enabled&&t.forEach(function(e){show_noti(e)}),sessionStorage.setItem("gNoti","1"),navigator.serviceWorker.controller.postMessage({type:"checkIDB"})}function mngUform(e,t){t.options.length=1,e.forEach(function(e){let n=document.createElement("option");n.text=e.userName,n.value=e.userID,n.dataset.lvl=e.userType,t.appendChild(n)})}function delClient(e){sendRequest(adel,e.target.parentElement.id)}function mvClient(e){let t=document.createElement("div");t.classList.add("db-spinner"),t.id="db-spinner",document.querySelector("body").appendChild(t),sendRequest(arename,e.target.parentElement.children[0].children.cname.value,e.target.parentElement.id)}function resize(e){let t=window.innerWidth-parseInt(e.x);document.getElementById("logfile").style.width=t+"px"}function moveEnd(){let e=document.getElementById("lfiletext");e.scrollTop=e.scrollHeight}function delBookmark(e,t){const n=[e];let d=translation.messages.delTitle;mconfirm(d.replace("%bookmark%",t),JSON.stringify(n))}function enableSave(){document.getElementById("url").value.length>7?document.getElementById("save").disabled=!1:document.getElementById("save").disabled=!0}function showMenu(e,t){let n=document.getElementById("cmenu"),d=window.innerHeight-120,o=window.innerWidth-140;return t>=d&&(t=d),e>=o&&(e=o),n.style.left=e+"px",n.style.top=t+"px",n.classList.add("show-menu"),addBD(),!1}function hideMenu(e=!0){let t=document.querySelectorAll(".menu");t.forEach(e=>{e.classList.remove("show-menu")});let n=document.querySelectorAll(".mbmdialog");if(n.forEach(e=>{e.classList.remove("show-menu")}),document.querySelectorAll(".mmenu").forEach(function(e){e.style.display="none"}),document.getElementById("mnubg").style.visibility="hidden",document.getElementById("dubDIV")&&document.querySelector("body").removeChild(document.getElementById("dubDIV")),document.getElementById("mnguform")&&document.getElementById("mnguform").remove(),e){let e=document.querySelectorAll(".bmMarked");for(let t=0;t{n[0].focus()}),n[0].focus(),["text","url","tel"].indexOf(n[0].type)>=0&&n[0].setSelectionRange(0,0)}function onContextMenu(e){e.preventDefault(),e.stopPropagation(),e.cancelBubble=!0,e.returnValue=!1,hideMenu();let t=document.querySelector(".menu");return t.style.display="block",this.querySelector("span").classList.add("bmMarked"),e.target.attributes.id?(document.getElementById("bmid").value=e.target.attributes.id.value,document.getElementById("bmid").title=e.target.attributes.title.value,document.getElementById("btnMove").setAttribute("style","display:block !important"),document.getElementById("btnFolder").setAttribute("style","display:block !important")):(document.getElementById("bmid").value=e.target.nextElementSibling.value,document.getElementById("bmid").title=e.target.textContent,document.getElementById("btnMove").setAttribute("style","display:none !important"),document.getElementById("btnFolder").setAttribute("style","display:none !important")),document.querySelector("#btnEdit").addEventListener("click",onMenuClick,!1),document.querySelector("#btnMove").addEventListener("click",onMenuClick,!1),document.querySelector("#btnDelete").addEventListener("click",onMenuClick,!1),document.querySelector("#btnFolder").addEventListener("click",onMenuClick,!1),showMenu(e.pageX,e.pageY),!1}function onMenuClick(e){var t=155,n=window.innerHeight-200,d=e.pageX,o=e.pageY;switch(d<=t&&(d=t),o>=n&&(o=n),addBD(),this.id){case"btnEdit":document.getElementById("edtitle").value=document.getElementById("bmid").title.split(/\r?\n|\r|\n/g)[0],document.getElementById("edid").value=document.getElementById("bmid").value,document.getElementById(document.getElementById("bmid").value)?(document.getElementById("edurl").value=document.getElementById(document.getElementById("bmid").value).dataset.url,document.getElementById("bmarkedt").firstChild.innerText=translation.messages.editBookmark,document.getElementById("edurl").type="text"):(document.getElementById("edurl").value="",document.getElementById("edurl").type="hidden",document.getElementById("bmarkedt").firstChild.innerText=translation.messages.editFolder),hideMenu(),showDialog("bmarkedt");break;case"btnMove":document.getElementById("mvtitle").innerText=document.getElementById("bmid").title.split(/\r?\n|\r|\n/g)[0],document.getElementById("mvtitle").title=document.getElementById("bmid").title.split(/\r?\n|\r|\n/g)[0],document.getElementById("mvid").value=document.getElementById("bmid").value,hideMenu(),showDialog("bmamove");break;case"btnDelete":setTimeout(delBookmark,5,document.getElementById("bmid").value,document.getElementById("bmid").title.split(/\r?\n|\r|\n/g)[0]);break;case"btnFolder":hideMenu(),showDialog("folderf"),document.getElementById("fbid").value=document.getElementById("bmid").value}document.removeEventListener("click",onMenuClick)}function openMessages(e){var t,n,d;for(n=document.getElementsByClassName("tabcontent"),t=0;t=0&&(window.open(e.url),sendRequest(pushHide,e.nkey))}}}function mconfirm(e,t){hideMenu(!1),addBD(),showDialog("reqdialog");var n=document.getElementById("reqdialog");n.querySelector("span").innerText=e;let d=document.getElementById("ydialog"),o=document.getElementById("ndialog");n.addEventListener("keyup",e=>{const t=["ArrowLeft","ArrowUp","ArrowRight","ArrowDown"];t.includes(e.key)&&(document.activeElement==o?d.focus():document.activeElement==d&&o.focus())}),d.addEventListener("click",delbm,!1),o.addEventListener("click",delbm,!1),d.myparam=t,o.myparam=null}function delbm(e){if("ydialog"==this.id){sendRequest(mdel,e.target.myparam);let t=document.createElement("div");t.classList.add("db-spinner"),t.id="db-spinner",document.querySelector("body").appendChild(t)}hideMenu()}function grndm(e){const t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";let n=" ";const d=t.length;for(let o=0;o{if(e.data&&"openDialog"===e.data.type&&(showDialog("bmarkadd"),document.getElementById("url").value=e.data.data),e.data.addbm)return document.getElementById("footer").click(),!1;if(e.data.sharemark)return sendRequest(addmark,e.data.sharemark,2),sessionStorage.setItem("gNoti",1),!1;if(e.data.delmsaved)return sendRequest(mdel,e.data.delmsaved),!1;if(e.data.bookmarksAddedDB,e.data.clientOffline){document.getElementById("db-spinner")&&document.getElementById("db-spinner").remove(),console.warn(e.data.clientOffline),pwaMessage(e.data.clientOffline,"warn");let t=indexedDB.open(dbName);t.onsuccess=(e=>{let t=e.target.result;const n=t.transaction(dbStoreName,"readwrite"),d=n.objectStore(dbStoreName),o=d.get("bookmarks");o.onsuccess=function(e){document.getElementById("bookmarks").innerHTML=o.result,addBookmarkEvents()}})}}),navigator.serviceWorker.addEventListener("controllerchange",e=>{}),setLanguage(document.documentElement.lang),"?"===window.location.href.slice(-1)&&window.history.replaceState({},null,window.location.href.substring(0,window.location.href.length-1)),document.getElementById("preset")&&document.getElementById("preset").addEventListener("click",function(e){e.preventDefault();let t="reset=request&u="+e.target.dataset.reset,n=location.protocol+"//"+location.host+location.pathname;const d=new XMLHttpRequest;d.open("GET",n+"?"+t,!0),d.onreadystatechange=function(){if(4==this.readyState&&200==this.status&&1==JSON.parse(this.responseText)){let e=document.getElementById("loginformt");e.classList.toggle("info"),e.innerText=translation.messages.passwordResetSend}},d.send(null)}),document.getElementById("uf")&&document.getElementById("uf").focus(),document.getElementById("loginbody")&&(document.getElementById("hmenu").classList.add("inlogin1"),document.querySelector("#menu button").classList.add("inlogin2")),document.querySelectorAll(".dclose").forEach(e=>{e.addEventListener("click",e=>{hideMenu()})}),window.addEventListener("resize",wsize),document.getElementById("bookmarks")){var e=document.getElementById("bookmarks").cloneNode(!0);document.querySelector("#menu input").addEventListener("keyup",function(t){var n=this.value,d=document.querySelectorAll("#bookmarks li.file"),o=document.getElementById("bookmarks");o.innerHTML="",d.forEach(e=>{o.appendChild(e),e.innerText.toUpperCase().includes(n.toUpperCase())||e.firstChild.dataset.url.toUpperCase().includes(n.toUpperCase())?(e.style.display="block",e.style.paddingLeft="20px"):e.style.display="none"}),""!=n&&27!=t.keyCode||(o.innerHTML=e.innerHTML,document.querySelector("#menu input").value="")}),document.querySelector("#menu button").addEventListener("click",function(){"×"==document.querySelector("#menu button").innerHTML?(document.querySelector("#menu input").blur(),document.querySelector("#menu button").innerHTML="⌕",document.querySelector("#menu button").classList.remove("asform"),document.querySelector("#menu input").classList.remove("asform"),document.querySelector("#menu input").classList.add("isform"),document.getElementById("tbar").style.display="block",document.getElementById("bookmarks").innerHTML=e.innerHTML):(document.querySelector("#menu button").innerHTML="×",document.querySelector("#menu button").classList.add("asform"),document.querySelector("#menu input").classList.remove("isform"),document.querySelector("#menu input").classList.add("asform"),document.getElementById("tbar").style.display="none",document.querySelector("#menu input").focus()),document.querySelector("#menu input").value="",hideMenu()}),document.getElementById("tbar").addEventListener("click",function(){document.querySelector("#menu input").value="","×"==document.querySelector("#menu button").innerHTML?(document.querySelector("#menu input").blur(),document.querySelector("#menu button").innerHTML="⌕",document.querySelector("#menu button").classList.remove("asform"),document.querySelector("#menu input").classList.remove("asform"),document.querySelector("#menu input").classList.add("isform"),document.getElementById("tbar").style.display="block"):(document.querySelector("#menu button").innerHTML="×",document.querySelector("#menu button").classList.add("asform"),document.querySelector("#menu input").classList.remove("isform"),document.querySelector("#menu input").classList.add("asform"),document.getElementById("tbar").style.display="none",document.querySelector("#menu input").focus()),hideMenu()}),document.getElementById("bmsearch").addEventListener("keydown",function(t){"Escape"===t.key&&(document.querySelector("#menu input").blur(),document.querySelector("#menu button").innerHTML="⌕",document.querySelector("#menu button").classList.remove("asform"),document.querySelector("#menu input").classList.remove("asform"),document.querySelector("#menu input").classList.add("isform"),document.getElementById("tbar").style.display="block",document.getElementById("bookmarks").innerHTML=e.innerHTML)}),document.getElementById("logfile")&&document.getElementById("logfile").addEventListener("mousedown",function(e){e.offsetX<3&&document.addEventListener("mousemove",resize,!1)},!1),document.querySelectorAll(".tablinks").forEach(e=>e.addEventListener("click",openMessages,!1)),document.querySelectorAll(".NotiTableCell .fa-trash").forEach(e=>e.addEventListener("click",delMessage,!1)),document.querySelector("#cnoti").addEventListener("change",eNoti,!1),1!=sessionStorage.getItem("gNoti")&&sendRequest(gurls),document.addEventListener("keydown",e=>{"Escape"===e.key&&hideMenu()}),document.querySelector("#mngcform input[type='text']")&&document.querySelector("#mngcform input[type='text']").addEventListener("focus",function(){this.select()}),document.getElementById("save").addEventListener("click",function(e){e.preventDefault(),hideMenu();let t=JSON.stringify({id:Math.random().toString(24).substring(2,14),url:document.getElementById("url").value,title:"",type:"bookmark",folder:document.getElementById("folder").value,nfolder:"More Bookmarks",added:(new Date).valueOf()});sendRequest(addmark,t,2)}),document.getElementById("npwd")&&document.getElementById("npwd").addEventListener("input",function(){checkuform()}),document.getElementById("nuser")&&document.getElementById("nuser").addEventListener("input",function(){checkuform()}),document.getElementById("userLevel")&&document.getElementById("userLevel").addEventListener("input",function(){checkuform()}),document.getElementById("hmenu").addEventListener("click",function(){var e=document.getElementById("mainmenu") +;document.querySelector("#bookmarks")&&document.querySelector("#bookmarks").addEventListener("click",hideMenu,!1),"block"===e.style.display?e.style.display="none":(hideMenu(),addBD(),e.style.display="block")}),document.getElementById("mngusers")&&document.getElementById("mngusers").addEventListener("click",function(){hideMenu(),sendRequest(getUsers)}),document.getElementById("muser").addEventListener("click",function(e){e.preventDefault(),hideMenu(),addBD(),showDialog("userform"),document.querySelector("#bookmarks").addEventListener("click",hideMenu,!1)}),document.getElementById("mmail").addEventListener("click",function(e){e.preventDefault(),document.getElementById("mailform")&&document.getElementById("mailform").remove(),hideMenu();let t=document.createElement("div");t.id="mailform",t.classList.add("mbmdialog");let n=document.createElement("h6");n.appendChild(document.createTextNode(translation.messages.changeMail));let d=document.createElement("input");d.id="mput",d.value=document.getElementById("userMail").innerText;let o=document.createElement("div");o.classList.add("dbutton");let l=document.createElement("button");l.id="mchange",l.type="submit",l.disabled=!0,l.innerText=translation.actions.save,o.appendChild(l),d.addEventListener("input",function(){l.disabled=this.originalValue==this.value&&""==this.value}),l.addEventListener("click",function(){sendRequest(cmail,d.value)});let i=document.createElement("span");i.classList.add("dclose"),i.innerHTML="×",i.addEventListener("click",hideMenu,!1),t.appendChild(n),t.appendChild(d),t.appendChild(o),t.appendChild(i),document.querySelector("body").appendChild(t),addBD(),document.getElementById("mailform").style.display="block",document.querySelector("#bookmarks").addEventListener("click",hideMenu,!1)}),document.querySelectorAll(".mdcancel").forEach(e=>e.addEventListener("click",function(){hideMenu()})),document.getElementById("mpassword").addEventListener("click",function(){hideMenu(),addBD(),showDialog("passwordform"),document.querySelector("#bookmarks").addEventListener("click",hideMenu,!1)}),document.getElementById("ntfy").addEventListener("click",function(){hideMenu(),addBD(),showDialog("pushform"),document.querySelector("#bookmarks").addEventListener("click",hideMenu,!1)}),document.getElementById("bexport").addEventListener("click",function(){hideMenu(),addBD(),showDialog("expimpform"),document.querySelector("#bookmarks").addEventListener("click",hideMenu,!1)}),document.getElementById("nmessages").addEventListener("click",function(){hideMenu();let e=document.createElement("div");e.classList.add("db-spinner"),e.id="db-spinner",document.querySelector("body").appendChild(e),sendRequest(rmessage,null,"aNoti")}),document.getElementById("clientedt").addEventListener("click",function(){hideMenu(),sendRequest(getclients)}),document.getElementById("psettings").addEventListener("click",function(){hideMenu(),addBD(),document.getElementById("mngsform").style.display="block",document.querySelector("#bookmarks").addEventListener("click",hideMenu,!1)}),document.getElementById("duplicates").addEventListener("click",function(){hideMenu();let e=document.createElement("div");e.classList.add("db-spinner"),e.id="db-spinner",document.querySelector("body").appendChild(e),sendRequest(checkdups)}),document.getElementById("ibfile").addEventListener("change",async function(e){var t=new FormData;t.append("file",this.files[0]),t.append("action","bimport"),t.append("data","bimport"),t.append("add","bimport");const n=await fetch(".",{method:"POST",body:t}),d=await n.json();200==d.code?(hideMenu(),pwaMessage(translation.messages.importOK,"success")):pwaMessage(translation.messages.importFail,"error")}),document.getElementById("bmf_im").addEventListener("click",function(e){e.preventDefault(),e.stopPropagation(),document.getElementById("ibfile").click()}),document.getElementById("bmf_ex").addEventListener("click",function(e){e.preventDefault(),e.stopPropagation();let t=document.getElementsByName("eiformat"),n="";for(i=0;i{isValidUrl(e)&&(document.getElementById("url").value=e)}).catch(e=>{console.warn("Failed to read clipboard contents: ",e)}),url.focus(),url.setSelectionRange(0,0),url.addEventListener("input",enableSave)}),document.getElementById("mlog")&&document.getElementById("mlog").addEventListener("click",function(){hideMenu(),addBD();let e=document.getElementById("logfile");"visible"===e.style.visibility?(e.style.visibility="hidden",document.getElementById("close").style.visibility="hidden"):(e.style.visibility="visible",document.getElementById("close").style.visibility="visible",sendRequest(mlog))}),document.getElementById("mclear")&&document.getElementById("mclear").addEventListener("click",function(){sendRequest(mclear)}),document.getElementById("mrefresh")&&document.getElementById("mrefresh").addEventListener("click",logRefresh),document.getElementById("arefresh")&&document.getElementById("arefresh").addEventListener("change",logRefresh),document.getElementById("mclose")&&document.getElementById("mclose").addEventListener("click",function(){"visible"===document.getElementById("logfile").style.visibility&&(document.getElementById("logfile").style.visibility="hidden",document.getElementById("close").style.visibility="hidden",hideMenu())}),document.querySelectorAll("#mngcform .clientname").forEach(function(e){e.addEventListener("touchstart",function(){this.children[0].style.display="block"})}),document.querySelectorAll("#mngcform li div.clientname input").forEach(function(e){e.addEventListener("mouseleave",function(){this.defaultValue!=this.value&&(this.style.display="block",this.parentElement.parentElement.children[2].classList.add("renamea"),this.parentElement.parentElement.children[1].classList.add("renamea"),this.parentElement.parentElement.children[1].classList.remove("rename"),this.parentElement.parentElement.children[2].classList.remove("remove"))})}),document.getElementById("fname").addEventListener("input",function(){document.getElementById("fsave").disabled=!1}),document.getElementById("edtitle").addEventListener("input",function(){document.getElementById("edsave").disabled=!1}),document.getElementById("edurl").addEventListener("input",function(){document.getElementById("edsave").disabled=!1}),document.getElementById("mvfolder").addEventListener("change",function(){document.getElementById("mvsave").disabled=!1}),document.getElementById("fsave").addEventListener("click",function(e){e.preventDefault(),sendRequest(cfolder,document.getElementById("fname").value,document.getElementById("fbid").value)}),document.getElementById("edsave").addEventListener("click",function(e){e.preventDefault();let t=JSON.stringify({id:document.getElementById("edid").value,url:document.getElementById("edurl").value,title:document.getElementById("edtitle").value});sendRequest(bmedt,t)}),document.getElementById("mvsave").addEventListener("click",function(e){e.preventDefault(),sendRequest(bmmv,document.getElementById("mvfolder").value,document.getElementById("mvid").value),document.getElementById("bmamove").style.display="none"}),document.getElementById("mnubg").addEventListener("click",function(){hideMenu()}),document.getElementById("language")&&document.getElementById("language").addEventListener("change",function(e){sendRequest(langupdate,this.value)}),addBookmarkEvents(),navigator.serviceWorker.ready.then(e=>{e.active&&e.active.postMessage({type:"bookmarks",data:document.getElementById("bookmarks").innerHTML})})}if(document.getElementById("sdatabase")){let e=document.getElementById("sdatabase"),o=document.getElementById("mform"),l=document.getElementById("sform"),i=document.getElementById("cdb"),a=document.getElementById("idb"),s=document.getElementById("dbhost"),r=document.getElementById("dbname"),c=document.getElementById("dbuser"),m=document.getElementById("dbpwd"),u=document.getElementById("dbpath");function t(){let t=!1;"mysql"===e.value?t=s.value.length>0&&r.value.length>0&&c.value.length>0&&m.value.length>0:"sqlite"===e.value&&(t=u.value.length>0),i.disabled=!t}function n(){let t={};t.type=e.value,"mysql"===e.value?(t.host=s.value,t.name=r.value,t.user=c.value,t.pwd=m.value):"sqlite"===e.value&&(t.name=u.value),sendRequest(testDB,JSON.stringify(t))}function d(){sendRequest(initDB)}document.querySelectorAll(".next").forEach(e=>{e.addEventListener("click",e=>{if("nextSettings"===e.target.id){let e={};e.logfile=document.getElementById("lfpath").value,e.realm=document.getElementById("realm").value,e.loglevel=document.getElementById("loglevel").value,e.sender=document.getElementById("sender").value,e.suser=document.getElementById("suser").value,e.spwd=document.getElementById("spwd").value,e.enckey=document.getElementById("enckey").value,e.enchash=document.getElementById("enchash").value,e.expireDays=document.getElementById("expireDays").value,sendRequest(saveSettings,JSON.stringify(e))}else e.target.parentElement.style.display="none",e.target.parentElement.nextElementSibling.style.display="block"})}),e.addEventListener("change",()=>{l.style.display="none",o.style.display="none",i.disabled=!0,"mysql"===e.value?(o.style.display="block",l.style.display="none",s.focus()):"sqlite"===e.value&&(o.style.display="none",l.style.display="block",u.focus())}),i.addEventListener("click",n),a.addEventListener("click",d),s.addEventListener("change",t),r.addEventListener("change",t),c.addEventListener("change",t),m.addEventListener("change",t),u.addEventListener("change",t)}},!1),window.addEventListener("keydown",function(e){e.ctrlKey&&"KeyF"===e.code&&(e.preventDefault(),document.getElementById("bmsearch").focus(),document.querySelector("#menu button").innerHTML="×",document.querySelector("#menu input").value="",document.querySelector("#menu button").classList.add("asform"),document.querySelector("#menu input").classList.remove("isform"),document.querySelector("#menu input").classList.add("asform"),document.getElementById("tbar").style.display="none",document.querySelector("#menu input").focus()),rmBm(e)});var bmIDs=new Array;const isValidUrl=e=>{let t;try{t=new URL(e)}catch(e){return!1}return"http:"===t.protocol||"https:"===t.protocol}; \ No newline at end of file diff --git a/smsw.js b/smsw.js index d1037a5..4aef343 100644 --- a/smsw.js +++ b/smsw.js @@ -1,7 +1,7 @@ /** * SyncMarks * - * @version 2.0.5 + * @version 2.1.0 * @author Offerel * @copyright Copyright (c) 2025, Offerel * @license GNU General Public License, version 3