let g_openWindows = [];
let g_highestZIndex = 3;
function initWindow(wrapperID, windowClass) {
let $wrapper = Object;
switch (windowClass) {
case "folder":
$wrapper = initFolderWindow(wrapperID);
initBaseWindow($wrapper);
break;
case "info":
$wrapper = initInfoWindow(wrapperID);
initBaseWindow($wrapper);
break;
case "about":
$wrapper = initAboutWindow(wrapperID);
initBaseWindow($wrapper);
break;
case "download":
$wrapper = initDownloadWindow(wrapperID);
initBaseWindow($wrapper);
break;
case "simpletext":
$wrapper = initSimpleTextWindow(wrapperID);
initBaseWindow($wrapper);
break;
case "pictureviewer":
$wrapper = initPictureViewerWindow(wrapperID);
initBaseWindow($wrapper);
break;
case "zterm":
$wrapper = initZTermWindow(wrapperID);
initBaseWindow($wrapper);
break;
default:
break;
}
}
function initFolderWindow(wrapperID) {
let $wrapper = $(".window-wrapper[data-id=\"" + wrapperID + "\"][data-type=\"folder\"]");
let $window = $wrapper.children(".window");
let desktopDBItem = findDesktopDBItem(g_DesktopDB, "id", wrapperID);
let headerTitle = "";
if (!desktopDBItem) return;
/* Set the window icon and title */
switch (wrapperID) {
case "folder":
headerTitle = "" + desktopDBItem.name;
break;
case "trash":
headerTitle = "
" + desktopDBItem.name;
break;
default:
headerTitle = "
" + desktopDBItem.name;
break;
}
$window.find(".header > .title").html(headerTitle);
/* Build window (i.e. folder) contents */
if (desktopDBItem.contents) {
initFolderWindowContents($window, desktopDBItem.contents);
/* Build icons, etc. */
initFigures($window);
}
$window.find(".grid figure a").on("focus", function () {
/* Style the window, but don't focus it as
we don't want to lose the figure focus */
$window.triggerHandler("focus");
}).on("blur", function () {
/* Since the window isn't focused, blur
it here to style it if we click outside.
Note that the window will focus if we click
in it as that would trigger after this blur */
$window.trigger("blur");
});
return $wrapper;
}
function initInfoWindow(wrapperID) {
let $wrapper = $(".window-wrapper[data-id=\"" + wrapperID + "\"][data-type=\"info\"]");
let $window = $wrapper.children(".window");
let $infoTable = $window.find(".info-table");
let desktopDBItem = findDesktopDBItem(g_DesktopDB, "id", wrapperID);
let icon = desktopDBItem.icon ? desktopDBItem.icon : desktopDBItem.kind;
if (!desktopDBItem) return;
/* Set the window title */
$window.find(".header > .title").html(desktopDBItem.name + " Info");
$window.find("img[data-info-key='icon']").attr("src", SETTINGS_ICONS_LARGE_PATH + icon + ".png");
$window.find("input[data-info-key='name']").attr("value", desktopDBItem.name);
/* Build info window table with figure-specific properties */
switch (desktopDBItem.kind) {
case "disk":
$infoTable.load("window.info.table.disk.html", function () {
$infoTable.find("td[data-info-key='format']").html(desktopDBItem.format);
$infoTable.find("td[data-info-key='capacity']").html(desktopDBItem.capacity);
$infoTable.find("td[data-info-key='available']").html(desktopDBItem.available);
$infoTable.find("td[data-info-key='used']").html(desktopDBItem.used);
updateInfoTableGeneralProperties($infoTable, desktopDBItem);
});
break;
case "folder":
$infoTable.load("window.info.table.folder.html", function () {
$infoTable.find("td[data-info-key='size']").html(formatInfoTableFileSize(desktopDBItem.size) + ", for " + getDesktopDBItemFileCount(desktopDBItem) + " items");
updateInfoTableGeneralProperties($infoTable, desktopDBItem);
});
break;
case "application":
case "download":
case "document":
case "video":
case "picture":
$infoTable.load("window.info.table.file.html", function () {
$infoTable.find("td[data-info-key='size']").html(formatInfoTableFileSize(desktopDBItem.size));
$infoTable.find("td[data-info-key='version']").html(desktopDBItem.version);
updateInfoTableGeneralProperties($infoTable, desktopDBItem);
});
break;
case "link":
$infoTable.load("window.info.table.link.html", function () {
$infoTable.find("td[data-info-key='url']").html(desktopDBItem.url);
updateInfoTableGeneralProperties($infoTable, desktopDBItem);
});
break;
case "trash":
$infoTable.load("window.info.table.trash.html", function () {
$infoTable.find("td[data-info-key='contents']").html(desktopDBItem.infoContents);
updateInfoTableGeneralProperties($infoTable, desktopDBItem);
});
break;
default:
break;
}
return $wrapper;
}
function formatInfoTableFileSize(bytes) {
if (bytes === undefined) return;
let formattedBytes = formatBytes(bytes);
return formattedBytes + " on disk (" + bytes.toLocaleString() + " bytes)"
}
function updateInfoTableGeneralProperties($infoTable, desktopDBItem) {
$infoTable.find("td[data-info-key='kind']").html(desktopDBItem.kind);
$infoTable.find("td[data-info-key='where']").html(desktopDBItem.where);
$infoTable.find("td[data-info-key='created']").html(desktopDBItem.created);
$infoTable.find("td[data-info-key='modified']").html(desktopDBItem.modified);
$infoTable.find("td[data-info-key='label']").html(desktopDBItem.label);
$infoTable.find("textarea[data-info-key='comments']").html(desktopDBItem.comments);
}
function initAboutWindow(wrapperID) {
let $wrapper = $(".window-wrapper[data-id=\"" + wrapperID + "\"][data-type=\"about\"]");
let $window = $wrapper.children(".window");
/* Set the window title */
$window.find(".header > .title").html("About This Website");
$.getJSON("json/greets.json").then(function (greetsJSON) {
let $greetsList = $window.find(".about-greets ul");
greetsJSON.forEach(function (greet) {
$greetsList.append("