let g_menubarShowDate = false; updateClock(); setInterval(function () { updateClock(); }, 1000); /* Update the menubar clock */ function updateClock() { const today = new Date(); let y = today.getFullYear(); let M = String(today.getMonth() + 1).padStart(2, '0'); let d = String(today.getDate()).padStart(2, '0'); let h = today.getHours(); let m = String(today.getMinutes()).padStart(2, '0'); if (g_menubarShowDate) { $(".menubar .clock").html(y + "/" + M + "/" + d); } else { $(".menubar .clock").html(h + ":" + m); } } /* Set the active application menu * Parameters: * applicationName: The title case name of the application */ function setActiveApplication(applicationName) { let $activeApplication = $(".menubar .active-application"); $activeApplication.empty().append(""); $activeApplication.append("" + applicationName + ""); return $activeApplication; } /* Recursively generate GUIDs for DesktopDB items */ function generateDesktopDBIDs(tree) { for (let node of tree) { if (!node.id) node.id = getRandomUUID(); if (node.contents) generateDesktopDBIDs(node.contents); } } /* Recursively generate "where" strings for Info windows */ function generateWhereStrings(tree, where) { for (let node of tree) { if (!node.where) node.where = where; if (node.contents) generateWhereStrings(node.contents, node.where + node.name + ":"); } } /* Recursively find a node given a property and value * Parameters: * tree: The DesktopDB object * property: The property to search * value: The value to search (i.e. property.value) */ function findDesktopDBItem(tree, property, value) { for (let node of tree) { if (node[property] === value) return node; if (node.contents) { let desiredNode = findDesktopDBItem(node.contents, property, value); if (desiredNode) return desiredNode } } return undefined; } /* Recursively find a node's parent given a property and value * Parameters: * tree: The DesktopDB object * property: The property to search * value: The value to search (i.e. property.value) */ function findDesktopDBItemParent(tree, property, value) { for (let node of tree) { if (node[property] === value) return tree; if (node.contents) { let desiredTree = findDesktopDBItem(node.contents, property, value); if (desiredTree) return node } } return false; } function getDesktopDBItemFileCount(tree) { let count = 0; if (tree.contents) { for (let node of tree.contents) { count++; if (node.contents) { count += getDesktopDBItemFileCount(node); } } } return count; } /* Format a number into byte sizes * Parameters: * bytes: The number to format * decimals: Output decimal places */ function formatBytes(bytes, decimals = 1) { if (bytes === 0) return '0 Bytes'; const k = 1024; const dm = decimals < 0 ? 0 : decimals; const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB']; const i = Math.floor(Math.log(bytes) / Math.log(k)); return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i]; } /* Format seconds remaining into text * Parameters: * seconds: The seconds remaining */ function formatTimeRemaining(seconds) { if (seconds < 7) { return "About 5 seconds"; } else if (seconds < 15) { return "About 10 seconds"; } else if (seconds < 55) { return "Less than a minute"; } else if (seconds < 80) { return "About a minute"; } else if (seconds < 3300) { return "About " + Math.ceil(seconds / 60) + " minutes"; } else if (seconds < 4800) { return "About an hour"; } else { return "About " + Math.ceil(seconds / 3600) + " hours"; } } /* Generate a random UUIDv4 */ function getRandomUUID() { return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, c => (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16) ); }