NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name Plotaroute - Bookmarks manager // @namespace https://github.com/bogdal/userscripts // @version 0.1 // @description Manage bookmarks directly on my routes page // @author Adam BogdaĆ // @match https://www.plotaroute.com/myroutes* // @grant none // @license MIT // ==/UserScript== (function () { "use strict"; const getBookmarkedRoutes = () => { return new Promise((resolve) => { const url = "https://www.plotaroute.com/get_bmroutes.asp"; const xhr = new XMLHttpRequest(); xhr.open("GET", url, true); xhr.onload = (e) => { if (xhr.readyState === 4) { if (xhr.status === 200) { resolve(JSON.parse(xhr.responseText)); } } }; xhr.send(null); }); }; const setBookmark = (routeId, isBookmarked) => { return new Promise((resolve) => { const url = "https://www.plotaroute.com/post_bookmarkroute.asp"; const xhr = new XMLHttpRequest(); xhr.open("POST", url, true); xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); xhr.onload = (e) => { if (xhr.readyState === 4) { if (xhr.status === 200) { resolve(JSON.parse(xhr.responseText)); } } }; xhr.send(`ID=${routeId}&Bookmark=${isBookmarked ? 1 : 0}`); }); }; const setIconSpinner = (icon) => { icon.classList.add("fa-spinner", "fa-spin"); }; const setIconBookmark = (icon, isBookmarked) => { icon.classList.remove("fa-spinner", "fa-spin"); icon.classList.add("fa-bookmark"); if (isBookmarked) { icon.classList.remove("fa-bookmark-o"); } else { icon.classList.add("fa-bookmark-o"); } }; const loadBookmaredRoutes = async () => { const routes = await getBookmarkedRoutes(); const routeIds = routes.Routes.map(({ id }) => id); document.querySelectorAll(".bm-route-icon").forEach((icon) => { const routeId = icon.getAttribute("data-route-id"); const isBookmarked = routeIds.includes(parseInt(routeId)); setIconBookmark(icon, isBookmarked); }); }; const toggleBookmark = async (event) => { const icon = event.target; if (!icon.classList.contains("fa-spinner")) { const routeId = icon.getAttribute("data-route-id"); const isBookmarked = !icon.classList.contains("fa-bookmark-o"); setIconSpinner(icon); await setBookmark(routeId, !isBookmarked); setIconBookmark(icon, !isBookmarked); } }; document.querySelectorAll("#MyRoutesRows tr").forEach((tr) => { const regex = new RegExp("\\d+$"); const routeId = regex.exec(tr.id)[0]; const container = tr.childNodes[1]; const icon = document.createElement("i"); icon.className = "bm-route-icon fa fa-spinner fa-spin color_high right text20 pointer"; icon.setAttribute("data-route-id", routeId); icon.addEventListener("click", toggleBookmark); const iconWrapper = document.createElement("div"); iconWrapper.style.width = "20px"; iconWrapper.classList.add("right"); iconWrapper.appendChild(icon); container.appendChild(iconWrapper); }); loadBookmaredRoutes(); })();