// Create language switcher instance var lang = new Lang(); var langStrings = { token: {} }; loadLanguageList(); var falbackLanguage = languageList.filter( (p) => p.code == language(moment.locale(navigator.languages[0])) ).length > 0 ? language(moment.locale(navigator.languages[0])) : "en"; lang.init({ //defaultLang: 'en', currentLang: getCookie("organizrLanguage") ? getCookie("organizrLanguage") : falbackLanguage, cookie: { name: "organizrLanguage", expiry: 365, path: "/", }, allowCookieOverride: true, }); var OAuthLoginNeeded = false; var directToHash = false; var pingOrg = false; var checkCommitLoadStatus = false; var timeouts = {}; var increment = 0; var tabInformation = {}; var tabActionsList = []; tabActionsList["refresh"] = []; tabActionsList["close"] = []; var customHTMLEditorObject = []; $.xhrPool = []; // Add new jquery serializeObject function $.fn.serializeObject = function () { var o = {}; var a = this.serializeArray(); $.each(a, function () { if (o[this.name] !== undefined) { if (!o[this.name].push) { o[this.name] = [o[this.name]]; } o[this.name].push(this.value || ""); } else { o[this.name] = this.value || ""; } }); return o; }; // Start Organizr $(document).ready(function () { if (getCookie("organizrOAuth")) { OAuthLoginNeeded = true; } launch(); local("r", "loggingIn"); }); /* NORMAL FUNCTIONS */ function setLangCookie(lang) { Cookies.set("organizrLanguage", lang, { expires: 365, path: "/", }); } function highlightObject(json) { if (typeof json != "string") { json = JSON.stringify(json, undefined, "\t"); } json = json .replace(/&/g, "&") .replace(//g, ">"); return json.replace( /("(\\u[a-zA-Z0-9]{4}|\\[^u]|[^\\"])*"(\s*:)?|\b(true|false|null)\b|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?)/g, function (match) { var cls = "number"; if (/^"/.test(match)) { if (/:$/.test(match)) { cls = "key"; } else { cls = "string"; } } else if (/true|false/.test(match)) { cls = "boolean"; } else if (/null/.test(match)) { cls = "null"; } return '' + match + ""; } ); } function orgDebug() { let cmd = $("#debug-input").val(); let result = ""; if (cmd !== "") { result = eval(cmd); } if (result !== "") { $("#debugResultsBox").removeClass("hidden"); $("#debugResults").html(formatDebug(result)); $(".cmdName").text(cmd); if (bowser.mobile !== true) { $("#debugResults > .whitebox").slimScroll(); } } else { } } function getDepth(object) { var level = 1; for (var key in object) { if (!object.hasOwnProperty(key)) continue; if (typeof object[key] == "object") { var depth = getDepth(object[key]) + 1; level = Math.max(depth, level); } } return level; } function jsonToHTML(json) { var html = ""; $.each(json, function (i, v) { if (typeof v === "object") { html += '

' + i + ":

"; $.each(v, function (index, value) { if (typeof value === "object") { html += '

' + index + ":

"; html += jsonToHTML2(value); } else { html += '

' + index + ": " + value + "

"; } }); } else { html += '

' + i + ": " + v + "

"; } }); return html; } function jsonToHTML2(json) { var html = ""; $.each(json, function (i, v) { if (typeof v === "object") { html += '

' + i + ":

"; $.each(v, function (index, value) { if (typeof value === "object") { html += '

' + index + ":

"; html += jsonToHTML3(value); } else { html += '

' + index + ": " + value + "

"; } }); } else { html += '

' + i + ": " + v + "

"; } }); return html; } function jsonToHTML3(json) { var html = ""; $.each(json, function (i, v) { if (typeof v === "object") { html += '

' + i + ":

"; $.each(v, function (index, value) { if (typeof value === "object") { html += '

' + index + ":

"; html += jsonToHTML2(value); } else { html += '

' + index + ": " + value + "

"; } }); } else { html += '

' + i + ": " + v + "

"; } }); return html; } function copyDebug() { var pre = $("#debugPreInfo").find(".whitebox").text(); var debug = $("#debugResults").find(".whitebox").text(); clipboard(true, pre + debug); console.log(pre + debug); } function formatDebug(result) { var formatted = ""; switch (typeof result) { case "object": formatted = jsonToHTML(result); break; default: formatted = result; } return ( '
' +
    formatted +
    "
" ); } function getDebugPreInfo() { var formatted = "Version: " + activeInfo.version + "
Branch: " + activeInfo.branch + "
Server OS: " + activeInfo.serverOS + "
PHP: " + activeInfo.phpVersion + "
Install Type: " + (activeInfo.settings.misc.docker ? "Official Docker" : "Native") + "
Auth Type: " + activeInfo.settings.misc.authType + "
Auth Backend: " + activeInfo.settings.misc.authBackend + "
Installed Plugins: " + formatDebug(activeInfo.settings.misc.installedPlugins) + "
Installed Themes: " + formatDebug(activeInfo.settings.misc.installedThemes) + "
Theme: " + activeInfo.theme + "
Local: " + activeInfo.settings.user.local + "
oAuth: " + activeInfo.settings.user.oAuthLogin + "
Agent: " + activeInfo.settings.user.agent; formatted = '
' + formatted + "
"; $("#debugPreInfo").html(formatted); if (bowser.mobile !== true) { $("#debugPreInfo > .whitebox").slimScroll(); } } function orgDebugList(cmd) { if (cmd !== "") { $("#debug-input").val(cmd); orgDebug(); } } function updateIssueLink(line) { let preNumber = line.match(/\S*\#(.*)/g); if (preNumber !== null) { preNumber = preNumber.toString(); let numberSplit = preNumber.split("#"); let issueType = numberSplit[0].replace("(", "").replace(")", ""); let issueNumber = numberSplit[1].replace("(", "").replace(")", ""); let issueWord = issueType.toLowerCase() == "fr" ? ' feature' : ' issue'; let colorType = issueType.toLowerCase() == "fr" ? "label-info" : "label-primary"; let issueLink = issueType.toLowerCase() == "fr" ? "https://feature.organizr.app/posts/" + issueNumber : "https://github.com/causefx/Organizr/issues/" + issueNumber; issueLink = '' + issueWord + ""; return line.replace(preNumber, issueLink); } else { return line; } } function clipboard(trigger = true, string = null) { let clipboard = $("#internal-clipboard"); if (string) { clipboard.attr("data-clipboard-text", string); } if (trigger) { clipboard.click(); } } function getLangStrings() { let strings = JSON.stringify(window.langStrings, null, "\t"); clipboard(true, strings); organizrConsole("JSON Function", "Copied JSON Strings to clipboard"); } function getHiddenProp() { var prefixes = ["webkit", "moz", "ms", "o"]; // if 'hidden' is natively supported just return it if ("hidden" in document) return "hidden"; // otherwise loop over all the known prefixes until we find one for (var i = 0; i < prefixes.length; i++) { if (prefixes[i] + "Hidden" in document) return prefixes[i] + "Hidden"; } // otherwise it's not supported return null; } function isHidden() { var prop = getHiddenProp(); if (!prop) return false; return document[prop]; } function loadLanguageList() { $.each(languageList, function (i, v) { lang.dynamic(v.code, "js/langpack/" + v.filename); }); } function sleep(ms) { return new Promise((resolve) => setTimeout(resolve, ms)); } function contains(target, pattern) { var value = 0; pattern.forEach(function (word) { value = value + target.includes(word); }); return value === 1; } function isNumberKey(evt) { var charCode = evt.which ? evt.which : event.keyCode; if (charCode < 48 || charCode > 57) return false; return true; } function setTabInfo(id, action, value) { let tabInfo = findTab(id); if (!tabInfo) { organizrConsole("Set Tab Info", "No Tab Info Found... Id: " + id, "error"); return false; } let tab = cleanClass(tabInfo.name); if ( tab == "Organizr-Support" || tab == "Organizr-Docs" || tab == "Feature-Request" ) { return false; } if (tab !== null && action !== null && value !== null) { switch (action) { case "active": $.each(tabInformation, function (i, v) { tabInformation[i]["active"] = false; }); break; default: //nada } tabInformation[id][action] = value; } else { return false; } } function tabTimerAction() { if (tabActionsList.close.length > 0) { $.each(tabActionsList.close, function (i, v) { var tab = v.tab; var minutes = tabInformation[v.id]["tabInfo"]["timeout_ms"] / 1000 / 60; var process = false; if (tabInformation[v.id]["loaded"]) { if (tabInformation[v.id]["active"] && idleTime >= 1) { process = true; } if (tabInformation[v.id]["active"] === false) { process = true; } if (process) { tabInformation[v.id]["increments"] = tabInformation[v.id]["increments"] + 1; if (tabInformation[v.id]["increments"] >= minutes) { tabInformation[v.id]["increments"] = 0; organizrConsole("Tab Function", "Auto Closing tab: " + tab); closeTab(v.id); } } } }); } if (tabActionsList.refresh.length > 0) { $.each(tabActionsList.refresh, function (i, v) { var tab = v.tab; var minutes = tabInformation[v.id]["tabInfo"]["timeout_ms"] / 1000 / 60; var process = false; if (tabInformation[v.id]["loaded"]) { tabInformation[v.id]["increments"] = tabInformation[v.id]["increments"] + 1; if (tabInformation[v.id]["increments"] >= minutes) { tabInformation[v.id]["increments"] = 0; organizrConsole("Tab Function", "Auto Reloading tab: " + tab); reloadTab(v.id); } } }); } } function timerIncrement() { increment = increment + 1; tabTimerAction(); //check for cookieExpiry if (hasCookie) { if (getCookie("organizrToken")) { //do nothing } else { location.reload(); } } idleTime = idleTime + 1; if (typeof activeInfo !== "undefined") { if ( activeInfo.settings.lockout.enabled && activeInfo.settings.user.oAuthLogin !== true ) { if ( idleTime > activeInfo.settings.lockout.timer && $("#lockScreen").length !== 1 ) { if ( activeInfo.user.groupID <= activeInfo.settings.lockout.minGroup && activeInfo.user.groupID >= activeInfo.settings.lockout.maxGroup ) { lock(); } } } } } function ajaxblocker( element = null, action = "out", message = "Loading...", background = "#707cd2", border = "#5761a9", colorText = "#fff" ) { switch (action) { case "in": case "fadein": $(element).block({ message: '

' + message + "

", css: { color: colorText, border: "1px solid " + border, backgroundColor: background, }, }); break; case "out": case "fadeout": $(element).unblock(); break; default: $(element).unblock(); } } function ajaxloader(element = null, action = "out") { var loader = `
`; switch (action) { case "in": case "fadein": $(loader).appendTo(element); break; case "out": case "fadeout": $(".ajaxloader").remove(); break; default: $(".ajaxloader").remove(); } } function getDefault(id) { let tabInfo = findTab(id); if (!tabInfo) { if (getHash() === false) { organizrConsole("Get Default", "No Tab Info Found... Id: " + id, "error"); organizrConsole( "Get Default", "Trying to load next tab in cycle", "error" ); loadNextTab(true); return false; } } if ( getHash() === false || (getHash() === "OrganizrLogin" && activeInfo.user.loggedin) ) { if (tabInfo) { switchTab(id); } else { $(".allTabsList").first().children().click(); } } else if (getHash() == "OrganizrLogin") { loadNextTab(true); } else { let hashTab = getHash(); let hashType = isNaN(hashTab) ? "name" : "id"; let tabInfo = findTab(hashTab, hashType); if (!tabInfo) { organizrConsole( "Get Hash", "No Tab Info Found... Hash: " + hashTab, "error" ); switchTab(id); return false; } let type = tabInfo.type; if (typeof hashTab !== "undefined" && typeof type !== "undefined") { directToHash = true; switchTab(tabInfo.id); } else { console.warn("Tab Function: " + hashTab + " is not a defined tab"); switchTab(id); } } } function getTabType(id) { let tabInfo = findTab(id); if (!tabInfo) { organizrConsole( "Tab Type Function", "No Tab Info Found... Id: " + id, "error" ); return false; } return tabInfo.type; } function getHash() { if ($(location).attr("hash")) { return dirtyHash($(location).attr("hash").substr(1)); } return false; } function setHash(hash) { window.location.hash = "#" + cleanHash(hash); } function getQueryVariable(variable) { var query = window.location.search.substring(1); var vars = query.split("&"); for (var i = 0; i < vars.length; i++) { var pair = vars[i].split("="); if (pair[0] == variable) { return pair[1]; } } return false; } function iconPrefix(source) { var tabIcon = source.split("::"); var icons = { materialize: "mdi mdi-", fontawesome: "fa fa-", themify: "ti-", simpleline: "icon-", weathericon: "wi wi-", alphanumeric: "fa-fw", }; if (Array.isArray(tabIcon) && tabIcon.length === 2) { if (tabIcon[0] !== "url" && tabIcon[0] !== "alphanumeric") { return ''; } else if (tabIcon[0] == "alphanumeric") { return '' + tabIcon[1] + ""; } else { return 'tabIcon'; } } else { return 'tabIcon'; } } function iconPrefixSplash(source) { var tabIcon = source.split("::"); var icons = { materialize: "mdi mdi-", fontawesome: "fa fa-", themify: "ti-", simpleline: "icon-", weathericon: "wi wi-", alphanumeric: "fa-fw", }; if (Array.isArray(tabIcon) && tabIcon.length === 2) { if (tabIcon[0] !== "url" && tabIcon[0] !== "alphanumeric") { return ''; } else if (tabIcon[0] == "alphanumeric") { return '' + tabIcon[1] + ""; } else { return tabIcon[1]; } } else { return source; } } function cleanClass(string) { return string.replace(/ +/g, "-").replace(/\W+/g, "-"); } function cleanHash(hash) { hash = encodeURI(hash); return hash.replaceAll("%20", "-"); } function dirtyHash(hash) { hash = hash.replaceAll("-", "%20"); return decodeURI(hash); } // What the hell is this? I don't remember this lol function noTabs(arrayItems) { if (arrayItems.data.user.loggedin === true) { organizrAPI2("GET", "api/v2/page/tabs") .success(function (data) { try { var json = data.response; organizrConsole("Organizr Function", "No tabs available"); $(json.data).appendTo($(".organizr-area")); $(".organizr-area").removeClass("hidden"); $("#preloader").fadeOut(); } catch (e) { organizrCatchError(e, data); } }) .fail(function (xhr) { OrganizrApiError(xhr, "Error"); }); } else { $(".show-login").trigger("click"); } } function formatImage(icon) { if (!icon.id || icon.text == "Select or type Image") { return icon.text; } var baseUrl = "/user/pages/images/flags"; var $icon = $( ' ' + icon.text + "" ); return $icon; } function formatIcon(icon) { if (!icon.id || icon.text == "Select or type Icon") { return icon.text; } var $icon = $("" + iconPrefix(icon.id) + icon.text + ""); return $icon; } function logout() { message( "", " Goodbye!", activeInfo.settings.notifications.position, "#FFF", "success", "10000" ); organizrAPI2("GET", "api/v2/logout") .success(function (data) { local("set", "message", "Goodbye|Logout Successful|success"); history.replaceState(null, null, " "); if ( activeInfo.settings.misc.authProxyOverrideLogout && activeInfo.settings.misc.authProxyLogoutURL !== "" ) { location.href = activeInfo.settings.misc.authProxyLogoutURL; } else { location.reload(); } }) .fail(function (xhr) { OrganizrApiError(xhr, "Logout Failed"); }); } function reloadOrganizr() { location.reload(); } function hideFrames(split = null) { let extra = split ? "-right" : ""; $(".iFrame-listing" + extra + " div[class^='frame-container']") .addClass("hidden") .removeClass("show"); $(".internal-listing" + extra + " div[class^='internal-container']") .addClass("hidden") .removeClass("show"); $(".plugin-listing" + extra + " div[class^='plugin-container']") .addClass("hidden") .removeClass("show"); } function closeSideMenu() { $(".content-wrapper").removeClass("show-sidebar"); } function removeMenuActive() { $("#side-menu a").removeClass("active"); } function swapDisplay(type, split) { let extra = split ? "-right" : ""; switch (type) { case "internal": $("body").removeClass("fix-header"); $(".iFrame-listing" + extra) .addClass("hidden") .removeClass("show"); $(".internal-listing" + extra) .addClass("show") .removeClass("hidden"); $(".login-area").addClass("hidden").removeClass("show"); $(".plugin-listing" + extra) .addClass("hidden") .removeClass("show"); //$('body').removeClass('fix-header'); if (split) { $("#page-wrapper").addClass("split"); $("#page-wrapper-right").removeClass("hidden"); } break; case "iframe": $("body").addClass("fix-header"); $(".iFrame-listing" + extra) .addClass("show") .removeClass("hidden"); $(".internal-listing" + extra) .addClass("hidden") .removeClass("show"); $(".login-area").addClass("hidden").removeClass("show"); $(".plugin-listing" + extra) .addClass("hidden") .removeClass("show"); //$('body').addClass('fix-header'); if (split) { $("#page-wrapper").addClass("split"); $("#page-wrapper-right").removeClass("hidden"); } break; case "login": $("body").removeClass("fix-header"); $(".iFrame-listing" + extra) .addClass("hidden") .removeClass("show"); $(".internal-listing" + extra) .addClass("hidden") .removeClass("show"); $(".login-area").addClass("show").removeClass("hidden"); $(".plugin-listing" + extra) .addClass("hidden") .removeClass("show"); if (activeInfo.settings.misc.minimalLoginScreen == true) { $(".sidebar").addClass("hidden"); $(".navbar").addClass("hidden"); $("#page-wrapper").addClass("hidden"); } if (split) { $("#page-wrapper").addClass("split"); $("#page-wrapper-right").removeClass("hidden"); } break; case "plugin": $(".iFrame-listing" + extra) .addClass("hidden") .removeClass("show"); $(".internal-listing" + extra) .addClass("hidden") .removeClass("show"); $(".login-area").addClass("hidden").removeClass("show"); $(".plugin-listing" + extra) .addClass("show") .removeClass("hidden"); if (split) { $("#page-wrapper").addClass("split"); $("#page-wrapper-right").removeClass("hidden"); } break; default: } } function toggleParentActive(id) { var childTab = $("#menu-" + id); if (childTab.parent().hasClass("nav-second-level")) { if (!childTab.parent().hasClass("in")) { childTab.parent().addClass("collapse in"); childTab.parent().parent().addClass("active"); } } } function swapBodyClass(id) { let tabInfo = findTab(id); if (!tabInfo) { organizrConsole("Swap Body", "No Tab Info Found... Id: " + id, "error"); return false; } let prior = $("body").attr("data-active-tab"); let priorId = $("body").attr("data-active-tab-id"); if (prior !== "") { $("body").removeClass("active-tab-" + prior); $("body").removeClass("active-tab-" + priorId); } $("body").attr("data-active-tab", tabInfo.name); $("body").attr("data-active-tab-id", tabInfo.id); $("body").addClass("active-tab-" + tabInfo.name); $("body").addClass("active-tab-" + tabInfo.id); } function editPageTitle(title) { document.title = title + " - " + activeInfo.appearance.title; } function switchToPlugin(plugin) { closeSideMenu(); removeMenuActive(); swapDisplay("plugin"); $(".plugin-container").each(function () { $(this).addClass("hidden").removeClass("show"); }); $("#container-plugin-" + plugin) .addClass("show") .removeClass("hidden"); } function switchTab(id, split = null) { let tabInfo = findTab(id); if (!tabInfo) { organizrConsole("Switch Tab", "No Tab Info Found... Id: " + id, "error"); return false; } if (activeInfo.settings.misc.collapseSideMenuOnClick) { if (!$(".navbar ").hasClass("sidebar-hidden")) { toggleSideMenu(); } } let extra = split ? "right-" : ""; let type = tabInfo.type; // need to rework for split if (type !== 2) { hideFrames(split); closeSideMenu(); removeMenuActive(); toggleParentActive(id); swapBodyClass(id); } if (type !== 2 && type !== "plugin") { setHash(tabInfo.name); } switch (type) { case 0: case "0": case "internal": swapDisplay("internal", split); var newTab = $("#internal-" + extra + id); $("#menu-" + id) .find("a") .addClass("active"); editPageTitle(tabInfo.name); if (newTab.hasClass("loaded")) { organizrConsole("Tab Function", "Switching to tab: " + tabInfo.name); newTab.addClass("show").removeClass("hidden"); setTabInfo(id, "active", true); } else { //$("#preloader").fadeIn(); organizrConsole("Tab Function", "Loading new tab for: " + tabInfo.name); $("#menu-" + id + " a") .children() .addClass("tabLoaded"); newTab.addClass("show loaded").removeClass("hidden"); loadInternal(id, split); setTabInfo(id, "active", true); setTabInfo(id, "loaded", true); //$("#preloader").fadeOut(); } break; case 1: case "1": case "iframe": swapDisplay("iframe", split); var newTab = $("#container-" + extra + id); var tabURL = newTab.attr("data-url"); $("#menu-" + id) .find("a") .addClass("active"); editPageTitle(tabInfo.name); if (newTab.hasClass("loaded")) { organizrConsole("Tab Function", "Switching to tab: " + tabInfo.name); newTab.addClass("show").removeClass("hidden"); setTabInfo(id, "active", true); } else { $("#preloader").fadeIn(); organizrConsole("Tab Function", "Loading new tab for: " + tabInfo.name); $("#menu-" + id + " a") .children() .addClass("tabLoaded"); newTab.addClass("show loaded").removeClass("hidden"); $(buildFrame(id, extra)).appendTo(newTab); setTabInfo(id, "active", true); setTabInfo(id, "loaded", true); $("#preloader").fadeOut(); } $("#frame-" + id).focus(); break; case 2: case 3: case "2": case "3": case "_blank": case "popout": popTab(id); break; case "plugin": swapDisplay("plugin"); $("#container-plugin-" + id) .addClass("show") .removeClass("hidden"); break; default: organizrConsole("Tab Function", "Action not set", "error"); } } function popTab(id) { let tabInfo = findTab(id); if (!tabInfo) { organizrConsole( "Pop Tab Function", "No Tab Info Found... Id: " + id, "error" ); return false; } let name = tabInfo.name; switch (tabInfo.type) { case 0: case "0": case "internal": console.warn( "Tab Function: New window not supported for tab id: " + id + " | " + name ); break; case 1: case "1": case "iframe": case 2: case 3: case "2": case "3": case "_blank": case "popout": organizrConsole( "Tab Function", "Creating New Window for tab id: " + id + " | " + name ); window.open(tabInfo.access_url, "_blank"); break; default: organizrConsole("Tab Function", "Action not set", "error"); } } function closeTab(id) { let tabInfo = findTab(id); if (!tabInfo) { organizrConsole( "Close Tab Function", "No Tab Info Found... Id: " + id, "error" ); return false; } // check if current tab? if ($(".active-tab-" + id).length > 0) { closeCurrentTab(event); } else { if ($(".frame-" + id).hasClass("loaded")) { switch (tabInfo.type) { case 0: case "0": case "internal": // quick check if homepage if (tabInfo.access_url == "api/v2/page/homepage") { organizrConsole( "Organizr Function", "Clearing All Homepage AJAX calls" ); clearAJAX("homepage"); $.xhrPool.abortAll(); } organizrConsole("Tab Function", "Closing tab: " + tabInfo.name); $("#internal-" + id).html(""); $("#menu-" + id + " a").removeClass("active"); $("#menu-" + id + " a") .children() .removeClass("tabLoaded"); $("#internal-" + id).removeClass("loaded show"); $("#menu-" + id).removeClass("active"); setTabInfo(id, "loaded", false); break; case 1: case "1": case "iframe": organizrConsole("Tab Function", "Closing tab: " + tab); $("#menu-" + id + " a").removeClass("active"); $("#menu-" + id + " a") .children() .removeClass("tabLoaded"); $("#container-" + id).removeClass("loaded show"); $("#frame-" + id).remove(); setTabInfo(id, "loaded", false); break; case 2: case 3: case "2": case "3": case "_blank": case "popout": break; default: organizrConsole("Tab Function", "Action not set", "error"); } } } } function reloadTab(id) { let tabInfo = findTab(id); if (!tabInfo) { organizrConsole( "Reload Tab Function", "No Tab Info Found... Id: " + id, "error" ); return false; } $("#preloader").fadeIn(); organizrConsole("Tab Function", "Reloading tab: " + tabInfo.name); switch (tabInfo.type) { case 0: case "0": case "internal": if (tabInfo.access_url == "api/v2/page/homepage") { organizrConsole( "Organizr Function", "Clearing All Homepage AJAX calls" ); clearAJAX("homepage"); $.xhrPool.abortAll(); } $("#frame-" + id).html(""); loadInternal(id); break; case 1: case "1": case "iframe": $("#frame-" + id).attr("src", $("#frame-" + id).attr("src")); break; case 2: case 3: case "2": case "3": case "_blank": case "popout": break; default: organizrConsole("Tab Function", "Action not set", "error"); } $("#preloader").fadeOut(); } function reloadCurrentTab() { //$("#preloader").fadeIn(); organizrConsole("Tab Function", "Reloading Current tab"); let id = null; let iframe = $(".iFrame-listing").find(".show"); let internal = $(".internal-listing").find(".show"); if (iframe.length > 0) { var type = "iframe"; } else if (internal.length > 0) { var type = "internal"; } else { var type = "not set"; } switch (type) { case 0: case "0": case "internal": let activeInternal = $(".internal-listing").find(".show"); if (activeInternal) { id = activeInternal.attr("id"); id = id.split("-")[1]; } if (id) { var tabInfo = findTab(id); if (!tabInfo) { organizrConsole( "Reload Current Tab Function", "No Tab Info Found... Id: " + id, "error" ); return false; } } else { return false; } if (tabInfo.access_url == "api/v2/page/homepage") { organizrConsole( "Organizr Function", "Clearing All Homepage AJAX calls" ); clearAJAX("homepage"); $.xhrPool.abortAll(); } $(activeInternal).html(""); loadInternal(id); break; case 1: case "1": case "iframe": let activeFrame = $(".iFrame-listing").find(".show").children("iframe"); if (RegExp("^/.*").test(activeFrame.attr("src"))) { activeFrame.attr("src", activeFrame[0].contentWindow.location.pathname); } else { activeFrame.attr("src", activeFrame.attr("src")); } break; case 2: case 3: case "2": case "3": case "_blank": case "popout": break; default: console.error("Tab Function: Action not set"); } //$("#preloader").fadeOut(); } function loadNextTab(loadNextTabIfNotLoaded = false) { let next = $("#page-wrapper").find(".loaded").attr("id"); if (next) { next = next.split("-")[1]; } if (typeof next !== "undefined") { let parent = $("#menu-" + next).parent(); if ( parent.hasClass("in") === false && parent.hasClass("nav-second-level") ) { parent.parent().find("a").first().trigger("click"); } switchTab(next); } else { if (loadNextTabIfNotLoaded) { if (findTab(0, "type")) { var id = findTab(0, "type")["id"]; } else { var id = findTab(1, "type")["id"]; } tabActions(1, id); } else { organizrConsole("Tab Function", "No Available Tab to open", "error"); } } } function closeCurrentTab(event) { let extra = ""; let split = ""; if (typeof event !== "undefined") { if (event.ctrlKey && event.altKey && !event.shiftKey) { extra = "-right"; split = true; } } if ($(".plugin-listing").hasClass("show")) { hideFrames(split); loadNextTab(); return false; } let id = $("body").attr("data-active-tab-id"); let tabInfo = findTab(id); if (!tabInfo) { organizrConsole( "Close Current Tab Function", "No Tab Info Found... Id: " + id, "error" ); return false; } var iframe = $(".iFrame-listing" + extra).find(".show"); var internal = $(".internal-listing" + extra).find(".show"); if (iframe.length > 0) { var type = "iframe"; } else if (internal.length > 0) { var type = "internal"; } else { var type = "not set"; } switch (type) { case 0: case "0": case "internal": // quick check if homepage if (tabInfo.access_url == "api/v2/page/homepage") { organizrConsole( "Organizr Function", "Clearing All Homepage AJAX calls" ); clearAJAX("homepage"); $.xhrPool.abortAll(); } organizrConsole("Organizr Function", "Closing tab: " + tabInfo.name); $("#internal" + extra + "-" + id).html(""); $("#menu-" + id + " a").removeClass("active"); $("#menu-" + id + " a") .children() .removeClass("tabLoaded"); $("#internal" + extra + "-" + id).removeClass("loaded show"); $("#menu-" + id).removeClass("active"); setTabInfo(id, "loaded", false); setTabInfo(id, "active", false); loadNextTab(); break; case 1: case "1": case "iframe": organizrConsole("Organizr Function", "Closing tab: " + tabInfo.name); $("#menu-" + id + " a").removeClass("active"); $("#menu-" + id + " a") .children() .removeClass("tabLoaded"); $("#container" + extra + "-" + id) .removeClass("loaded show") .addClass("hidden"); $("#frame" + extra + "-" + id).remove(); setTabInfo(id, "loaded", false); setTabInfo(id, "active", false); loadNextTab(); break; case 2: case 3: case "2": case "3": case "_blank": case "popout": break; default: organizrConsole("Tab Function", "No Available Tab to open", "error"); } } function openInNewBrowserTab() { let id = $("body").attr("data-active-tab-id"); let tabInfo = findTab(id); if (!tabInfo) { organizrConsole( "Open In New Browser Tab Function", "No Tab Info Found... Id: " + id, "error" ); return false; } let url = tabInfo.access_url; window.open(url, "_blank"); } function findTab(query, term = "id") { let tabInfo = activeInfo.tabs.filter((tab) => tab[term] == query); return tabInfo.length >= 1 ? tabInfo[0] : false; } function tabActions(event, id, redirectURL = "") { if (event.which == 3) { return false; } let tabInfo = findTab(id); if (!tabInfo) { organizrConsole( "Tab Action Function", "No Tab Info Found... Id: " + id, "error" ); return false; } let type = tabInfo.type; let name = tabInfo.name; if ((event.ctrlKey && !event.shiftKey && !event.altKey) || event.which == 2) { popTab(id); } else if (event.altKey && !event.shiftKey && !event.ctrlKey) { closeTab(id); } else if (event.shiftKey && !event.ctrlKey && !event.altKey) { reloadTab(id); } else if (event.ctrlKey && event.shiftKey && !event.altKey) { organizrConsole("Tab Function", "Action not defined yet", "info"); } else if (event.ctrlKey && event.altKey && !event.shiftKey) { organizrConsole("Tab Function", "Action not defined yet", "info"); switchTab(id, true); } else if (event.shiftKey && event.altKey && !event.ctrlKey) { organizrConsole("Tab Function", "Action not defined yet", "info"); } else { switchTab(id); if (type !== 2) { $(".splash-screen").removeClass("in").addClass("hidden"); } if (redirectURL) { $(".close-popup").trigger("click"); $("#frame-" + id).attr("src", redirectURL); } } } function reverseObject(object) { var newObject = {}; var keys = []; for (var key in object) { keys.push(key); } for (var i = keys.length - 1; i >= 0; i--) { var value = object[keys[i]]; newObject[keys[i]] = value; } return newObject; } function hasValue(test) { if (Array.isArray(test) && test[0] !== "") { return true; } else { return false; } } function arrayContains(needle, arrhaystack) { return arrhaystack.indexOf(needle) > -1; } /* END NORMAL FUNCTIONS */ /* BUILD FUNCTIONS */ /* END BUILD FUNCTIONS */ /* ORGANIZR API FUNCTIONS */ function selectOptions(options, active) { var selectOptions = ""; $.each(options, function (i, v) { activeTest = active.split(","); if (activeTest.length > 1) { var selected = arrayContains(v.value, activeTest) ? "selected" : ""; } else { var selected = active.toString() == v.value ? "selected" : ""; } var disabled = v.disabled ? " disabled" : ""; selectOptions += ""; }); return selectOptions; } function accordionOptions(options, parentID) { var accordionOptions = ""; $.each(options, function (i, v) { var id = v.id; var extraClass = v.class ? " " + v.class : ""; var header = v.header ? " " + v.header : ""; if (typeof v.body == "object") { if (typeof v.body.length == "undefined") { var body = buildFormItem(v.body); } else { var body = ""; $.each(v.body, function (int, val) { body += buildFormItem(val); }); } } else { var body = v.body; } accordionOptions += `
`; }); return accordionOptions; } function buildAccordion(array, open = false) { var items = ""; var mainId = createRandomString(10); $.each(array, function (i, v) { var collapse = open && i == 0 ? "collapse in" : "collapse"; var collapsed = open && i == 0 ? "" : "collapsed"; var id = mainId + "-" + i; items += `
` + v.body + `
`; }); return ( '
' + items + "
" ); } function buildFormItem(item) { var placeholder = item.placeholder ? ' placeholder="' + item.placeholder + '"' : ""; var id = item.id ? ' id="' + item.id + '"' : ""; var type = item.type ? ' data-type="' + item.type + '"' : ""; var label = item.label ? ' data-label="' + item.label + '"' : ""; var value = item.value ? ' value="' + item.value + '"' : ""; var textarea = item.value ? item.value : ""; var name = item.name ? ' name="' + item.name + '"' : ""; var extraClass = item.class ? " " + item.class : ""; var icon = item.icon ? " " + item.icon : ""; var text = item.text ? " " + item.text : ""; var attr = item.attr ? " " + item.attr : ""; var disabled = item.disabled ? " disabled" : ""; var href = item.href ? ' href="' + item.href + '"' : ""; var pwd1 = createRandomString(6); var pwd2 = createRandomString(6); var pwd3 = createRandomString(6); var helpInfo = item.help ? '
' + item.help + "
" : ""; var smallLabel = item.smallLabel ? '" + helpInfo : "" + helpInfo; var pwgMgr = ` `; //+tof(item.value,'c')+` switch (item.type) { case "select-input": return ( smallLabel + '' + selectOptions(item.options, item.value) + "" ); case "input": case "text": return ( smallLabel + '' ); case "number": return ( smallLabel + '' ); case "textbox": return ( smallLabel + '" ); case "password": return ( smallLabel + pwgMgr + '' ); case "password-alt": return ( smallLabel + '
' + pwgMgr + '
' ); case "password-alt-copy": return ( smallLabel + '
' + pwgMgr + '
' ); case "hidden": return ( '" ); case "select": return ( smallLabel + '" ); case "select2": var select2ID = item.id ? "#" + item.id : "." + item.name; let settings = item.settings ? item.settings : "{}"; return ( smallLabel + '' ); case "switch": case "checkbox": return ( smallLabel + '' ); case "button": return ( smallLabel + '" ); case "blank": return ""; case "accordion": return ( '
' + accordionOptions(item.options, item.id) + "
" ); case "html": return item.html; case "arrayMultiple": return 'BuildFormItem Class not setup...'; case "cron": return `${smallLabel}
`; case "folder": return `${smallLabel}
`; default: return 'BuildFormItem Class not setup...'; } } function checkCronFile() { $(".cron-results-container").removeClass("hidden"); organizrAPI2("GET", "api/v2/test/cron") .success(function (data) { try { $(".cron-results").text("Cron file is setup correctly"); } catch (e) { $(".cron-results").text("Unknown error"); organizrCatchError(e, data); } }) .fail(function (xhr) { $(".cron-results").text("Cron file is not setup or is setup incorrectly"); OrganizrApiError(xhr); }); } function buildPluginsItem(array, type = "enabled") { var activePlugins = ""; var inactivePlugins = ""; $.each(array, function (i, v) { var settingsPage = v.settings == true && type == "enabled" ? `
` + v.name + ` Settings

Loading...

` : ""; var href = v.settings == true ? "#" + v.idPrefix + "-settings-page" : "javascript:void(0);"; if (v.enabled == true) { var activeToggle = `
  • `; var settings = `
  • `; } else { var activeToggle = `
  • `; var settings = ""; } var plugin = `
      ${settings} ${activeToggle}

    ` + v.name + `

    ` + v.category + `
    `; if (v.enabled == true) { activePlugins += plugin + settingsPage; } else { inactivePlugins += plugin + settingsPage; } }); activePlugins = activePlugins.length !== 0 ? activePlugins : '

    Nothing Active

    '; inactivePlugins = inactivePlugins.length !== 0 ? inactivePlugins : '

    Everything Active

    '; return type === "enabled" ? `
    Active Plugins
    ` + activePlugins + `
    ` : `
    Inactive Plugins
    ` + inactivePlugins + `
    `; } function buildPluginsItemOld(array) { var activePlugins = ""; var inactivePlugins = ""; $.each(array, function (i, v) { var settingsPage = v.settings == true ? `
    ` + v.name + ` Settings

    Loading...

    ` : ""; var href = v.settings == true ? "#" + v.idPrefix + "-settings-page" : "javascript:void(0);"; if (v.enabled == true) { var activeToggle = `
  • `; var settings = `
  • `; } else { var activeToggle = `
  • `; var settings = ""; } var plugin = `
      ${settings} ${activeToggle}

    ` + v.name + `

    ` + v.category + `
    `; if (v.enabled == true) { activePlugins += plugin + settingsPage; } else { inactivePlugins += plugin + settingsPage; } }); activePlugins = activePlugins.length !== 0 ? activePlugins : '

    Nothing Active

    '; inactivePlugins = inactivePlugins.length !== 0 ? inactivePlugins : '

    Everything Active

    '; var panes = `
    Active Plugins
    ` + activePlugins + `
    Inactive Plugins
    ` + inactivePlugins + `
    Plugin Marketplace
    PLUGIN CATEGORY STATUS INFO INSTALL DELETE
    `; return panes; } function loadMarketplace(type) { marketplaceJSON(type) .success(function (data) { try { var response = JSON.parse(data); } catch (e) { organizrCatchError(e, data); } switch (type) { case "plugins": loadMarketplacePluginsItems(response); break; case "themes": loadMarketplaceThemesItems(response); break; default: } }) .fail(function (xhr) { OrganizrApiError(xhr); }); } function loadThemeMarketplace() { $("#manageThemeTable").html( '' ); organizrAPI2("GET", "api/v2/themes/marketplace") .success(function (data) { try { let response = data.response; loadMarketplaceThemesItems(response.data); } catch (e) { organizrCatchError(e, data); } }) .fail(function (xhr) { OrganizrApiError(xhr, "loadThemeMarketplace Failed"); }); } function loadPluginMarketplace() { $("#managePluginTable").html( '' ); organizrAPI2("GET", "api/v2/plugins/marketplace") .success(function (data) { try { let response = data.response; loadMarketplacePluginsItems(response.data); } catch (e) { organizrCatchError(e, data); } }) .fail(function (xhr) { OrganizrApiError(xhr, "loadPluginMarketplace Failed"); }); } function loadMarketplacePluginsItems(plugins) { var pluginList = ""; $.each(plugins, function (i, v) { if (v.icon == null || v.icon == "") { v.icon = "test.png"; } var installButton = v.status == "Update Available" ? "fa fa-download" : "fa fa-plus"; var removeButton = v.status == "Not Installed" ? "disabled" : ""; v.name = i; pluginList += `
    user-img
    ` + i + `
    ` + v.version + `
    ` + v.author + ` ` + v.category + ` ` + v.status + ` `; }); $("#managePluginTable").html(pluginList); } function getRepoUsernameAndRepoName(repo) { let parts = repo.split("/"); if (parts.length) { return parts[parts.length - 2] + "/" + parts[parts.length - 1]; } else { return repo; } } function loadMarketplaceThemesItems(themes) { var themeList = ""; $.each(themes, function (i, v) { if (v.icon == null || v.icon == "") { v.icon = "test.png"; } //v.status = themeStatus(i,v.version); var installButton = v.status == "Update Available" ? "fa fa-download" : "fa fa-plus"; var removeButton = v.status == "Not Installed" ? "disabled" : ""; let category = v.repo == "https://github.com/Organizr/Organizr-Themes" ? "Official" : "3rd Party"; let categoryTooltip = getRepoUsernameAndRepoName(v.repo); v.name = i; let cleanName = i.replace(/_/gi, " "); themeList += `
    user-img
    ${cleanName}
    ${v.version}
    ${v.author} ${category} ${v.status} `; }); $("#manageThemeTable").html(themeList); } function aboutPluginImages(images) { var imageList = ""; if (Object.keys(images).length !== 0) { var imageCount = 0; $.each(images, function (i, v) { imageCount++; var active = imageCount == 1 ? "active" : ""; imageList += `
    ` + i + `
    `; }); } else { imageList += `
    `; } return imageList; } function aboutPluginFiles(fileList) { var files = []; $.each(fileList, function (i, v) { var splitFiles = v.split("|"); var formattedSplit = []; $.each(splitFiles, function (i, v) { var arrayFilePush = { text: v, }; formattedSplit.push(arrayFilePush); }); var arrayPush = { text: i, nodes: formattedSplit, }; files.push(arrayPush); }); return files; } function pluginFileList(fileList, folder, type) { var files = []; $.each(fileList, function (i, v) { var splitFiles = v.split("|"); var formattedSplit = []; var prePath = i.length !== 1 ? i + "/" : i; $.each(splitFiles, function (i, v) { var arrayPush = { fileName: v, path: prePath, githubPath: "https://raw.githubusercontent.com/causefx/Organizr/v2-" + type + "/" + folder + prePath + v, }; files.push(arrayPush); }); }); return files; } function aboutTheme(theme) { var files = aboutPluginFiles(theme.files); var imageList = aboutPluginImages(theme.images); var homepageLink = theme.website !== "" || theme.website !== null ? "onclick=\"window.open('" + theme.website + "','_blank');\"" : " "; var infoBox = `
    ` + theme.description + `
     
    `; $("#about-theme-title").html( theme.name + " " + theme.version + "" ); $("#about-theme-body").html(infoBox); $(".vcarousel").carousel({ interval: 3000, }); $("#treeviewTheme").treeview({ levels: 1, expandIcon: "ti-angle-right", onhoverColor: "rgba(0, 0, 0, 0.05)", selectedBackColor: "#03a9f3", collapseIcon: "ti-angle-down", data: JSON.stringify(files), }); $("#aboutThemeScroll").slimScroll({ height: "225px", }); } function aboutPlugin(plugin) { var files = aboutPluginFiles(plugin.files); var imageList = aboutPluginImages(plugin.images); var homepageLink = plugin.website !== "" || plugin.website !== null ? "onclick=\"window.open('" + plugin.website + "','_blank');\"" : " "; var infoBox = `
    ` + plugin.description + `
     
    `; $("#about-plugin-title").html( plugin.name + " " + plugin.version + "" ); $("#about-plugin-body").html(infoBox); $(".vcarousel").carousel({ interval: 3000, }); $("#treeview5").treeview({ levels: 1, expandIcon: "ti-angle-right", onhoverColor: "rgba(0, 0, 0, 0.05)", selectedBackColor: "#03a9f3", collapseIcon: "ti-angle-down", data: JSON.stringify(files), }); $("#aboutPluginScroll").slimScroll({ height: "225px", }); } function removePlugin(plugin = null) { if (plugin == null) { return false; } message( "Removing Plugin", plugin, activeInfo.settings.notifications.position, "#FFF", "success", "5000" ); organizrAPI2("DELETE", "api/v2/plugins/manage/" + plugin, {}) .success(function (data) { try { let html = data.response; loadPluginMarketplace(); message( plugin + " Removed", "", activeInfo.settings.notifications.position, "#FFF", "success", "5000" ); } catch (e) { organizrCatchError(e, data); } }) .fail(function (xhr) { OrganizrApiError(xhr, "Removal Failed"); }); } function removeTheme(theme = null) { if (theme == null) { return false; } message( "Removing Theme", theme, activeInfo.settings.notifications.position, "#FFF", "success", "5000" ); organizrAPI2("DELETE", "api/v2/themes/manage/" + theme, {}) .success(function (data) { try { let html = data.response; loadThemeMarketplace(); message( theme + " Removed", "", activeInfo.settings.notifications.position, "#FFF", "success", "5000" ); } catch (e) { organizrCatchError(e, data); } }) .fail(function (xhr) { OrganizrApiError(xhr, "Removal Failed"); }); } function installPlugin(plugin = null) { if (plugin == null) { return false; } message( "Installing Plugin", plugin, activeInfo.settings.notifications.position, "#FFF", "success", "5000" ); organizrAPI2("POST", "api/v2/plugins/manage/" + plugin, {}) .success(function (data) { try { var html = data.response; loadPluginMarketplace(); message( plugin + " Installed", "", activeInfo.settings.notifications.position, "#FFF", "success", "5000" ); } catch (e) { organizrCatchError(e, data); } }) .fail(function (xhr) { OrganizrApiError(xhr, "Install Failed"); }); } function installTheme(theme = null) { if (theme == null) { return false; } message( "Installing Theme", theme, activeInfo.settings.notifications.position, "#FFF", "success", "5000" ); organizrAPI2("POST", "api/v2/themes/manage/" + theme, {}) .success(function (data) { try { var html = data.response; loadThemeMarketplace(); message( theme + " Installed", "", activeInfo.settings.notifications.position, "#FFF", "success", "5000" ); } catch (e) { organizrCatchError(e, data); } }) .fail(function (xhr) { OrganizrApiError(xhr, "Install Failed"); }); } function pluginStatus(name = null, version = null) { var installedPlugins = []; var installedPluginsList = []; if (activeInfo.settings.misc.installedPlugins !== "") { installedPlugins = activeInfo.settings.misc.installedPlugins.split("|"); $.each(installedPlugins, function (i, v) { var plugin = v.split(":"); installedPluginsList[plugin[0]] = plugin[1]; }); if (typeof installedPluginsList[name] !== "undefined") { if (version !== installedPluginsList[name]) { return "Update Available"; } else { return "Up to date"; } } else { return "Not Installed"; } } else { return "Not Installed"; } } function themeStatus(name = null, version = null) { var installedThemes = []; var installedThemesList = []; if (activeInfo.settings.misc.installedThemes !== "") { installedThemes = activeInfo.settings.misc.installedThemes.split("|"); $.each(installedThemes, function (i, v) { var theme = v.split(":"); installedThemesList[theme[0]] = theme[1]; }); if (typeof installedThemesList[name] !== "undefined") { if (version !== installedThemesList[name]) { return "Update Available"; } else { return "Up to date"; } } else { return "Not Installed"; } } else { return "Not Installed"; } } function copyHomepageJSON(item) { organizrAPI2("GET", "api/v2/settings/homepage/" + item + "/debug") .success(function (data) { try { let response = data.response; let debug = response.data; clipboard(true, JSON.stringify(debug, null, "\t")); message( "", window.lang.translate("Copied JSON to clipboard"), activeInfo.settings.notifications.position, "#FFF", "success", "5000" ); } catch (e) { organizrCatchError(e, data); } }) .fail(function (xhr) { OrganizrApiError(xhr, "Copy JSON Failed"); }); } function homepageItemFormHTML(v) { let docs = typeof v.docs == "undefined" ? "" : ` `; let debug = typeof v.debug == "undefined" ? false : true; debug = debug === true ? v.debug : false; debug = debug === true ? ` ` : ""; return ( `
    ` + v.name + ` ${docs}${debug}
    ` + buildFormGroup(v.settings) + `
    ` ); } function clearHomepageOriginal() { $("#editHomepageItem").html(""); } function completeHomepageLoad(item, data) { /* if(item == 'CustomHTML'){ let iteration = 0; $.each(data.settings, function(i,customItem) { let iterationString = (parseInt(iteration, 10) + 101).toString().substr(1); let customEditor = 'customHTML'+iterationString+'Editor'; let customTextarea = 'customHTML'+iterationString+'Textarea'; let HTMLMode = ace.require("ace/mode/html").Mode; customHTMLEditorObject[iterationString] = ace.edit(customEditor); customHTMLEditorObject[iterationString].session.setMode(new HTMLMode()); customHTMLEditorObject[iterationString].setTheme("ace/theme/idle_fingers"); customHTMLEditorObject[iterationString].setShowPrintMargin(false); customHTMLEditorObject[iterationString].session.on('change', function(delta) { $('.' + customTextarea).val(customHTMLEditorObject[iterationString].getValue()); //$('#homepage-CustomHTML-form-save').removeClass('hidden'); }); iteration++; }); } */ pageLoad(); } function editHomepageItem(item, reload = false) { ajaxloader(".editHomepageItemBox-" + item, "in"); organizrAPI2("GET", "api/v2/settings/homepage/" + item) .success(function (data) { try { let response = data.response; let html = homepageItemFormHTML(response.data); $("#editHomepageItem").html(html); if (reload) { ajaxloader(".editHomepageItemBox-" + item); return false; } /*$("#editHomepageItemCall").animatedModal({ top: '40px', left: '0px', color: '#000000eb', animatedIn: 'bounceInUp', animatedOut: 'bounceOutDown', position: 'fixed', afterClose: function() { $('body, html').css({'overflow':'hidden'}); } });*/ new Custombox.modal({ content: { effect: "slidetogether", animateFrom: "bottom", animateTo: "bottom", target: "#editHomepageItemDiv", width: "100%", delay: 0, fullscreen: true, clone: false, onComplete: completeHomepageLoad(item, response.data), onClose: clearHomepageOriginal, }, loader: { active: true }, }).open(); //$('#editHomepageItemCall').click(); } catch (e) { organizrCatchError(e, data); } ajaxloader(".editHomepageItemBox-" + item); }) .fail(function (xhr) { OrganizrApiError(xhr, "Edit Homepage Failed"); ajaxloader(".editHomepageItemBox-" + item); }); } function buildHomepageItem(array) { var listing = ""; if (Array.isArray(array)) { $.each(array, function (i, v) { if (v.enabled) { listing += `

    ` + v.name + `

    ` + v.category + `
    `; } }); } return listing; } function buildPluginsOLD() { organizrAPI2("GET", "api/v2/plugins") .success(function (data) { try { var response = data.response; } catch (e) { organizrCatchError(e, data); } $("#main-plugin-area").html(buildPluginsItemOLD(response.data)); }) .fail(function (xhr) { OrganizrApiError(xhr); }); } function buildPlugins(status = "enabled") { organizrAPI2("GET", "api/v2/plugins/" + status) .success(function (data) { try { var response = data.response; } catch (e) { organizrCatchError(e, data); } $("#" + status + "-plugin-area").html( buildPluginsItem(response.data, status) ); }) .fail(function (xhr) { OrganizrApiError(xhr); }); } function buildHomepage() { organizrAPI2("GET", "api/v2/settings/homepage") .success(function (data) { try { var response = data.response; } catch (e) { organizrCatchError(e, data); } $("#settings-homepage-list").html(buildHomepageItem(response.data)); }) .fail(function (xhr) { OrganizrApiError(xhr); }); } function buildFormGroup(array) { var mainCount = 0; var group = '
    '; var uList = '
    " + group + "
    "; } function createImageSwal(attr) { let title = attr.attr("data-title"); let fullPath = attr.attr("data-image-path"); let clipboardText = attr.attr("data-clipboard-text"); let name = attr.attr("data-image-name"); let extension = attr.attr("data-image-name-ext"); let div = `

    ` + title + `

    Choose action:
    `; swal({ content: createElementFromHTML(div), buttons: false, className: "bg-org", }); } function buildImageManagerViewItem(array) { var imageListing = ""; if (Array.isArray(array)) { $.each(array, function (i, v) { var filepath = v.split("/"); var name = filepath[filepath.length - 1].split("."); var clipboardText = v.replace(/ /g, "%20"); var fileAndExt = filepath[filepath.length - 1]; imageListing += ` tabImage `; }); } return imageListing; } function buildImageManagerView() { organizrAPI2("GET", "api/v2/image") .success(function (data) { try { let response = data.response; $(".settings-image-manager-list").html( buildImageManagerViewItem(response.data) ); $container = $("#gallery-content-center"); try { if (typeof $container.isotope == "undefined") { $container.isotope({ itemSelector: "img" }); } else { $container.isotope({ itemSelector: "img" }); } } catch (e) { $container.isotope("destroy"); $container.isotope({ itemSelector: "img" }); } } catch (e) { organizrCatchError(e, data); } }) .fail(function (xhr) { OrganizrApiError(xhr); }); } function buildPluginsSettings() { organizrAPI2("GET", "api/v2/settings/plugin") .success(function (data) { try { let response = data.response; $("#plugin-settings-form").html(buildFormGroup(response.data)); } catch (e) { organizrCatchError(e, data); } }) .fail(function (xhr) { OrganizrApiError(xhr); }); } function buildThemeSettings() { organizrAPI2("GET", "api/v2/settings/theme") .success(function (data) { try { let response = data.response; $("#theme-settings-form").html(buildFormGroup(response.data)); } catch (e) { organizrCatchError(e, data); } }) .fail(function (xhr) { OrganizrApiError(xhr); }); } function buildCustomizeAppearance() { organizrAPI2("GET", "api/v2/settings/appearance") .success(function (data) { try { var response = data.response; } catch (e) { organizrCatchError(e, data); } $("#customize-appearance-form").html(buildFormGroup(response.data)); $("input.pick-a-color-custom-options").ColorPickerSliders({ placement: "bottom", color: "#987654", hsvpanel: true, previewformat: "hex", }); }) .fail(function (xhr) { OrganizrApiError(xhr); }); } function buildSSO() { organizrAPI2("GET", "api/v2/settings/sso") .success(function (data) { try { var response = data.response; } catch (e) { organizrCatchError(e, data); } $("#sso-form").html(buildFormGroup(response.data)); }) .fail(function (xhr) { console.error("Organizr Function: API Connection Failed"); }); } function buildSettingsMain() { organizrAPI2("GET", "api/v2/settings/main") .success(function (data) { try { var response = data.response; } catch (e) { organizrCatchError(e, data); } $("#settings-main-form").html(buildFormGroup(response.data)); changeAuth(); }) .fail(function (xhr) { OrganizrApiError(xhr); }); } function buildUserManagement() { organizrAPI2("GET", "api/v2/users?includeGroups") .success(function (data) { try { var response = data.response; } catch (e) { organizrCatchError(e, data); } $("#manageUserTable").html(buildUserManagementItem(response.data)); }) .fail(function (xhr) { OrganizrApiError(xhr); }); } function buildGroupManagement() { organizrAPI2("GET", "api/v2/groups?includeUsers") .success(function (data) { try { var response = data.response; } catch (e) { organizrCatchError(e, data); } $("#manageGroupTable").html(buildGroupManagementItem(response.data)); }) .fail(function (xhr) { OrganizrApiError(xhr); }); } function buildTabEditor() { organizrAPI2("GET", "api/v2/tabs") .success(function (data) { try { var response = data.response; } catch (e) { organizrCatchError(e, data); } $("#tabEditorTable").html(buildTabEditorItem(response.data)); checkTabHomepageItems(); addTabSortable(); }) .fail(function (xhr) { OrganizrApiError(xhr); }); } function addTabSortable() { let el = document.getElementById("tabEditorTable"); let tabSorter = new Sortable(el, { handle: ".sort-tabs-handle", ghostClass: "sortable-ghost", multiDrag: true, selectedClass: "multi-selected", onUpdate: function (evt) { $("input.order").each(function (idx) { $(this).val(idx + 1); }); newTabsGlobal = $("#submit-tabs-form").serializeToJSON(); $(".saveTabOrderButton").removeClass("hidden"); }, }); } function checkTabHomepageItems() { var tabList = $(".checkTabHomepageItem"); $.each(tabList, function (i, v) { var el = $(v); var id = el.attr("id"); var name = el.attr("data-name"); var url = el.attr("data-url"); var urlLocal = el.attr("data-url-local"); checkTabHomepageItem(id, name, url, urlLocal); }); } function sortHomepageItemHrefs() { var hrefList = $(".popup-with-form"); window.hrefList = new Array(); $.each(hrefList, function (i, v) { var el = $(v); var href = el.attr("href"); if (href.includes("#homepage-")) { var splitHref = href.split("-"); window.hrefList[splitHref[1]] = i; } }); } function checkTabHomepageItemList(name, url, urlLocal, id, check, tab) { // might use this later if (name.includes(check) || url.includes(check) || urlLocal.includes(check)) { addEditHomepageItem(id, tab); } } function checkTabHomepageItem(id, name, url, urlLocal) { name = name.toLowerCase(); url = url.toLowerCase(); urlLocal = urlLocal.toLowerCase(); try { let urlObject = new URL(url); if (urlObject.pathname !== "/" && urlObject !== "#") { url = urlObject.pathname; } } catch { url = url; } if ( name.includes("sonarr") || url.includes("sonarr") || urlLocal.includes("sonarr") ) { addEditHomepageItem(id, "Sonarr"); } else if ( name.includes("radarr") || url.includes("radarr") || urlLocal.includes("radarr") ) { addEditHomepageItem(id, "Radarr"); } else if ( name.includes("lidarr") || url.includes("lidarr") || urlLocal.includes("lidarr") ) { addEditHomepageItem(id, "Lidarr"); } else if ( name.includes("couchpotato") || url.includes("couchpotato") || urlLocal.includes("couchpotato") ) { addEditHomepageItem(id, "CouchPotato"); } else if ( name.includes("sick") || url.includes("sick") || urlLocal.includes("sick") ) { addEditHomepageItem(id, "SickRage"); } else if ( (name.includes("plex") || url.includes("plex") || urlLocal.includes("plex")) && !name.includes("plexpy") ) { addEditHomepageItem(id, "Plex"); } else if ( name.includes("emby") || url.includes("emby") || urlLocal.includes("emby") ) { addEditHomepageItem(id, "Emby"); } else if ( name.includes("jdownloader") || url.includes("jdownloader") || urlLocal.includes("jdownloader") || name.includes("rsscrawler") || url.includes("rsscrawler") || urlLocal.includes("rsscrawler") ) { addEditHomepageItem(id, "jDownloader"); } else if ( name.includes("sab") || url.includes("sab") || urlLocal.includes("sab") ) { addEditHomepageItem(id, "SabNZBD"); } else if ( name.includes("nzbget") || url.includes("nzbget") || urlLocal.includes("nzbget") ) { addEditHomepageItem(id, "NZBGet"); } else if ( name.includes("transmission") || url.includes("transmission") || urlLocal.includes("transmission") ) { addEditHomepageItem(id, "Transmission"); } else if ( name.includes("qbit") || url.includes("qbit") || urlLocal.includes("qbit") ) { addEditHomepageItem(id, "qBittorrent"); } else if ( name.includes("rtorrent") || url.includes("rtorrent") || urlLocal.includes("rtorrent") ) { addEditHomepageItem(id, "rTorrent"); } else if ( name.includes("utorrent") || url.includes("utorrent") || urlLocal.includes("utorrent") ) { addEditHomepageItem(id, "utorrent"); } else if ( name.includes("deluge") || url.includes("deluge") || urlLocal.includes("deluge") ) { addEditHomepageItem(id, "Deluge"); } else if ( name.includes("ombi") || url.includes("ombi") || urlLocal.includes("ombi") ) { addEditHomepageItem(id, "Ombi"); } else if ( name.includes("healthcheck") || url.includes("healthcheck") || urlLocal.includes("healthcheck") ) { addEditHomepageItem(id, "HealthChecks"); } else if ( name.includes("jackett") || url.includes("jackett") || urlLocal.includes("jackett") ) { addEditHomepageItem(id, "Jackett"); } else if ( name.includes("prowlarr") || url.includes("prowlarr") || urlLocal.includes("prowlarr") ) { addEditHomepageItem(id, "Prowlarr"); } else if ( name.includes("unifi") || url.includes("unifi") || urlLocal.includes("unifi") ) { addEditHomepageItem(id, "Unifi"); } else if ( name.includes("tautulli") || url.includes("tautulli") || urlLocal.includes("tautulli") ) { addEditHomepageItem(id, "Tautulli"); } } function addEditHomepageItem(id, type) { let html = ''; $("#" + id).html(html); $("#" + id).attr("onclick", 'editHomepageItem("' + type + '")'); return false; } function buildCategoryEditor() { organizrAPI2("GET", "api/v2/tabs") .success(function (data) { try { var response = data.response; } catch (e) { organizrCatchError(e, data); } $("#categoryEditorTable").html(buildCategoryEditorItem(response.data)); }) .fail(function (xhr) { OrganizrApiError(xhr); }); } /* END ORGANIZR API FUNCTIONS */ function buildLanguage(replace = false, newLang = null) { var languageItems = ""; var currentLanguage = getCookie("organizrLanguage") ? getCookie("organizrLanguage") : window.lang.currentLang; var newLangCode = ""; $.each(languageList, function (i, v) { if (newLang === v.language) { newLangCode = v.code; } var active = v.code == currentLanguage ? "" : ""; languageItems += `
    ` + v.language + `
    ` + active + `
    `; }); var lang = ` `; if (replace == true) { setLangCookie(newLangCode); $("#languageDropdown").replaceWith(lang); message( "", window.lang.translate("Changed Language To") + ": " + newLang, activeInfo.settings.notifications.position, "#FFF", "success", "3500" ); } else if (replace == "wizard") { $(lang).appendTo(".navbar-right"); } else { return lang; } } function updateUserInformation() { var passwordMatch = true; var username = $("#accountUsername").val(); var email = $("#accountEmail").val(); var password1 = $("#accountPassword1").val(); var password2 = $("#accountPassword2").val(); if (password1 != password2) { passwordMatch = false; messageSingle( "", "Passwords do not match", activeInfo.settings.notifications.position, "#FFF", "error", "5000" ); return false; } if (username !== "" && email !== "" && passwordMatch == true) { var post = { username: username, email: email, }; if (password1 !== "") { post["password"] = password1; } ajaxloader(".content-wrap", "in"); organizrAPI2("PUT", "api/v2/users/" + activeInfo.user.userID, post) .success(function (data) { try { var response = data.response; $.magnificPopup.close(); messageSingle( "", window.lang.translate("User Info Updated"), activeInfo.settings.notifications.position, "#FFF", "success", "5000" ); } catch (e) { organizrCatchError(e, data); } ajaxloader(); }) .fail(function (xhr) { OrganizrApiError(xhr, "Update User"); ajaxloader(); }); } } function twoFA(action, type, secret = null) { switch (action) { case "activate": organizrAPI2("POST", "api/v2/2fa/" + type, {}) .success(function (data) { try { var html = data.response; } catch (e) { organizrCatchError(e, data); } let div = `
    Enable 2FA: ` + html.data.type + `

    ` + html.data.secret + `

    `; swal({ content: createElementFromHTML(div), buttons: false, className: "bg-org", }); }) .fail(function (xhr) { OrganizrApiError(xhr, "2FA"); }); break; case "deactivate": organizrAPI2("DELETE", "api/v2/2fa") .success(function (data) { try { message( "2FA Removed", "", activeInfo.settings.notifications.position, "#FFF", "success", "5000" ); $(".2fa-list").replaceWith(buildTwoFA("internal")); } catch (e) { organizrCatchError(e, data); } }) .fail(function (xhr) { OrganizrApiError(xhr, "2FA"); }); break; case "verify": var secret = $(".twofa-modal-secret").text(); var code = $("#twofa-verify").val(); if (type !== "" && secret !== "" && code !== "") { organizrAPI2("POST", "api/v2/2fa", { type: type, secret: secret, code: code, }) .success(function (data) { try { var html = data.response; message( "2FA Success", "Input Code Validated! Saving...", activeInfo.settings.notifications.position, "#FFF", "success", "5000" ); swal.close(); twoFA("save", type, secret); } catch (e) { organizrCatchError(e, data); } }) .fail(function (xhr) { OrganizrApiError(xhr, "2FA"); }); } else { message( "2FA Failed", "Input Code", activeInfo.settings.notifications.position, "#FFF", "warning", "5000" ); } break; case "save": organizrAPI2("PUT", "api/v2/2fa", { type: type, secret: secret }) .success(function (data) { try { var html = data.response; message( "2FA Success", "2FA Saved", activeInfo.settings.notifications.position, "#FFF", "success", "5000" ); $(".2fa-list").replaceWith(buildTwoFA(type)); } catch (e) { organizrCatchError(e, data); } }) .fail(function (xhr) { OrganizrApiError(xhr, "2FA"); }); break; } } function buildTwoFA(current) { switch (current) { case "internal": var option = `
    • Organizr Authenticator
      Current
    `; break; case "google": var option = `
    `; break; default: break; } var element = `
    ` + option + `
    `; return element; } function scrapeCall() { // Define the URL to scrape [only supports GET at the moment var url = "https://api.github.com/users/causefx/repos"; // Define callbacks variable first var callbacks = $.Callbacks(); // Add functions that will deal with the data callbacks.add(scrapeFunction); // Call the API function to scrape the page you want [types = 'json' or 'html'] scrapeAPI(url, callbacks, "json"); } function scrapeFunction(data) { // Here you would do whatever you like if (data.data.result == "Success") { console.log("Success!!!"); } console.log("data:"); console.log(data); } function scrapeAPI(url, callbacks = null, type = null) { if (typeof url === "undefined") { console.log("error"); return false; } organizrAPI2("POST", "api/v2/homepage/scrape", { url: url, type: type }) .success(function (data) { try { let response = data.response; if (response) { if (callbacks) { callbacks.fire(response); } } } catch (e) { organizrCatchError(e, data); } }) .fail(function (xhr) { OrganizrApiError(xhr, "Scrape"); }); } function revokeToken(id) { organizrAPI2("DELETE", "api/v2/token/" + id, {}) .success(function (data) { try { $("#token-" + id).fadeOut(); message( window.lang.translate("Removed Token"), "", activeInfo.settings.notifications.position, "#FFF", "success", "3500" ); } catch (e) { organizrCatchError(e, data); } }) .fail(function (xhr) { ajaxloader(); OrganizrApiError(xhr, "Revoke Token"); }); } function buildActiveTokens(array) { var parser = new UAParser(); var tokens = ""; $.each(array, function (i, v) { parser.setUA(v.browser); var result = parser.getResult(); var className = activeInfo.user.token === v.token ? "bg-success text-inverse" : ""; var extraText = activeInfo.user.token === v.token ? '...' + v.token.substr(-10, 10) + "" : v.token.substr(-10, 10); if (typeof v.created == "object") { v.created = v.created.date; } if (typeof v.expires == "object") { v.expires = v.expires.date; } v.created = v.created.indexOf("Z") !== -1 ? v.created : v.created + "Z"; v.expires = v.expires.indexOf("Z") !== -1 ? v.expires : v.expires + "Z"; tokens += ` ` + v.id + ` ` + extraText + ` ` + moment(v.created).format("LLL") + ` ` + moment(v.expires).format("LLL") + ` ` + v.ip + ` `; }); return ( `
    Active Tokens
    ` + tokens + `
    # Token Created Expires IP Action
    ` ); } function accountManager(user) { var passwordMessage = ""; switch (activeInfo.settings.misc.authBackend) { case "plex": passwordMessage = `
    Password Notice

    If you signed in with a Plex Acct... Please use the following link to change your password there:


    Change Password on Plex Website

    `; break; case "emby": passwordMessage = `
    Password Notice

    If you signed in with a Emby Acct... Please use the following link to change your password there:


    Change Password on Emby Website

    `; break; default: passwordMessage = ""; break; } if (user.data.user.loggedin === true) { var twoFADisable = buildTwoFA(user.data.user.authService) == "internal" ? "" : "disabled"; var activeTokens = buildActiveTokens(user.data.user.tokenList); var accountDiv = `
    Account Information
    ` + buildTwoFA(user.data.user.authService) + `
    User Information
    ` + activeTokens + passwordMessage + `
    `; $(".organizr-area").after(accountDiv); pageLoad(); } } function userMenu(user) { $("body").attr("data-active-user-group-name", user.data.user.group); $("body").attr("data-active-user-group-id", user.data.user.groupID); var sideMenu = ""; var menuList = ''; var showDebug = activeInfo.settings.misc.debugArea ? '
  • Debug Area
  • ' : ""; menuList += buildLanguage(); if (user.data.user.loggedin === true) { menuList += ` `; sideMenu += `
  • user-img ` + user.data.user.username + `
  • `; } else { menuList += ` `; sideMenu += `
  • user-img ` + user.data.user.username + `
  • `; } $(menuList).appendTo(".navbar-right").html; //$(sideMenu).appendTo('#side-menu').html; //message("",window.lang.translate('Welcome')+" "+user.data.user.username,activeInfo.settings.notifications.position,"#FFF","success","3500"); console.info( "%c " + window.lang.translate("Welcome") + " %c ".concat(user.data.user.username, " "), "color: white; background: #AD80FD; font-weight: 700;", "color: #AD80FD; background: white; font-weight: 700;" ); } function menuExtraTabs() { return [ { id: 99999991, type: 2, group_id: 1, name: "Github Repo", access_url: "https://github.com/causefx/organizr", url: "https://github.com/causefx/organizr", image: "fontawesome::github", active: activeInfo.settings.menuLink.githubMenuLink, ping_url: null, }, { id: 99999992, type: 1, group_id: 1, name: "Organizr Support", access_url: "https://organizr.app/support", url: "https://organizr.app/support", image: "fontawesome::life-ring", active: activeInfo.settings.menuLink.organizrSupportMenuLink, ping_url: null, }, { id: 99999993, type: 2, group_id: 1, name: "Organizr Docs", access_url: "https://docs.organizr.app", url: "https://docs.organizr.app", image: "simpleline::docs", active: activeInfo.settings.menuLink.organizrDocsMenuLink, ping_url: null, }, { id: 99999994, type: 1, group_id: 1, name: "Feature Request", access_url: "https://feature.organizr.app", url: "https://feature.organizr.app", image: "simpleline::arrow-up-circle", active: activeInfo.settings.menuLink.organizrFeatureRequestLink, ping_url: null, }, ]; } function menuExtras(active) { let adminMenu = '
  • '; let extraOrganizrLinks = menuExtraTabs(); activeInfo.tabs = [].concat(activeInfo.tabs, menuExtraTabs()); $.each(extraOrganizrLinks, function (i, v) { tabInformation[v.id] = { id: v.id, name: cleanClass(v.name), active: false, loaded: false, increments: 0, tabInfo: v, }; if (v.type == 1) { let frame = buildFrameContainer(v.id); $(frame).appendTo($(".iFrame-listing")); } adminMenu += activeInfo.user.groupID <= v.group_id && v.active ? buildMenuList(v.id) : ""; }); if (active === true) { return activeInfo.settings.menuLink.organizrSignoutMenuLink ? `
  • Logout
  • ` + adminMenu : "" + adminMenu; } else { return activeInfo.settings.menuLink.organizrSignoutMenuLink ? `
  • ` : ""; } } function categoryProcess(arrayItems) { var menuList = ""; let categoryIn = activeInfo.settings.misc.expandCategoriesByDefault ? "in" : ""; let categoryActive = activeInfo.settings.misc.expandCategoriesByDefault ? "active" : ""; let categoryExpanded = activeInfo.settings.misc.expandCategoriesByDefault ? "true" : "false"; if ( Array.isArray(arrayItems["data"]["categories"]) && Array.isArray(arrayItems["data"]["tabs"]) ) { $.each(arrayItems["data"]["categories"], function (i, v) { if (v.count !== 0 && v.category_id !== 0) { menuList += `
  • ` + iconPrefix(v.image) + `` + v.category + ` ` + v.count + `
  • `; } }); $(menuList).appendTo($("#side-menu")); } } function buildFrame(id, split = null) { let extra = split ? "right-" : ""; let tabInfo = findTab(id); if (!tabInfo) { organizrConsole("Build Frame", "No Tab Info Found... Id: " + id, "error"); return false; } var sandbox = activeInfo.settings.misc.sandbox; sandbox = sandbox.replace(/,/gi, " "); sandbox = sandbox ? ' sandbox="' + sandbox + '"' : ""; var allow = activeInfo.settings.misc.iframeAllow; allow = allow.replace(/,/gi, "; "); allow = allow ? ' allow="' + allow + '"' : ""; return ( ` ` ); } function buildFrameContainer(id, split = null) { let extra = split ? "right-" : ""; return ( `` ); } function buildInternalContainer(id, split = null) { let extra = split ? "right-" : ""; return ( `` ); } function buildMenuList(id) { let tabInfo = findTab(id); if (!tabInfo) { organizrConsole( "Build Menu List", "No Tab Info Found... Id: " + id, "error" ); return false; } let name = tabInfo.name; let icon = tabInfo.image; let ping = typeof tabInfo.ping_url !== "undefined" ? tabInfo.ping_url : null; ping = ping !== null && ping !== "" ? `` : ""; return ( `` ); } function tabProcess(arrayItems) { var iFrameList = ""; var internalList = ""; var defaultTabId = null; if ( Array.isArray(arrayItems["data"]["tabs"]) && arrayItems["data"]["tabs"].length > 0 ) { $.each(arrayItems["data"]["tabs"], function (i, v) { if (v.enabled === 1 && v.access_url) { tabInformation[v.id] = { id: v.id, name: cleanClass(v.name), active: false, loaded: false, increments: 0, tabInfo: v, }; switch (v.timeout) { case 1: case "1": tabActionsList["close"].push({ id: v.id, tab: cleanClass(v.name), action_ms: v.timeout_ms, }); break; case 2: case "2": tabActionsList["refresh"].push({ id: v.id, tab: cleanClass(v.name), action_ms: v.timeout_ms, }); break; default: //nada } if (v.default === 1) { defaultTabId = v.id; } var menuList = buildMenuList(v.id); if (v.category_id === 0) { if (activeInfo.settings.misc.unsortedTabs === "top") { $(menuList).prependTo($("#side-menu")); } else if (activeInfo.settings.misc.unsortedTabs === "bottom") { $(menuList).appendTo($("#side-menu")); } } else { if (activeInfo.settings.misc.unsortedTabs === "top") { $(menuList).prependTo($(".category-" + v.category_id)); } else if (activeInfo.settings.misc.unsortedTabs === "bottom") { $(menuList).appendTo($(".category-" + v.category_id)); } } switch (v.type) { case 0: case "0": case "internal": internalList = buildInternalContainer(v.id); $(internalList).appendTo($(".internal-listing")); internalList = buildInternalContainer(v.id, true); $(internalList).appendTo($(".internal-listing-right")); if (v.preload) { var newTab = $("#internal-" + v.id); organizrConsole( "Tab Function", "Preloading new tab for: " + cleanClass(v.name) ); $("#menu-" + v.id + " a") .children() .addClass("tabLoaded"); newTab.addClass("loaded"); loadInternal(v.id); } break; case 1: case "1": case "iframe": iFrameList = buildFrameContainer(v.id); $(iFrameList).appendTo($(".iFrame-listing")); iFrameList = buildFrameContainer(v.id, true); $(iFrameList).appendTo($(".iFrame-listing-right")); if (v.preload) { var newTab = $("#container-" + v.id); organizrConsole( "Tab Function", "Preloading new tab for: " + cleanClass(v.name) ); $("#menu-" + v.id + " a") .children() .addClass("tabLoaded"); newTab.addClass("loaded"); $(buildFrame(v.id)).appendTo(newTab); } break; case 2: case 3: case "2": case "3": case "_blank": case "popout": break; default: organizrConsole("Tab Function", "Action not set", "error"); } } }); $("#side-menu").metisMenu({ toggle: activeInfo.settings.misc.autoCollapseCategories, }); getDefault(defaultTabId); } else { noTabs(arrayItems); } $(menuExtras(arrayItems.data.user.loggedin)).appendTo($("#side-menu")); } function buildLogin() { swapDisplay("login"); closeSideMenu(); removeMenuActive(); $("#menu-login a").addClass("active"); organizrAPI2("GET", "api/v2/page/login") .success(function (data) { try { var response = data.response; organizrConsole("Organizr Function", "Opening Login Page"); $(".login-area").html(response.data); setHash("OrganizrLogin"); } catch (e) { organizrCatchError(e, data); } }) .fail(function (xhr) { OrganizrApiError(xhr, "Login Error"); }); $("#preloader").fadeOut(); } function buildLockscreen() { $("#preloader").fadeIn(); closeSideMenu(); organizrAPI2("GET", "api/v2/page/lockscreen") .success(function (data) { try { var response = data.response; organizrConsole("Organizr Function", "Adding Lockscreen"); $(response.data).appendTo($("body")); } catch (e) { organizrCatchError(e, data); } }) .fail(function (xhr) { OrganizrApiError(xhr); }); $("#preloader").fadeOut(); } function buildSplashScreenItem(arrayItems) { var splashList = ""; if ( Array.isArray(arrayItems["data"]["tabs"]) && arrayItems["data"]["tabs"].length > 0 ) { arrayItems["data"]["tabs"].sort( (a, b) => parseFloat(a.order) - parseFloat(b.order) ); $.each(arrayItems["data"]["tabs"], function (i, v) { if (v.enabled === 1 && v.splash === 1 && v.access_url) { var image = iconPrefixSplash(v.image); if (image.indexOf(".") !== -1) { var dataSrc = 'data-src="' + iconPrefixSplash(v.image) + '"'; var nonImage = ""; } else { var dataSrc = ""; var nonImage = '' + image + ""; } splashList += ` `; } }); } return splashList !== "" ? splashList : false; } function buildSplashScreen(json) { let hiddenSplash = directToHash ? "hidden" : "in"; var items = buildSplashScreenItem(json); var menu = '
  • Splash Page
  • '; if (items) { closeSideMenu(); organizrConsole("Organizr Function", "Adding Splash Screen"); var splash = `
    ` + items + `
      Close Splash
    `; $(splash).appendTo($("body")); $(".append-menu").after(menu); } } function buildUserGroupSelect(array, userID, groupID) { var groupSelect = ""; var selected = ""; var disabled = ""; if (groupID == 0 && userID == 1) { disabled = "disabled"; } $.each(array, function (i, v) { selected = ""; if (v.group_id == groupID) { selected = "selected"; } var selectDisable = v.group_id == 0 || v.group_id == 999 ? "disabled" : ""; groupSelect += ""; }); return ( '" ); } function buildTabGroupSelect(array, tabID, groupID, type) { var groupSelect = ""; var selected = ""; let name = type == "tabGroupSelectMax" ? "group_id_max" : "group_id"; $.each(array, function (i, v) { selected = ""; if (v.group_id == groupID) { selected = "selected"; } groupSelect += ""; }); return ( '" ); } function buildTabTypeSelect(tabID, typeID, disabled) { var array = [ { type_id: 0, type: "Organizr", }, { type_id: 1, type: "iFrame", }, { type_id: 2, type: "New Window", }, ]; var typeSelect = ""; var selected = ""; disabled = disabled == "disabled" && typeID !== 0 ? null : disabled; $.each(array, function (i, v) { selected = ""; if (v.type_id == typeID) { selected = "selected"; } var disabledAttr = disabled === "disabled" && v.type !== "Internal" ? "disabled" : ""; typeSelect += ""; }); return ( '" ); } function buildTabCategorySelect(array, tabID, categoryID) { var categorySelect = ""; var selected = ""; $.each(array, function (i, v) { selected = ""; if (v.category_id == categoryID) { selected = "selected"; } categorySelect += ""; }); return ( '" ); } function buildUserManagementItem(array) { var userList = ""; $.each(array.users, function (i, v) { var disabledDelete = v.group_id == 999 || v.group_id == 0 ? "disabled" : "deleteUser"; userList += `
    user-img
      ` + v.id + `
    ` + v.username + `
    ` + v.email + ` ` + moment(v.register_date).format("ll") + `
    ` + moment(v.register_date).format("LT") + ` ` + buildUserGroupSelect(array.groups, v.id, v.group_id) + ` `; }); return userList; } function buildGroupManagementItem(array) { var userList = ""; $.each(array.groups, function (i, v) { var userCount = array.users.reduce(function (n, group) { return n + (group.group_id == v.group_id); }, 0); var disabledDefault = v.group_id == 0 || v.group_id == 999 ? "disabled" : ""; var disabledDelete = userCount > 0 || v.default == 1 || v.group_id == 999 || v.group_id <= 1 ? "disabled" : ""; var defaultIcon = v.default == 1 ? "icon-user-following" : "icon-user-follow"; var defaultColor = v.default == 1 ? "btn-info disabled" : "btn-warning"; userList += `
    ` + iconPrefix(v.image) + `
      ` + v.group_id + `
    ` + v.group + ` ` + userCount + ` `; }); return userList; } function buildCategoryEditorItem(array) { var categoryList = ""; $.each(array.categories, function (i, v) { var tabCount = array.tabs.reduce(function (n, category) { return n + (category.category_id == v.category_id); }, 0); var disabledDefault = v.default == 1 ? "disabled" : ""; var disabledDelete = tabCount > 0 || v.default == 1 || v.category_id == 0 ? "disabled" : ""; var defaultIcon = v.default == 1 ? "icon-user-following" : "icon-user-follow"; var defaultColor = v.default == 1 ? "btn-info disabled" : "btn-warning"; categoryList += `
    ` + iconPrefix(v.image) + `
    ` + v.category + ` ` + tabCount + ` `; }); return categoryList; } function buildTabEditorItem(array) { var tabList = ""; $.each(array.tabs, function (i, v) { let deleteDisabled = "deleteTab"; let buttonDisabled = ""; let typeDisabled = ""; if (v.url !== null) { deleteDisabled = v.url.indexOf("/page/settings") > 0 ? "disabled" : "deleteTab"; buttonDisabled = v.url.indexOf("/page/settings") > 0 ? "disabled" : ""; typeDisabled = v.url.indexOf("/v2/page/") > 0 ? "disabled" : ""; } tabList += `
    ` + iconPrefix(v.image) + `
    ` + v.name + ` ` + buildTabCategorySelect(array.categories, v.id, v.category_id) + ` ` + buildTabGroupSelect(array.groups, v.id, v.group_id, "tabGroupSelectMin") + ` ` + buildTabGroupSelect( array.groups, v.id, v.group_id_max, "tabGroupSelectMax" ) + ` ` + buildTabTypeSelect(v.id, v.type, typeDisabled) + `
    `; }); return tabList; } function editTabForm(id) { organizrAPI2("GET", "api/v2/tabs/" + id, true) .success(function (data) { try { let response = data.response; $(".tabIconImageList").val(null).trigger("change"); $(".tabIconIconList").val(null).trigger("change"); $("#edit-tab-form [name=name]").val(response.data.name); $("#originalTabName").html(response.data.name); $("#edit-tab-form [name=url]").val(response.data.url); $("#edit-tab-form [name=url_local]").val(response.data.url_local); $("#edit-tab-form [name=ping_url]").val(response.data.ping_url); $("#edit-tab-form [name=image]").val(response.data.image); $("#edit-tab-form [name=id]").val(response.data.id); $("#edit-tab-form [name=timeout_ms]").val( convertMsToMinutes(response.data.timeout_ms) ); $("#edit-tab-form [name=timeout]").val(response.data.timeout); if (response.data.url.indexOf("/?v") > 0) { $("#edit-tab-form [name=url]").prop("disabled", "true"); } else { $("#edit-tab-form [name=url]").prop("disabled", null); } } catch (e) { organizrCatchError(e, data); } }) .fail(function (xhr) { OrganizrApiError(xhr, "Tab Error"); }); } function getSubmitSettingsFormValueSingle(form, index, value) { var values = {}; if (value !== "#987654" && index.includes("disable-pwd-mgr") == false) { var input = $("#" + form + " [name='" + index + "']"); var dataType = input.attr("data-type"); switch (dataType) { case "switch": case "checkbox": var value = input.prop("checked") ? true : false; break; case "select2": var value = input.val() !== null ? input.val().toString() : ""; break; default: var value = input.val(); } values = { name: index, value: value, type: dataType }; return values; } return false; } function getSubmitSettingsFormValueObject(form, index, value) { var values = []; $.each(value, function (i, v) { var objectList = []; var object = []; $.each(v, function (key, val) { if (val !== "#987654" && key.includes("disable-pwd-mgr") == false) { var input = $( "#" + form + " [name='" + index + "[" + i + "]." + key + "']" ); var dataType = input.attr("data-type"); var dataLabel = input.attr("data-label"); switch (dataType) { case "switch": case "checkbox": var value = input.prop("checked") ? true : false; break; case "select2": var value = input.val() !== null ? input.val().toString() : ""; break; default: var value = input.val(); } var newKey = index + "[" + i + "]." + key; object.push({ type: dataType, name: newKey, label: dataLabel, value: value, }); } }); values.push(object); }); values = { name: index, value: values, type: "array" }; return values; } function submitSettingsForm(form, homepageItem = false) { var list = $("#" + form).serializeToJSON(); var size = 0; var submit = {}; $.each(list, function (i, v) { var values = false; if (Object.prototype.toString.call(v) === "[object Object]") { values = getSubmitSettingsFormValueObject(form, i, v); } else { values = getSubmitSettingsFormValueSingle(form, i, v); } size++; if (values) { submit[i] = values.value; } }); var callbacks = $.Callbacks(); // Custom Callbacks switch (form) { case "customize-appearance-form": break; default: } if (size > 0) { organizrAPI2("PUT", "api/v2/config", submit, true) .success(function (data) { try { var response = data.response; } catch (e) { organizrCatchError(e, data); } if (callbacks) { callbacks.fire(); } if (homepageItem && !activeInfo.settings.misc.disableHomepageModals) { let html = `
    ${response.message}

    Close Homepage Settings?

    Auto Closing in 5 seconds...

    `; swal({ content: createElementFromHTML(html), buttons: false, className: "bg-org", timer: 5000, }); textTimer( 5, ".close-homepage-timer", "Seconds remaining: ", "Closing..." ); } else { message( "Updated Items", response.message, activeInfo.settings.notifications.position, "#FFF", "success", "5000" ); } }) .fail(function (xhr) { OrganizrApiError(xhr, "Update Error"); }); $("#" + form + " :input").each(function () { var input = $(this); input .closest(".form-group") .removeClass("has-success") .removeClass("has-error"); }); $("#" + form + "-save").addClass("hidden"); } else { $("#" + form + " :input").each(function () { var input = $(this); input .closest(".form-group") .removeClass("has-success") .addClass("has-error"); }); } } function textTimer(seconds, el, preText, postText) { var seconds_left = seconds; var interval = setInterval(function () { $(el).html(preText + " " + --seconds_left); if (seconds_left <= 0) { $(el).html(postText); clearInterval(interval); } }, 1000); } function submitHomepageOrder() { var list = $("#homepage-values").serializeToJSON(); var size = 0; var submit = {}; $.each(list, function (i, v) { if (v !== "") { size++; submit[i] = v; } }); var callbacks = $.Callbacks(); if (size > 0) { organizrAPI2("PUT", "api/v2/config", submit, true) .success(function (data) { try { var response = data.response; $("#submitHomepageOrder-save").addClass("hidden"); } catch (e) { organizrCatchError(e, data); } message( "Updated Homepage Order", response.message, activeInfo.settings.notifications.position, "#FFF", "success", "5000" ); if (callbacks) { callbacks.fire(); } }) .fail(function (xhr) { OrganizrApiError(xhr, "Update Error"); }); } else { console.log("add error"); } } function submitTabOrder(newTabs) { var data = []; var process = false; $.each(newTabs.tab, function (i, v) { if (v.originalOrder == v.order) { delete newTabs.tab[i]; } else { let temp = { order: v.order, id: v.id, }; data.push(temp); process = true; } }); if (!process) { message( "Tab Order Warning", "Order was not changed - Submission not needed", activeInfo.settings.notifications.position, "#FFF", "warning", "5000" ); $(".saveTabOrderButton").addClass("hidden"); return false; } var callbacks = $.Callbacks(); callbacks.add(buildTabEditor); organizrAPI2("PUT", "api/v2/tabs", data, true) .success(function (data) { try { var response = data.response; } catch (e) { organizrCatchError(e, data); } message( "Tab Order Updated", response.message, activeInfo.settings.notifications.position, "#FFF", "success", "5000" ); if (callbacks) { callbacks.fire(); } $(".saveTabOrderButton").addClass("hidden"); }) .fail(function (xhr) { OrganizrApiError(xhr, "Update Error"); }); } function submitCategoryOrder() { var data = []; var categories = $("#submit-categories-form").serializeToJSON(); var callbacks = $.Callbacks(); callbacks.add(buildCategoryEditor); $.each(categories.category, function (i, v) { if (v.originalOrder == v.order) { delete categories.category[i]; } else { let temp = { order: v.order, id: v.id, }; data.push(temp); } }); organizrAPI2("PUT", "api/v2/categories", data, true) .success(function (data) { try { var response = data.response; } catch (e) { organizrCatchError(e, data); } message( "Category Order Updated", response.message, activeInfo.settings.notifications.position, "#FFF", "success", "5000" ); if (callbacks) { callbacks.fire(); } $(".saveTabOrderButton").addClass("hidden"); }) .fail(function (xhr) { OrganizrApiError(xhr, "Update Error"); }); } function buildTR(array, type, badge) { var listing = ""; var arrayItems = array.split("|"); if (hasValue(arrayItems) === true) { $.each(arrayItems, function (i, v) { listing += ` ` + type + ` ` + updateIssueLink(v) + ` `; }); return listing; } return " "; } function buildVersion(array) { var x = 0; var versions = '
    '; var listing = ""; var currentV = currentVersion; var installed = ""; var spanClass = ""; var button = ""; $.each(array, function (i, v) { listing += buildTR(v.new, "NEW", "info"); listing += buildTR(v.fixed, "FIXED", "success"); listing += buildTR(v.notes, "NOTE", "warning"); if (currentV === i) { button = ''; } else if (x === 0) { button = ''; } let tableClass = x == 0 ? "" : "hidden"; let divClassPadding = x == 0 ? "" : "p-b-0"; let divClassMargin = x == 0 ? "" : "m-b-0"; let toggleButtonText = x == 0 ? "Less" : "More"; let toggleButtonIcon = x == 0 ? "up" : "down"; let divStatus = x == 0 ? "opened" : "closed"; versions += `
    ` + button + `

    ` + i + `

    ` + moment.utc(v.date, "YYYY-MM-DD hh:mm[Z]").local().fromNow() + `

    ` + v.title + `

    ` + listing + `
    `; listing = ""; button = ""; x++; }); return versions; } function toggleGithubVersion(id) { let status = $(".update-main-div-" + id).attr("data-status"); if (status == "opened") { $(".update-main-div-" + id).attr("data-status", "closed"); $(".update-main-div-" + id).addClass("p-b-0"); $(".update-box-title-" + id).addClass("m-b-0"); $(".update-table-" + id).addClass("hidden"); $(".toggleButton-" + id).text("More"); $(".toggleButtonIcon-" + id) .removeClass("fa-long-arrow-up") .addClass("fa-long-arrow-down"); } else { $(".update-main-div-" + id).attr("data-status", "opened"); $(".update-main-div-" + id).removeClass("p-b-0"); $(".update-box-title-" + id).removeClass("m-b-0"); $(".update-table-" + id).removeClass("hidden"); $(".toggleButton-" + id).text("Less"); $(".toggleButtonIcon-" + id) .addClass("fa-long-arrow-up") .removeClass("fa-long-arrow-down"); } } function manualUpdateCheck() { $(".buttonManualUpdateCheck").addClass("disabled"); $(".buttonManualUpdateCheck i") .removeClass("fa-globe") .addClass("fa-refresh fa-spin"); setTimeout(function () { updateCheck(); checkCommitLoad(); }, 1000); setTimeout(function () { $(".buttonManualUpdateCheck").removeClass("disabled"); $(".buttonManualUpdateCheck i") .removeClass("fa-refresh fa-spin fa-globe") .addClass("fa-check"); }, 1500); return true; } function updateCheck() { githubVersions() .success(function (data) { try { var response = JSON.parse(data); } catch (e) { organizrCatchError(e, data); } for (var a in reverseObject(response)) { var latest = a; break; } if (latest !== currentVersion) { organizrConsole( "Update Function", "Update to " + latest + " is available", "warning" ); if (activeInfo.settings.misc.docker === false) { let tabInfo = findTab("api/v2/page/settings", "access_url"); if (tabInfo) { messageSingle( window.lang.translate("Update Available"), latest + " " + window.lang.translate("is available, goto") + ' Update Tab", activeInfo.settings.notifications.position, "#FFF", "update", "60000" ); } } } else { organizrConsole( "Update Function", "Already running latest version: " + latest, "info" ); } $("#githubVersions").html(buildVersion(reverseObject(response))); }) .fail(function (xhr) { OrganizrApiError(xhr); }); } function ignoreNewsId(id) { organizrAPI2("POST", "api/v2/news/" + id, {}) .success(function (data) { try { let response = data.response; message( "News Item", "Item now ignored", activeInfo.settings.notifications.position, "#FFF", "success", "5000" ); $(".newsItem-" + id).remove(); $(".newsHeart-" + id).remove(); } catch (e) { organizrCatchError(e, data); } }) .fail(function (xhr) { OrganizrApiError(xhr, "News"); }); } function newsLoad() { newsJSON() .success(function (data) { try { var response = JSON.parse(data); var items = []; var limit = 5; var count = 0; organizrAPI2("get", "api/v2/news") .success(function (data) { try { let ignoredIds = data.response.data; ignoredIds = ignoredIds == null ? [] : ignoredIds; $.each(response, function (i, v) { count++; let ignore = ignoredIds.includes(v.id); let alertDefined = typeof v.important !== "undefined" && v.important !== false; let alert = alertDefined && ignore == false ? `    Important Message - Click me to Ignore` : ""; let heartBeat = alertDefined && ignore == false ? `
    ` : ""; let newBody = `
     ` + moment(v.date).format("LLL") + alert + `
    ` + v.author + `
    ` + (v.subTitle ? "
    " + v.subTitle + "
    " : "") + `

    ` + v.body + `

    `; if (count <= limit) { items[i] = { title: v.title + heartBeat, body: newBody, }; } }); var body = buildAccordion(items, true); $("#organizrNewsPanel").html(body); } catch (e) { organizrCatchError(e, data); } }) .fail(function (xhr) { OrganizrApiError(xhr, "News"); }); } catch (e) { organizrCatchError(e, data); } }) .fail(function (xhr) { OrganizrApiError(xhr); }); } function checkPluginUpdates() { if (!activeInfo.user.loggedin || activeInfo.user.groupID > 1) { return false; } organizrAPI2("get", "api/v2/plugins/marketplace") .success(function (data) { try { let update = false; let pluginsNeedingUpdate = []; let plugins = data.response.data; $.each(plugins, function (i, v) { if (v.needs_update) { update = true; pluginsNeedingUpdate.push(i); } }); if (update) { pluginsNeedingUpdate = "[" + pluginsNeedingUpdate.join(", ") + "]"; messageSingle( window.lang.translate("Update Available"), 'The following plugin(s) need updates: ' + pluginsNeedingUpdate, activeInfo.settings.notifications.position, "#FFF", "update", "600000" ); } } catch (e) { organizrCatchError(e, data); } }) .fail(function (xhr) { OrganizrApiError(xhr, "Marketplace"); }); } function checkCommitLoad() { if ( activeInfo.settings.misc.docker && activeInfo.settings.misc.githubCommit !== "n/a" && activeInfo.settings.misc.githubCommit !== null ) { if (checkCommitLoadStatus == false) { checkCommitLoadStatus = true; getLatestCommitJSON() .success(function (data) { try { var latest = data.sha.toString().trim(); var current = activeInfo.settings.misc.githubCommit .toString() .trim(); var link = "https://github.com/causefx/Organizr/compare/" + current + "..." + latest; if (latest !== current) { messageSingle( window.lang.translate("Update Available"), ' Compare Difference or Update Now', activeInfo.settings.notifications.position, "#FFF", "update", "600000" ); } else { organizrConsole( "Update Function", "Organizr Docker - Up to date" ); } } catch (e) { organizrCatchError(e, data); } checkCommitLoadStatus = false; }) .fail(function (xhr) { console.error("Organizr Function: Github Connection Failed"); checkCommitLoadStatus = false; }); } } } function sponsorLoad() { sponsorsJSON() .success(function (data) { try { var response = JSON.parse(data); } catch (e) { organizrCatchError(e, data); } $("#sponsorList").html(buildSponsor(response)); $("#sponsorListModals").html(buildSponsorModal(response)); $(".sponsor-items").owlCarousel({ nav: false, autoplay: true, dots: false, margin: 10, autoWidth: true, items: 4, }); }) .fail(function (xhr) { OrganizrApiError(xhr); }); } function backersLoad() { organizrAPI2("GET", "api/v2/sponsors/all") .success(function (data) { try { let json = data.response; $("#backersList").html(buildBackers(json.data)); $(".backers-items").owlCarousel({ nav: false, autoplay: true, dots: false, margin: 10, autoWidth: true, items: 4, }); } catch (e) { organizrCatchError(e, data); } }) .fail(function (xhr) { OrganizrApiError(xhr); }); } function buildBackers(array) { let backers = ""; $.each(array, function (i, v) { if (v.type == "USER" && v.role == "BACKER" && v.isActive) { v.name = v.name ? v.name : "User"; v.image = v.image ? v.image : "plugins/images/default_user.png"; backers += `
    ${v.name}
    `; } }); backers += `
    You
    `; return backers; } function sponsorDetails(id) { sponsorsJSON() .success(function (data) { try { let response = JSON.parse(data); let coupon = response[id].coupon == null ? false : true; let couponAbout = response[id].coupon_about == null ? false : true; let extraInfo = coupon && couponAbout ? `

    Coupon Code:

    ${response[id].coupon} ${response[id].coupon_about}

    ` : ""; if (typeof response[id].logo_dark !== "undefined") { if (activeInfo.style == "dark") { response[id].logo = response[id].logo_dark; } } let html = `
    ${response[id].company_name}
    img

    ${response[id].company_name}

    Website

    ${response[id].about} ${extraInfo}
    `; swal({ content: createElementFromHTML(html), buttons: false, className: "bg-org", }); } catch (e) { organizrCatchError(e, data); } }) .fail(function (xhr) { OrganizrApiError(xhr); }); } function sponsorAbout(id, array) { var coupon = array.coupon != null; var couponAbout = array.coupon_about != null; var extraInfo = coupon && couponAbout ? `

    Coupon Code:

    ` + array.coupon + ` ` + array.coupon_about + `

    ` : ""; if (typeof array.logo_dark !== "undefined") { if (activeInfo.style == "dark") { array.logo = array.logo_dark; } } return ( ` ` ); } function buildSponsor(array) { var sponsors = ""; $.each(array, function (i, v) { var hasCoupon = ""; if (v.about) { if (v.coupon) { hasCoupon = ` Has Coupon `; } } var sponsorAboutModal = v.about ? "onclick=\"sponsorDetails('" + i + "');sponsorAnalytics('" + v.company_name + "');\"" : "onclick=\"window.open('" + v.website + "', '_blank');sponsorAnalytics('" + v.company_name + "');\""; if (typeof v.logo_dark !== "undefined") { if (activeInfo.style == "dark") { v.logo = v.logo_dark; } } sponsors += `
    ${v.company_name} ${hasCoupon}
    `; }); sponsors += `
    Patreon Sponsor
    OpenCollective Sponsor
    `; return sponsors; } function buildSponsorModal(array) { var sponsors = ""; $.each(array, function (i, v) { var sponsorAboutModal = v.about ? sponsorAbout(i, v) : ""; sponsors += sponsorAboutModal; }); return sponsors; } function sponsorAnalytics(sponsor_name) { var uuid = activeInfo.settings.misc.uuid; $.ajax({ type: "POST", url: "https://api.organizr.app/", data: { sponsor_name: sponsor_name, user_uuid: uuid, cmd: "sponsor", }, cache: false, async: true, complete: function (xhr, status) { if (xhr.status === 200) { let result = $.parseJSON(xhr.responseText); } }, }); } function themeAnalytics(theme_name) { var uuid = activeInfo.settings.misc.uuid; $.ajax({ type: "POST", url: "https://api.organizr.app/", data: { theme_name: theme_name, user_uuid: uuid, cmd: "theme", }, cache: false, async: true, complete: function (xhr, status) { if (xhr.status === 200) { let result = $.parseJSON(xhr.responseText); } }, }); } function getOrganizrBackups() { organizrAPI2("GET", "api/v2/backup") .success(function (data) { try { let json = data.response; $("#backup-file-list").html(buildOrganizrBackups(json.data)); } catch (e) { organizrCatchError(e, data); } }) .fail(function (xhr) { OrganizrApiError(xhr); }); } function createOrganizrBackup() { $("#settings-settings-backup").block({ message: '

    Backing up...

    ', css: { color: "#fff", border: "1px solid #5761a9", backgroundColor: "#707cd2", }, }); organizrAPI2("POST", "api/v2/backup", {}) .success(function (data) { try { let response = data.response; if (response) { getOrganizrBackups(); } } catch (e) { organizrCatchError(e, data); } $("#settings-settings-backup").unblock(); }) .fail(function (xhr) { $("#settings-settings-backup").unblock(); OrganizrApiError(xhr, "Backup Error"); }); } function buildOrganizrBackups(array) { let list = ""; if (array.total_files > 0) { $.each(array.files, function (i, v) { i++; let pattern = /\[[^\]]*\]/gm; let version = typeof v.name.match(pattern)[1] !== "undefined" ? v.name.match(pattern)[1] : "N/A"; list += ` ${i} ${v.name} ${version} ${v.size} ${moment .utc(v.date, "YYYY-MM-DD hh:mm[Z]") .local() .fromNow()} | `; }); } else { list = 'No Backups made yet'; } $("#backup-total-files").html(array.total_files); $("#backup-total-size").html(array.total_size); return list; } function updateBar() { return `

    0%
    If error occurs - Use Esc key to close modal
    `; } function showUpdateBar() { swal({ content: createElementFromHTML(updateBar()), buttons: false, className: "bg-org", closeOnClickOutside: false, }); } function updateUpdateBar(title, percent, update = false) { $("#update-title").text(title); $("#update-bar").text(percent); $("#update-bar").css("width", percent); if (update) { $("#update-time").removeClass("hidden"); countdown(10); } } function countdown(remaining) { if (remaining === 0) { local("set", "message", "Organizr Update|Update Successful|update"); location.reload(true); } $("#update-seconds").text(remaining); setTimeout(function () { countdown(remaining - 1); }, 1000); } function dockerUpdate() { if (activeInfo.settings.misc.docker) { showUpdateBar(); updateUpdateBar("Starting Download", "20%"); messageSingle( window.lang.translate("[DO NOT CLOSE WINDOW]"), window.lang.translate("Starting Update Process"), activeInfo.settings.notifications.position, "#FFF", "success", "60000" ); organizrAPI2("GET", "api/v2/update/docker") .success(function (data) { updateUpdateBar("Restarting Organizr in", "100%", true); messageSingle( window.lang.translate("[DO NOT CLOSE WINDOW]"), "Update complete", activeInfo.settings.notifications.position, "#FFF", "success", "60000" ); }) .fail(function (xhr) { OrganizrApiError(xhr, "Update Error"); }); } } function windowsUpdate() { if (activeInfo.serverOS == "win") { showUpdateBar(); updateUpdateBar("Starting Download", "20%"); messageSingle( window.lang.translate("[DO NOT CLOSE WINDOW]"), window.lang.translate("Starting Update Process"), activeInfo.settings.notifications.position, "#FFF", "success", "60000" ); organizrAPI2("GET", "api/v2/update/windows") .success(function (data) { updateUpdateBar("Restarting Organizr in", "100%", true); messageSingle( window.lang.translate("[DO NOT CLOSE WINDOW]"), "Update complete", activeInfo.settings.notifications.position, "#FFF", "success", "60000" ); }) .fail(function (xhr) { OrganizrApiError(xhr, "Update Error"); }); } } function linuxUpdate() { if (activeInfo.serverOS !== "win" && !activeInfo.settings.misc.docker) { showUpdateBar(); updateUpdateBar("Starting Download", "20%"); messageSingle( window.lang.translate("[DO NOT CLOSE WINDOW]"), window.lang.translate("Starting Update Process"), activeInfo.settings.notifications.position, "#FFF", "success", "60000" ); organizrAPI2("GET", "api/v2/update/linux") .success(function (data) { updateUpdateBar("Restarting Organizr in", "100%", true); messageSingle( window.lang.translate("[DO NOT CLOSE WINDOW]"), "Update complete", activeInfo.settings.notifications.position, "#FFF", "success", "60000" ); }) .fail(function (xhr) { OrganizrApiError(xhr, "Update Error"); }); } } function updateNow() { clearAJAX(); if (activeInfo.settings.misc.docker) { dockerUpdate(); return false; } if (activeInfo.serverOS === "win") { windowsUpdate(); return false; } if (activeInfo.serverOS !== "win" && !activeInfo.settings.misc.docker) { linuxUpdate(); return false; } organizrConsole("Update Function", "Starting Update Process"); showUpdateBar(); updateUpdateBar("Starting Download", "5%"); messageSingle( window.lang.translate("[DO NOT CLOSE WINDOW]"), window.lang.translate("Starting Update Process"), activeInfo.settings.notifications.position, "#FFF", "success", "60000" ); organizrAPI2("GET", "api/v2/update/download/" + activeInfo.branch) .success(function (data) { updateUpdateBar("Starting Unzip", "50%"); messageSingle( window.lang.translate("[DO NOT CLOSE WINDOW]"), window.lang.translate("Update File Downloaded"), activeInfo.settings.notifications.position, "#FFF", "success", "60000" ); organizrAPI2("GET", "api/v2/update/unzip/" + activeInfo.branch) .success(function (data) { updateUpdateBar("Starting Copy", "70%"); messageSingle( window.lang.translate("[DO NOT CLOSE WINDOW]"), window.lang.translate("Update File Unzipped"), activeInfo.settings.notifications.position, "#FFF", "success", "60000" ); organizrAPI2("GET", "api/v2/update/move/" + activeInfo.branch) .success(function (data) { updateUpdateBar("Starting Cleanup", "90%"); messageSingle( window.lang.translate("[DO NOT CLOSE WINDOW]"), window.lang.translate("Update Files Copied"), activeInfo.settings.notifications.position, "#FFF", "success", "60000" ); organizrAPI2("GET", "api/v2/update/cleanup/" + activeInfo.branch) .success(function (data) { updateUpdateBar("Restarting Organizr in", "100%", true); messageSingle( window.lang.translate("[DO NOT CLOSE WINDOW]"), window.lang.translate("Update Cleanup Finished"), activeInfo.settings.notifications.position, "#FFF", "success", "60000" ); }) .fail(function (xhr) { OrganizrApiError(xhr, "Update Error"); }); }) .fail(function (xhr) { OrganizrApiError(xhr, "Update Error"); }); }) .fail(function (xhr) { OrganizrApiError(xhr, "Update Error"); }); }) .fail(function (xhr) { OrganizrApiError(xhr, "Update Error"); }); } function settingsAPI2(post, callbacks = null, asyncValue = true) { organizrAPI2("POST", post.api, post.data, asyncValue) .success(function (data) { try { var response = JSON.parse(data); } catch (e) { organizrCatchError(e, data); } message( post.messageTitle, post.messageBody, activeInfo.settings.notifications.position, "#FFF", "success", "5000" ); if (callbacks) { callbacks.fire(); } }) .fail(function (xhr) { console.error(post.error); }); } $.xhrPool.abortAll = function (url) { $(this).each(function (i, jqXHR) { // cycle through list of recorded connection if (!url || url === jqXHR.requestURL) { organizrConsole("Organizr API Abort", jqXHR.requestURL, "info"); jqXHR.abort(); // aborts connection $.xhrPool.splice(i, 1); // removes from list by index } }); }; $.ajaxPrefilter(function (options, originalOptions, jqXHR) { //organizrConsole('Organizr API Function',options.url,'info'); jqXHR.requestURL = options.url; }); function organizrAPI2(type, path, data = null, asyncValue = true) { $.xhrPool.abortAll(path); var timeout = 10000; switch (path) { case "api/v2/update/windows": case "api/v2/update/docker": case "api/v2/login": timeout = 240000; break; default: timeout = 60000; } switch (type) { case "get": case "GET": case "g": return $.ajax({ url: path, method: "GET", beforeSend: function (request) { request.setRequestHeader("Token", activeInfo.token); request.setRequestHeader("formKey", local("g", "formKey")); $.xhrPool.push(request); }, complete: function (jqXHR) { var i = $.xhrPool.indexOf(jqXHR); // get index for current connection completed if (i > -1) $.xhrPool.splice(i, 1); // removes from list by index }, timeout: timeout, }); case "delete": case "DELETE": case "d": return $.ajax({ url: path, method: "DELETE", beforeSend: function (request) { request.setRequestHeader("Token", activeInfo.token); request.setRequestHeader("formKey", local("g", "formKey")); $.xhrPool.push(request); }, complete: function (jqXHR) { var i = $.xhrPool.indexOf(jqXHR); // get index for current connection completed if (i > -1) $.xhrPool.splice(i, 1); // removes from list by index }, timeout: timeout, }); case "post": case "POST": case "p": data.formKey = local("g", "formKey"); return $.ajax({ url: path, method: "POST", async: asyncValue, beforeSend: function (request) { request.setRequestHeader("Token", activeInfo.token); request.setRequestHeader("formKey", local("g", "formKey")); $.xhrPool.push(request); }, complete: function (jqXHR) { var i = $.xhrPool.indexOf(jqXHR); // get index for current connection completed if (i > -1) $.xhrPool.splice(i, 1); // removes from list by index }, data: data, }); case "put": case "PUT": data.formKey = local("g", "formKey"); return $.ajax({ url: path, method: "PUT", async: asyncValue, beforeSend: function (request) { request.setRequestHeader("Token", activeInfo.token); request.setRequestHeader("formKey", local("g", "formKey")); $.xhrPool.push(request); }, complete: function (jqXHR) { var i = $.xhrPool.indexOf(jqXHR); // get index for current connection completed if (i > -1) $.xhrPool.splice(i, 1); // removes from list by index }, data: JSON.stringify(data), contentType: "application/json", }); default: console.warn("Organizr API: Method Not Supported"); } } function loadSettingsPage2(api, element, organizrFn) { $(element).html( '


    Loading

    ' ); organizrAPI2("get", api) .success(function (data) { try { var response = data.response; } catch (e) { organizrCatchError(e, data); } organizrConsole("Organizr Function", "Loading " + organizrFn); $(element).html(response.data); }) .fail(function (xhr) { OrganizrApiError(xhr); }); } function loadInternal(id, split = null) { let extra = split ? "right-" : ""; let tabInfo = findTab(id); if (!tabInfo) { organizrConsole("Load Internal", "No Tab Info Found... Id: " + id, "error"); return false; } let url = tabInfo.access_url; organizrAPI2("get", url) .success(function (data) { try { var html = data.response; $("#internal-" + extra + id).html(html.data); } catch (e) { organizrCatchError(e, data); } }) .fail(function (xhr) { OrganizrApiError(xhr); }); } function loadInternalOriginal(url, tabName) { organizrAPI("get", url) .success(function (data) { try { var html = JSON.parse(data); } catch (e) { organizrCatchError(e, data); } $("#internal-" + tabName).html(html.data); }) .fail(function (xhr) { OrganizrApiError(xhr); }); } function loadSettingsPage(api, element, organizrFn) { organizrAPI("get", api) .success(function (data) { try { var response = JSON.parse(data); } catch (e) { organizrCatchError(e, data); } organizrConsole("Organizr Function", "Loading " + organizrFn); $(element).html(response.data); }) .fail(function (xhr) { OrganizrApiError(xhr); }); } function settingsAPI(post, callbacks = null, asyncValue = true) { organizrAPI("POST", post.api, post, asyncValue) .success(function (data) { try { var response = JSON.parse(data); } catch (e) { organizrCatchError(e, data); } message( post.messageTitle, post.messageBody, activeInfo.settings.notifications.position, "#FFF", "success", "5000" ); if (callbacks) { callbacks.fire(); } }) .fail(function (xhr) { console.error(post.error); }); } function organizrAPI(type, path, data = null, asyncValue = true) { var timeout = 10000; switch (path) { case "api/?v1/windows/update": case "api/?v1/docker/update": timeout = 120000; break; default: timeout = 60000; } switch (type) { case "get": case "GET": case "g": return $.ajax({ url: path, method: "GET", beforeSend: function (request) { request.setRequestHeader("Token", activeInfo.token); request.setRequestHeader("formKey", local("g", "formKey")); }, timeout: timeout, }); case "post": case "POST": case "p": data.formKey = local("g", "formKey"); return $.ajax({ url: path, method: "POST", async: asyncValue, beforeSend: function (request) { request.setRequestHeader("Token", activeInfo.token); request.setRequestHeader("formKey", local("g", "formKey")); }, data: { data: data, }, }); default: console.warn("Organizr API: Method Not Supported"); } } function githubVersions() { return $.ajax({ url: "https://raw.githubusercontent.com/causefx/Organizr/" + activeInfo.branch + "/js/version.json", }); } function sponsorsJSON() { return $.ajax({ url: "https://raw.githubusercontent.com/causefx/Organizr/v2-develop/js/sponsors.json", }); } function newsJSON() { return $.ajax({ url: "https://raw.githubusercontent.com/causefx/Organizr/v2-develop/js/news.json", }); } function getLatestCommitJSON() { return $.ajax({ url: "https://api.github.com/repos/causefx/Organizr/commits/" + activeInfo.branch, }); } function marketplaceJSON(type) { return $.ajax({ url: "https://raw.githubusercontent.com/causefx/Organizr/v2-" + type + "/" + type + ".json", }); } function allIcons() { return $.ajax({ url: "js/icons.json", }); } function organizrConnect(path) { return $.ajax({ url: path, }); } function changeSettingsMenu(path) { var menuItems = path.split("::"); var menu = ""; if (Array.isArray(menuItems)) { $.each(menuItems, function (i, v) { menu += '
  • ' + v + "
  • "; }); } $("#settingsBreadcrumb").html(menu); } function buildWizard() { organizrAPI2("GET", "api/v2/page/wizard") .success(function (data) { try { var json = data.response; } catch (e) { organizrCatchError(e, data); } organizrConsole("Organizr Function", "Starting Install Wizard"); $(json.data).appendTo($(".organizr-area")); $(".organizr-area").removeClass("hidden"); }) .fail(function (xhr) { OrganizrApiError(xhr, "Wiizard Error"); }); $("#preloader").fadeOut(); } function buildDependencyCheck(orgdata) { organizrAPI2("GET", "api/v2/page/dependencies") .success(function (data) { try { var json = data.response; } catch (e) { organizrCatchError(e, data); } organizrConsole("Organizr Function", "Starting Dependencies Check"); $(json.data).appendTo($(".organizr-area")); $(".organizr-area").removeClass("hidden"); $(buildBrowserInfo()).appendTo($("#browser-info")); $("#web-folder").html(buildWebFolder(orgdata)); $("#php-version-check").html(buildPHPCheck(orgdata)); $(buildDependencyInfo(orgdata)).appendTo($("#depenency-info")); }) .fail(function (xhr) { OrganizrApiError(xhr, "Dependency Error"); }); $("#preloader").fadeOut(); } function buildDependencyInfo(arrayItems) { let listing = ""; $.each(arrayItems.data.status.dependenciesActive, function (i, v) { listing += '
  • ' + v + "
  • "; }); $.each(arrayItems.data.status.dependenciesInactive, function (i, v) { listing += '
  • ' + v + "
  • "; }); let className = arrayItems.data.status.dependenciesInactive.length !== 0 ? "bg-danger text-warning" : "bg-primary"; let icon = arrayItems.data.status.dependenciesInactive.length !== 0 ? "fa fa-exclamation-triangle" : "fa fa-check-circle"; //dependency-dependencies-check-listing-header let header = arrayItems.data.status.dependenciesInactive.length !== 0 ? "panel-danger" : "panel-info"; let listingIcon = arrayItems.data.status.dependenciesInactive.length !== 0 ? "ti-alert" : "ti-check-box"; let listingText = arrayItems.data.status.dependenciesInactive.length !== 0 ? "Dependencies Missing" : "Dependencies OK"; $(".dependency-dependencies-check-listing-header") .removeClass("panel-danger") .addClass(header); $(".dependency-dependencies-check-listing i") .first() .removeClass("ti-alert") .addClass(listingIcon); $(".dependency-dependencies-check-listing span").text(listingText); $(".dependency-dependencies-check") .removeClass("bg-warning") .addClass(className); $(".dependency-dependencies-check i") .removeClass("fa fa-spin fa-spinner") .addClass(icon); return listing; } function buildWebFolder(arrayItems) { let writable = "Not Writable - Please fix permissions"; let className = "bg-danger text-warning"; let icon = "fa fa-exclamation-triangle"; if (arrayItems.data.status.writable == "yes") { writable = "Writable - All Good"; className = "bg-primary"; icon = "fa fa-check-circle"; } $(".dependency-permissions-check") .removeClass("bg-warning") .addClass(className); $(".dependency-permissions-check i") .removeClass("fa fa-spin fa-spinner") .addClass(icon); $("#web-folder").addClass(className); return writable; } function buildPHPCheck(arrayItems) { let phpTest = "Upgrade PHP Version to 7.2+"; let className = "bg-danger text-warning"; let icon = "fa fa-exclamation-triangle"; if (arrayItems.data.status.minVersion == "yes") { phpTest = "PHP Version Approved"; className = "bg-primary"; icon = "fa fa-check-circle"; } $(".dependency-phpversion-check") .removeClass("bg-warning") .addClass(className); $(".dependency-phpversion-check i") .removeClass("fa fa-spin fa-spinner") .addClass(icon); $("#php-version-check").addClass(className); $("#php-version-check-user").html( 'Webserver User: ' + arrayItems.data.status.php_user ); return phpTest; } function buildBrowserInfo() { var listing = ""; $.each(activeInfo, function (i, v) { listing += ` ` + i + ` ` + tof(v) + ` `; }); return ( ` ` + listing + `
    ` ); } function tof(string, type) { var result; if ( typeof string == "undefined" || string == "false" || string == false || string == null || string == 0 || string == "off" || string == "no" ) { result = "0"; } else if ( string == "true" || string == true || string == 1 || string == "on" || string == "yes" ) { result = "1"; } switch (type) { case "bool": case "b": return result == "0" ? false : result == "1" ? true : string; case "switch": case "s": return result == "0" ? "off" : result == "1" ? "on" : string; case "checkbox": case "c": return result == "0" ? "" : result == "1" ? "checked" : string; case "integer": case "number": case "i": case "n": return result == "0" ? 0 : result == "1" ? 1 : string; case "question": case "q": return result == "0" ? "yes" : result == "1" ? "no" : string; case "string": return string.toString(); default: return result == "0" ? "false" : result == "1" ? "true" : string; } } function createRandomString(length) { var str = ""; for (; str.length < length; str += Math.random().toString(36).substr(2)); return str.substr(0, length); } function generateAPI() { var string = createRandomString(20); $("#form-api").focus(); $("#form-api").val(string); $("#form-api").focusout(); $("#verify-api").text(string); $("#form-username").focus(); } function getCookie(cname) { var name = cname + "="; var decodedCookie = decodeURIComponent(document.cookie); var ca = decodedCookie.split(";"); for (var i = 0; i < ca.length; i++) { var c = ca[i]; while (c.charAt(0) == " ") { c = c.substring(1); } if (c.indexOf(name) == 0) { return c.substring(name.length, c.length); } } return ""; } function localStorageSupport() { return "localStorage" in window && window["localStorage"] !== null; } function local(type, key, value = null) { if (localStorageSupport) { switch (type) { case "set": case "s": localStorage.setItem(key, value); break; case "get": case "g": return localStorage.getItem(key); case "remove": case "r": localStorage.removeItem(key); break; default: console.warn("Organizr Function: localStorage action not defined"); } } } function language(language) { var language = language.split("-"); return language[0]; } function logIcon(type, label = false) { type = type.toLowerCase(); let info = { color: "info", icon: "fa fa-check" }; switch (type) { case "success": info.color = "info"; info.icon = "fa fa-check"; break; case "info": info.color = "info"; info.icon = "mdi mdi-information"; break; case "notice": info.color = "inverse"; info.icon = "mdi mdi-information-variant"; break; case "debug": info.color = "primary"; info.icon = "mdi mdi-code-tags-check"; break; case "warning": info.color = "warning"; info.icon = "mdi mdi-alert-box"; break; case "error": info.color = "danger"; info.icon = "mdi mdi-alert-outline"; break; case "critical": info.color = "danger"; info.icon = "mdi mdi-alert"; break; case "alert": info.color = "danger"; info.icon = "mdi mdi-alert-octagon"; break; case "emergency": info.color = "danger"; info.icon = "mdi mdi-alert-octagram"; break; default: info = { color: "info", icon: "fa fa-check" }; break; } if (label) { return ( '   ' + type + "" ); } else { return ( '" ); } } function toggleKillOrganizrLiveUpdate(interval = 5000) { if ($(".organizr-log-live-update").hasClass("kill-organizr-log")) { clearTimeout(timeouts["organizr-log"]); $(".organizr-log-live-update i").toggleClass( "fa-dot-circle-o animated loop-animation swing" ); $(".organizr-log-live-update").toggleClass("kill-organizr-log"); } else { $(".organizr-log-live-update").toggleClass("kill-organizr-log"); organizrLogLiveUpdate(interval); } } function organizrLogLiveUpdate(interval = 5000) { var timeout = interval; let timeoutTitle = "organizr-log"; $(".organizr-log-live-update i").toggleClass( "fa-dot-circle-o animated loop-animation swing" ); organizrLogTable.ajax.reload(null, false); setTimeout(function () { if ($(".organizr-log-live-update").hasClass("kill-organizr-log")) { $(".organizr-log-live-update i").toggleClass( "fa-dot-circle-o animated loop-animation swing" ); } }, interval - 500); if (typeof timeouts[timeoutTitle] !== "undefined") { clearTimeout(timeouts[timeoutTitle]); } timeouts[timeoutTitle] = setTimeout(function () { organizrLogLiveUpdate(timeout); }, timeout); delete timeout; } function radioLoop(element) { $('[type=radio][id!="' + element.id + '"]').each(function () { this.checked = false; }); } function loadAppearance(appearance) { var cssSettings = ""; document.title = appearance.title; if (appearance.useLogo === false) { $("#main-logo").html(appearance.title); $("#side-logo").html(appearance.title); } else { $("#main-logo").html( '' ); $("#side-logo").html( 'home' ); } if (appearance.headerColor !== "") { cssSettings += ` .navbar-header{ background: ` + appearance.headerColor + `; } `; } if (appearance.headerTextColor !== "") { cssSettings += ` .navbar-top-links > li > a { color: ` + appearance.headerTextColor + `; } `; } if (appearance.sidebarColor !== "") { cssSettings += ` .sidebar, .sidebar .sidebar-head{ background: ` + appearance.sidebarColor + `; } `; } if (appearance.sidebarTextColor !== "") { cssSettings += ` #side-menu li a, .sidebar .sidebar-head h3, #side-menu > li > a.active, #side-menu > li > ul > li > a.active { color: ` + appearance.sidebarTextColor + `; } `; } if (appearance.accentColor !== "") { cssSettings += ` .bg-info, .fc-toolbar, .progress-bar-info, .label-info, .tabs-style-iconbox nav ul li.tab-current a, .swapLog.active { background-color: ` + appearance.accentColor + ` !important; } .panel-blue .panel-heading, .panel-info .panel-heading { border-color: ` + appearance.accentColor + `; } .tabs-style-iconbox nav ul li.tab-current a::after { border-top-color: ` + appearance.accentColor + `; } .customvtab .tabs-vertical li.active a, .customvtab .tabs-vertical li.active a:focus, .customvtab .tabs-vertical li.active a:hover { border-right: 2px solid ` + appearance.accentColor + `; } .text-info, .btn-link, a { color: ` + appearance.accentColor + `; } `; } if (appearance.accentTextColor !== "") { cssSettings += ` .bg-info, .progress-bar, .panel-default .panel-heading, .mailbox-widget .customtab li.active a, .mailbox-widget .customtab li.active, .mailbox-widget .customtab li.active a:focus, .mailbox-widget .customtab li a, .tabs-style-iconbox nav ul li.tab-current a .swapLog.active { color: ` + appearance.accentTextColor + `; } `; } if (appearance.buttonColor !== "") { cssSettings += ` .btn-info, .btn-info.disabled, .btn, .paginate_button.current, .paginate_button:hover { background: ` + appearance.buttonColor + ` !important; border: 1px solid ` + appearance.buttonColor + ` !important; } `; } if (appearance.buttonTextColor !== "") { cssSettings += ` .btn-info, .btn-info.disabled, .btn .paginate_button.current .paginate_button:hover { color: ` + appearance.buttonTextColor + ` !important; } `; } if (appearance.loginWallpaper !== "" || appearance.randomMediaImage) { if (appearance.randomMediaImage) { appearance.loginWallpaper = appearance.randomMediaImage; } cssSettings += ` .login-register { background: url(` + randomCSV(appearance.loginWallpaper) + `) center center/cover no-repeat!important; height: 100%; position: fixed; } .lock-screen { background: url(` + randomCSV(appearance.loginWallpaper) + `) center center/cover no-repeat!important; height: 100%; position: fixed; z-index: 1001; top: 0; width: 100%; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; -o-user-select: none; user-select: none; } `; } if (activeInfo["settings"]["misc"]["autoExpandNavBar"] == false) { cssSettings += ` @media only screen and (min-width: 768px) { .sidebar:hover .hide-menu { display: none; } .sidebar:hover .sidebar-head, .sidebar:hover { width: 60px; } .sidebar:hover .nav-second-level li a { padding-left: 15px; } } `; } if (cssSettings !== "") { $("#user-appearance").html(cssSettings); } if (appearance.customThemeCss !== "") { $("#custom-theme-css").html(appearance.customThemeCss); } if (appearance.customCss !== "") { $("#custom-css").html(appearance.customCss); } } function resetCustomColors() { let colors = [ "headerColor", "headerTextColor", "sidebarColor", "sidebarTextColor", "accentColor", "accentTextColor", "buttonColor", "buttonTextColor", ]; $.each(colors, function (i, v) { $("#customize-appearance-form [name=" + v + "]") .val("") .trigger("change"); }); messageSingle( window.lang.translate("Colors Reverted"), window.lang.translate("Please Save"), activeInfo.settings.notifications.position, "#FFF", "success", "10000" ); } function randomCSV(values) { if (typeof values == "string") { if (values.includes(",")) { var csv = values.split(","); var luckyNumber = Math.floor(Math.random() * csv.length); return csv[luckyNumber]; } else { return values; } } return false; } function loadCustomJava(appearance) { if (appearance.customThemeJava !== "") { $("#custom-theme-javascript").html(appearance.customThemeJava); } if (appearance.customJava !== "") { $("#custom-javascript").html(appearance.customJava); } } function clearForm(form) { $(form + " input[type=text]").each(function () { $(this).val(""); }); $(form + " input[type=password]").each(function () { $(this).val(""); }); } function checkMessage() { var check = local("get", "message") ? local("get", "message") : false; if (check) { local("remove", "message"); var message = check.split("|"); messageSingle( window.lang.translate(message[0]), window.lang.translate(message[1]), activeInfo.settings.notifications.position, "#FFF", message[2], "10000" ); } } function setError(error) { local("set", "error", error); var url = window.location.href.split("?")[0]; url = url.split("#")[0]; window.location.href = url + "?error"; } function buildErrorPage(error) { var description = ""; var message = ""; var color = ""; switch (error) { case "401": description = "Unauthorized"; message = "Look, you dont belong here"; color = "danger"; break; case "404": description = "Not Found"; message = "I think I lost it..."; color = "primary"; break; default: description = "Something happened"; message = "But I dont know what"; color = "muted"; } return ( `

    ` + error + `

    ` + description + `

    ` + message + `

    OK
    ` ); } $.urlParam = function (name) { var results = new RegExp("[?&]" + name + "=([^&#]*)").exec( window.location.href ); if (results == null) { return null; } else { return decodeURI(results[1]) || 0; } }; function errorPage(error = null, uri = null) { if (error) { local("set", "error", error); } if (uri) { local("set", "uri", uri); } //var urlParams = new URLSearchParams(window.location.search); if ($.urlParam("error") !== null && !isNaN(Number($.urlParam("error")))) { local("set", "error", $.urlParam("error")); } if ($.urlParam("return") !== null && activeInfo.user.loggedin !== true) { local("set", "uri", $.urlParam("return")); } if (window.location !== window.parent.location) { var count = 0; for (var k in window.parent.location) { if (window.parent.location.hasOwnProperty(k)) { ++count; } } if (count == 0 || count == "undefined") { return false; } var iframeError = local("get", "error"); parent.errorPage(iframeError); local("remove", "uri"); $("html").html(""); return false; } if (local("get", "error")) { //show error page $(".error-page").html(buildErrorPage(local("get", "error"))); $(".error-page").fadeIn(); local("remove", "error"); window.history.pushState({}, document.title, "./"); } } function uriRedirect(uri = null) { if (uri) { local("set", "uri", uri); } if (activeInfo.user.loggedin === true && activeInfo.user.locked !== 1) { var redirect = local("get", "uri"); local("remove", "uri"); if (redirect !== null) { window.location.href = decodeURIComponent(decodeURI(redirect)); } } } function changeTheme(theme) { //$("#preloader").fadeIn(); $("#theme").attr({ href: theme + ".css?v=" + activeInfo.version, }); //$("#preloader").fadeOut(); console.info( "%c Theme %c ".concat(theme, " "), "color: white; background: #AD80FD; font-weight: 700;", "color: #AD80FD; background: white; font-weight: 700;" ); } function changeStyle(style) { //$("#preloader").fadeIn(); $("#style").attr({ href: "css/" + style + ".min.css?v=" + activeInfo.version, }); //$("#preloader").fadeOut(); console.info( "%c Style %c ".concat(style, " "), "color: white; background: #AD80FD; font-weight: 700;", "color: #AD80FD; background: white; font-weight: 700;" ); } function setSSO() { $.each(activeInfo.sso, function (i, v) { if (v !== false) { local("set", i, v); } else { local("r", i); } }); // other items to remove $.each(localStorage, function (i, v) { if (typeof v == "string") { if (i.startsWith("user-")) { if (typeof activeInfo.sso[i] == "undefined") { local("r", i); } } } }); } function buildStreamItem(array, source) { var cards = ""; var count = 0; var total = array.length; var sourceIcon = source === "jellyfin" ? "fish" : source; var streamDetails = { direct: 0, transcode: 0, }; var bandwidthDetails = { wan: 0, lan: 0, }; cards += '
    '; $.each(array, function (i, v) { var icon = ""; var width = 100; var bg = ""; count++; v.nowPlayingImageURL = v.useImage ? v.useImage : v.nowPlayingImageURL; switch (v.type) { case "music": icon = "icon-music-tone-alt"; width = v.nowPlayingImageURL !== "plugins/images/homepage/no-np.png" ? 56 : 100; bg = v.nowPlayingImageURL !== "plugins/images/homepage/no-np.png" ? ` ` : ""; break; case "movie": icon = "icon-film"; break; case "tv": icon = "icon-screen-desktop"; break; case "video": icon = "icon-screen-film"; break; default: } var userThumb = v.userThumb ? 'User' : ""; if (v.sessionType == "Direct Playing") { var userStream = "Direct Play"; var userVideo = "Direct Play"; var userAudio = "Direct Play"; streamDetails["direct"] = streamDetails["direct"] + 1; } else { var userStream = v.userStream.stream; var userVideo = v.userStream.videoDecision + " (" + v.userStream.sourceVideoCodec + ' ' + v.userStream.videoCodec + " " + v.userStream.videoResolution + ")"; var userAudio = v.userStream.audioDecision + " (" + v.userStream.sourceAudioCodec + ' ' + v.userStream.audioCodec + ")"; streamDetails["transcode"] = streamDetails["transcode"] + 1; } var streamInfo = ""; streamInfo += `
    Stream: ` + userStream + `
    `; streamInfo += v.userStream.videoResolution ? `
    Video: ` + userVideo + `
    ` : ""; streamInfo += `
    Audio: ` + userAudio + `
    `; v.session = v.session.replace(/[\W_]+/g, "-"); bandwidthDetails[v.bandwidthType] = bandwidthDetails[v.bandwidthType] + parseFloat(v.bandwidth); cards += `
    ` + bg + `

    ` + v.nowPlayingTitle + `

    ` + v.nowPlayingBottom + ` ` + v.user + `

    ` + v.sessionType + ` ` + v.bandwidth + ` kbps

    ` + v.bandwidthType + ` ` + v.userAddress + ` ` + streamInfo + `
    Product: ` + v.userStream.product + `
    Device: ` + v.userStream.device + `
    ` + userThumb + `
    `; }); cards += "
    "; cards += buildStreamTooltip(bandwidthDetails, streamDetails, source); return cards; } function buildStreamTooltip(bandwidth, streams, type) { var html = ""; var streamText = "Streams: "; var bandwidthText = " | Bandwidth: "; var bandwidthTotal = parseFloat(bandwidth["wan"]) + parseFloat(bandwidth["lan"]); if (type !== "plex") { bandwidthText += (parseFloat(bandwidth["wan"]) / 1000).toFixed(1) + " Mbps"; } else { bandwidthText += (parseFloat(bandwidthTotal) / 1000).toFixed(1) + " Mbps"; if (bandwidth["wan"] !== 0) { bandwidthText += " | WAN: " + (parseFloat(bandwidth["wan"]) / 1000).toFixed(1) + " Mbps"; } if (bandwidth["lan"] !== 0) { bandwidthText += " | LAN: " + (parseFloat(bandwidth["lan"]) / 1000).toFixed(1) + " Mbps"; } } var spacer = ""; if (streams["direct"] !== 0) { streamText += streams["direct"] + " Direct Play(s)"; spacer = " & "; } if (streams["transcode"] !== 0) { streamText += spacer + streams["transcode"] + " Transcode(s)"; } html += ''; return ( ` ` ); } function buildRecentItem(array, type, extra = null) { var items = ""; $.each(array, function (i, v) { if (extra == null) { var className = ""; var extraImg = ""; switch (v.type) { case "music": className = "recent-cover recent-item recent-music"; extraImg = ''; break; case "movie": className = "recent-poster recent-item recent-movie"; break; case "tv": className = "recent-poster recent-item recent-tv"; break; case "video": className = "recent-poster recent-item recent-video"; break; default: } items += ` `; } else { items += ` `; } }); return items; } function buildPlaylistItem(array, type, extra = null) { var items = ""; $.each(array, function (i, v) { if (i !== "title") { if (extra == null) { items += ` `; } else { items += ` `; } } }); return items; } function buildRequestAdminMenuItem(value, category, id, type) { var action = ""; var text = ""; var extra = ""; switch (category) { case "approved": if (value) { //nada } else { action = "approve"; text = "Approve"; extra = `
  • Deny
  • `; } break; case "available": if (value) { action = "unavailable"; text = "Mark as Unavailable"; } else { action = "available"; text = "Mark as Available"; } break; default: } return action ? `
  • ` + text + `
  • ` + extra : ""; } function buildRequestItem(array, extra = null) { var items = ""; let service = activeInfo.settings.homepage.requests.service; $.each(array, function (i, v) { if (extra == null) { var approveID = v.type == "tv" && service === "ombi" ? v.id : v.request_id; var iconType = v.type == "tv" ? "fa-tv " : "fa-film"; var badge = ""; var badge2 = ""; var bg = v.background.includes(".") ? v.background : "plugins/images/homepage/no-np.png"; v.user = (activeInfo.settings.homepage.ombi.alias && service === "ombi") || (activeInfo.settings.homepage.overseerr.enabled && service === "overseerr") ? v.userAlias : v.user; //Set Status var status = v.approved ? 'Approved' : 'Unapproved'; status += v.available ? 'Available' : 'Unavailable'; status += v.denied ? 'Denied' : ""; //Set Class var className = v.approved ? "request-approved" : "request-unapproved"; className += v.available ? " request-available" : " request-unavailable"; className += v.denied ? " request-denied" : " request-notdenied"; //Set badge badge = v.approved ? "bg-info" : "bg-warning"; badge = v.denied ? "bg-danger" : badge; badge2 = v.available ? "bg-success" : "bg-danger"; //Is Admin? var adminFunctions = `
    `; adminFunctions = activeInfo.user.groupID <= 1 ? adminFunctions : ""; var user = activeInfo.user.groupID <= 1 ? 'Requested By: ' + v.user : ""; var user2 = activeInfo.user.groupID <= 1 ? "
    " + v.user : ""; var divId = v.type == "movie" ? v.request_id : v.id; items += `
    ` + v.title + user2 + `
    ` + adminFunctions + `

    ` + v.title + `
    ` + user + `
    ` + buildYoutubeLink(v.title + " " + v.type) + `

    ` + status + `

    ` + v.overview + `

    `; } else { items += ` `; } }); return items !== "" || extra == null ? items : '

    No items

    '; } function buildStream(array, type) { var streams = typeof array.content !== "undefined" ? array.content.length : false; var originalType = type; //type = (type === 'emby' && activeInfo.settings.homepage.media.jellyfin) ? 'jellyfin' : type; return streams ? `

    Active ` + toUpper(type) + ` Streams :

     ` + streams + `

    ` + buildStreamItem(array.content, type) + `
    ` : ""; } function buildRecent(array, type) { var recent = typeof array.content !== "undefined" ? true : false; array.content = recent ? Object.values(array.content) : false; var movie = recent ? array.content.filter((p) => p.type == "movie").length > 0 ? true : false : false; var tv = recent ? array.content.filter((p) => p.type == "tv").length > 0 ? true : false : false; var video = recent ? array.content.filter((p) => p.type == "video").length > 0 ? true : false : false; var music = recent ? array.content.filter((p) => p.type == "music").length > 0 ? true : false : false; var dropdown = ""; var header = ""; var headerAlt = ""; var refreshType = type; //type = (type === 'emby' && activeInfo.settings.homepage.media.jellyfin) ? 'jellyfin' : type; dropdown += recent && movie ? `
  • Movies
  • ` : ""; dropdown += recent && tv ? `
  • Shows
  • ` : ""; dropdown += recent && video ? `
  • Videos
  • ` : ""; dropdown += recent && music ? `
  • Music
  • ` : ""; var dropdownMenu = `
    `; if (activeInfo.settings.homepage.options.alternateHomepageHeaders) { var headerAlt = `

    Recently Added :

     

    ` + dropdownMenu + `
    `; } else { var header = `
      Recently Added ` + dropdownMenu + `
    `; } return recent ? `
    ` + headerAlt + `
    ` + header + `
    ` + buildRecentItem(array.content, type, true) + `
    ` : ""; } function owlChange(elm, action) { switch (action) { case "next": $("." + elm).trigger("next.owl"); break; case "previous": $("." + elm).trigger("prev.owl"); break; default: return false; } return false; } function cleanPlaylistTitle(string) { var test = string.split("."); if (test.length > 1) { if (!isNaN(test[0])) { return test[1]; } } return string; } function buildPlaylist(array, type) { var playlist = typeof array.content !== "undefined" ? Object.keys(array.content).length : false; var dropdown = ""; var first = ""; var firstButton = ""; var hidden = ""; var count = 0; var items = ""; var header = ""; var headerAlt = ""; if (playlist) { $.each(array.content, function (i, v) { v.title = cleanPlaylistTitle(v.title); count++; first = count == 1 ? v.title : first; firstButton = count == 1 ? i + "-playlist" : firstButton; hidden = count == 1 ? "" : " owl-hidden hidden"; dropdown += `
  • ` + v.title + `
  • `; items += ` ` + buildPlaylistItem(v, type, true) + ` `; }); var builtDropdown = ` `; } if (activeInfo.settings.homepage.options.alternateHomepageHeaders) { var headerAlt = `

    ` + first + ` :

     

    ` + builtDropdown + `
    `; } else { var header = `
      ` + first + `
    ` + builtDropdown + `
    `; } return playlist ? `
    ` + headerAlt + `
    ` + header + `
    ` + items + `
    ` : ""; } function buildRequest(service, div, array) { var requests = typeof array.content !== "undefined"; var dropdown = ""; var headerAlt = ""; var header = ""; var requestButton = activeInfo["settings"]["homepage"][service]["enabled"] === true ? `` : ""; if (requests) { var builtDropdown = ` ` + requestButton + ` `; } if (activeInfo.settings.homepage.options.alternateHomepageHeaders) { var headerAlt = `

    Requests :

     

    ` + builtDropdown + `
    `; } else { var header = `
      Requests
    ` + builtDropdown + `
    `; } return requests ? `
    ` + headerAlt + `
    ` + header + `
    ` + buildRequestItem(array.content, true) + `
    ` : ""; } function pagination(c, m) { var current = c, last = m, delta = 2, left = current - delta, right = current + delta + 1, range = [], rangeWithDots = [], l; for (let i = 1; i <= last; i++) { if (i == 1 || i == last || (i >= left && i < right)) { range.push(i); } } for (let i of range) { if (l) { if (i - l === 2) { rangeWithDots.push(l + 1); } else if (i - l !== 1) { rangeWithDots.push("..."); } } rangeWithDots.push(i); l = i; } return rangeWithDots; } function buildRequestResult( array, media_type = null, list = null, page = null, search = false ) { var comments = typeof array.comments !== "undefined" ? true : false; var comment = ""; var results = ``; var buttons = ``; var next = ``; var tv = 0; var movie = 0; var total = 0; var totalPages = array.total_pages; var currentPage = page * 1; var pagePrevious = page * 1 - 1; var pageNext = page * 1 + 1; var pageFirst = 1; var pageLast = totalPages; var previousHidden = currentPage == 1 ? "disabled" : ""; var nextHidden = currentPage == totalPages ? "disabled" : ""; var pageList = ""; let previousEnabled = pagePrevious !== 0; let nextEnabled = pageNext <= totalPages; if (array.results.length == 0) { return '

    No Results

    '; } $.each(array.results, function (i, v) { media_type = v.media_type ? v.media_type : media_type; if (media_type == "tv" || media_type == "movie") { total = total + 1; tv = media_type == "tv" ? tv + 1 : tv; movie = media_type == "movie" ? movie + 1 : movie; var bg = v.poster_path !== null ? `https://image.tmdb.org/t/p/w300/` + v.poster_path : "plugins/images/homepage/no-list.png"; var top = v.title ? v.title : v.original_title ? v.original_title : v.original_name ? v.original_name : ""; var bottom = v.release_date ? v.release_date : v.first_air_date ? v.first_air_date : ""; if (comments) { if (array.comments[media_type + ":" + v.id] !== null) { comment = array.comments[media_type + ":" + v.id]; } } results += `
    ` + comment + `

    ` + top + `

    ` + bottom + `
    `; } comment = ""; }); if (list && page && search == false) { $.each(pagination(currentPage, totalPages), function (key, value) { var activePage = currentPage == value ? "active" : ""; var disabled = value == "..." ? "disabled" : ""; var pageLink = value == "..." ? "" : `onclick="requestList('` + list + `', '` + media_type + `', '` + value + `');"`; pageList += '
  • ' + value + "
  • "; }); let previousOnclick = previousEnabled ? `onclick="requestList('${list}', '${media_type}', '${pagePrevious}')";` : ``; let nextOnclick = nextEnabled ? `onclick="requestList('${list}', '${media_type}', '${pageNext}')";` : ``; next = `
    • ` + pageList + `
    `; } if (list && page && search == true) { $.each(pagination(currentPage, totalPages), function (key, value) { var activePage = currentPage == value ? "active" : ""; var disabled = value == "..." ? "disabled" : ""; var pageLink = value == "..." ? "" : `onclick="$('#request-page').val(` + value + `);doneTyping();"`; pageList += '
  • ' + value + "
  • "; }); next = `
    • ` + pageList + `
    `; } var buttons = `
    `; return buttons + next + results + next; } function buildRequestOverseerrSeasons(array) { var hasSeasons = typeof array.data.seasons !== "undefined"; if (hasSeasons) { let seasons = array.data.seasons; let id = array.data.id; let SeasonItems = ""; $.each(seasons, function (i, v) { if (v.seasonNumber !== 0) { SeasonItems += ` ${v.name} ${v.episodeCount} `; } }); let html = `
    Choose Seasons
    ${SeasonItems}
    Season # Of Episodes
    `; swal({ content: createElementFromHTML(html), button: null, className: "bg-org", dangerMode: false, }); } } function processOverseerrSeasons(el) { let seasons = $(el).attr("data-seasons"); let id = $(el).attr("data-id"); overseerrActions(id, "add", "tv", seasons); } function processRequest(id, type) { let service = activeInfo.settings.homepage.requests.service; switch (service) { case "ombi": requestActions(id, "add", type); return false; case "overseerr": if ( type === "tv" && activeInfo.settings.homepage.overseerr.userSelectTv === true ) { organizrAPI2( "GET", "api/v2/homepage/overseerr/metadata/" + type + "/" + id ) .success(function (data) { try { let response = data.response; buildRequestOverseerrSeasons(response); } catch (e) { organizrCatchError(e, data); } }) .fail(function (xhr) { OrganizrApiError(xhr, "Overseerr Error"); }); } else { requestActions(id, "add", type); } return false; default: organizrConsole( "Request Function", "Service for Processing not setup", "error" ); return false; } } function requestActions(id = null, action = null, type = null, extra = null) { let service = activeInfo.settings.homepage.requests.service; switch (service) { case "ombi": ombiActions(id, action, type, extra); break; case "overseerr": overseerrActions(id, action, type, extra); break; default: organizrConsole( "Request Function", "Service for Request not setup", "error" ); return false; } } //Overseerr Actions function overseerrActions(id, action, type = null, extra = null) { ajaxloader(".request-" + id + "-div", "in"); ajaxloader(".preloader-" + id, "in"); //$.magnificPopup.close(); messageSingle( window.lang.translate("Submitting Action to Overseerr"), "", activeInfo.settings.notifications.position, "#FFF", "success", "10000" ); switch (action) { case "add": let seasons = extra !== null ? "/" + extra : ""; var method = "POST"; var apiUrl = "api/v2/homepage/overseerr/requests/" + type + "/" + id + seasons; var data = {}; break; case "available": case "pending": case "unavailable": case "approve": var method = "POST"; var apiUrl = "api/v2/homepage/overseerr/requests/" + type + "/" + id + "/" + action; var data = {}; break; case "deny": var method = "PUT"; var apiUrl = "api/v2/homepage/overseerr/requests/" + type + "/" + id + "/" + action; var data = {}; break; case "delete": var method = "DELETE"; var apiUrl = "api/v2/homepage/overseerr/requests/" + type + "/" + id; var data = {}; break; default: return false; } organizrAPI2(method, apiUrl, data) .success(function (data) { try { let response = data.response; if (action == "add") { addTempRequest(); setTimeout(function () { ajaxloader(); }, 2000); } messageSingle( response.message, "", activeInfo.settings.notifications.position, "#FFF", "success", "5000" ); homepageRequests("overseerr"); cleanCloseSwal(); } catch (e) { organizrCatchError(e, data); } }) .fail(function (xhr) { ajaxloader(); OrganizrApiError(xhr, "Overseerr Error"); }); } //Ombi actions function ombiActions(id, action, type, extra = null) { var msg = activeInfo.user.groupID <= 1 ? 'Not Org Fault - Ask Ombi' : "Connection Error to Request Server"; ajaxloader(".request-" + id + "-div", "in"); ajaxloader(".preloader-" + id, "in"); //$.magnificPopup.close(); messageSingle( window.lang.translate("Submitting Action to Ombi"), "", activeInfo.settings.notifications.position, "#FFF", "success", "10000" ); switch (action) { case "add": var method = "POST"; var apiUrl = "api/v2/homepage/ombi/requests/" + type + "/" + id; var data = {}; break; case "available": case "unavailable": case "approve": var method = "POST"; var apiUrl = "api/v2/homepage/ombi/requests/" + type + "/" + id + "/" + action; var data = {}; break; case "deny": var method = "PUT"; var apiUrl = "api/v2/homepage/ombi/requests/" + type + "/" + id + "/" + action; var data = {}; break; case "delete": var method = "DELETE"; var apiUrl = "api/v2/homepage/ombi/requests/" + type + "/" + id; var data = {}; break; default: return false; } organizrAPI2(method, apiUrl, data) .success(function (data) { try { let response = data.response; if (action == "add") { addTempRequest(); } messageSingle( response.message, "", activeInfo.settings.notifications.position, "#FFF", "success", "5000" ); homepageRequests("ombi"); ajaxloader(); } catch (e) { organizrCatchError(e, data); } }) .fail(function (xhr) { ajaxloader(); OrganizrApiError(xhr, "Ombi Error"); }); } function addTempRequest() { let service = activeInfo.settings.homepage.requests.service; let html = `
    Adding Request
    `; $(".request-items-" + service) .trigger("add.owl", [html, 0]) .trigger("refresh.owl"); setTimeout(function () { ajaxloader(".request-adding", "in"); }, 100); } function cleanCloseSwal() { let state = swal.getState().isOpen; if (state === true) { swal.close(); } } function doneTyping() { let title = $("#request-input").val(); if (title == "") { return false; } var page = $("#request-page").val() ? $("#request-page").val() : 1; if (typeof searchTerm !== "undefined") { if (searchTerm !== $("#request-input").val()) { page = 1; } } ajaxloader(".search-div", "in"); searchTerm = title; $("#request-page").val(page); requestSearch(title, page) .success(function (data) { $("#request-results").html( buildRequestResult(data, "", title, page, true) ); if (bowser.mobile !== true) { $(".resultBox-inside").slimScroll({ height: "100%", position: "right", size: "5px", color: "#dcdcdc", }); } $(".mfp-wrap").animate( { scrollTop: "0", }, 500 ); ajaxloader(); }) .fail(function (xhr) { OrganizrApiError(xhr, "TMDB Error"); ajaxloader(); }); } function requestList(list, type, page = 1) { ajaxloader(".search-div", "in"); requestSearchList(list, page) .success(function (data) { if (typeof data.results !== "undefined") { var results = data.results; } else if (typeof data.items !== "undefined") { var results = data.items; } $("#request-results").html(buildRequestResult(data, type, list, page)); if (bowser.mobile !== true) { $(".resultBox-inside").slimScroll({ height: "100%", position: "right", size: "5px", color: "#dcdcdc", }); } $(".mfp-wrap").animate( { scrollTop: "0", }, 500 ); ajaxloader(); }) .fail(function (xhr) { OrganizrApiError(xhr, "TMDB Error"); ajaxloader(); }); } function buildDownloaderItem(array, source, type = "none") { var queue = ""; var count = 0; var history = ""; switch (source) { case "jdownloader": if (array.content === false) { queue = 'Connection Error to ' + source + ""; break; } if ( array.content.queueItems.length == 0 && array.content.grabberItems.length == 0 && array.content.encryptedItems.length == 0 && array.content.offlineItems.length == 0 ) { queue = 'Nothing in queue'; } else { if (array.content.$status[0] == "RUNNING") { queue += ` `; } else if (array.content.$status[0] == "PAUSE") { queue += ``; } else { queue += ``; } if (array.content.$status[1]) { queue += ``; } } $.each(array.content.queueItems, function (i, v) { count = count + 1; if (v.speed == null) { v.speed = "Stopped"; } if (v.eta == null) { if (v.percentage == "100") { v.speed = "Completed"; v.eta = "--"; } else { v.eta = "--"; } } if (v.enabled == null) { v.speed = "Disabled"; } queue += ` ` + v.name + ` ` + v.speed + ` ` + v.size + ` ` + v.eta + `
    ` + v.percentage + `%
    `; }); $.each(array.content.grabberItems, function (i, v) { count = count + 1; queue += ` ` + v.name + ` Online -- --
    0%
    `; }); $.each(array.content.encryptedItems, function (i, v) { count = count + 1; queue += ` ` + v.name + ` Encrypted -- --
    0%
    `; }); $.each(array.content.offlineItems, function (i, v) { count = count + 1; queue += ` ` + v.name + ` Offline -- --
    0%
    `; }); break; case "sabnzbd": if (array.content === false) { queue = 'Connection Error to ' + source + ""; break; } if (array.content.queueItems.queue.paused) { var state = ``; var active = "grayscale"; } else { var state = ``; var active = ""; } $(".sabnzbd-downloader-action").html(state); if (array.content.queueItems.queue.slots.length == 0) { queue = 'Nothing in queue'; } $.each(array.content.queueItems.queue.slots, function (i, v) { count = count + 1; var action = v.status == "Downloading" ? "pause" : "resume"; var actionIcon = v.status == "Downloading" ? "pause" : "play"; queue += ` ` + v.filename + ` ` + v.status + ` ` + v.cat + ` ` + v.size + ` ` + v.timeleft + `
    ` + v.percentage + `%
    `; }); if (array.content.historyItems.history.slots.length == 0) { history = 'Nothing in history'; } $.each(array.content.historyItems.history.slots, function (i, v) { history += ` ` + v.name + ` ` + v.status + ` ` + v.category + ` ` + v.size + `
    100%
    `; }); break; case "nzbget": if (array.content === false) { queue = 'Connection Error to ' + source + ""; break; } if (array.content.queueItems.result.length == 0) { queue = 'Nothing in queue'; } $.each(array.content.queueItems.result, function (i, v) { count = count + 1; var action = v.Status == "Downloading" ? "pause" : "resume"; var actionIcon = v.Status == "Downloading" ? "pause" : "play"; var percent = Math.floor( ((v.FileSizeMB - v.RemainingSizeMB) * 100) / v.FileSizeMB ); var size = v.FileSizeMB * 1000000; v.Category = v.Category !== "" ? v.Category : "Not Set"; queue += ` ` + v.NZBName + ` ` + v.Status + ` ` + v.Category + ` ` + humanFileSize(size, true) + `
    ` + percent + `%
    `; }); if (array.content.historyItems.result.length == 0) { history = 'Nothing in history'; } $.each(array.content.historyItems.result, function (i, v) { v.Category = v.Category !== "" ? v.Category : "Not Set"; var size = v.FileSizeMB * 1000000; history += ` ` + v.NZBName + ` ` + v.Status + ` ` + v.Category + ` ` + humanFileSize(size, true) + `
    100%
    `; }); break; case "transmission": if (array.content === false) { queue = 'Connection Error to ' + source + ""; break; } if (array.content.queueItems == 0) { queue = 'Nothing in queue'; } $.each(array.content.queueItems, function (i, v) { count = count + 1; switch (v.status) { case 7: case "7": var status = "No Peers"; break; case 6: case "6": var status = "Seeding"; break; case 5: case "5": var status = "Seeding Queued"; break; case 4: case "4": var status = "Downloading"; break; case 3: case "3": var status = "Queued"; break; case 2: case "2": var status = "Checking Files"; break; case 1: case "1": var status = "File Check Queued"; break; case 0: case "0": var status = "Complete"; break; default: var status = "Complete"; } var percent = Math.floor(v.percentDone * 100); v.Category = v.Category !== "" ? v.Category : "Not Set"; queue += ` ` + v.name + ` ` + status + ` ` + v.downloadDir + ` ` + humanFileSize(v.totalSize, true) + `
    ` + percent + `%
    `; }); break; case "rTorrent": if (array.content === false) { queue = 'Connection Error to ' + source + ""; break; } if (array.content.queueItems == 0) { queue = 'Nothing in queue'; } $.each(array.content.queueItems, function (i, v) { count = count + 1; var percent = Math.floor((v.downloaded / v.size) * 100); var size = v.size != -1 ? humanFileSize(v.size, false) : "?"; var upload = v.seed !== "" ? humanFileSize(v.seed, true) : "0 B"; var download = v.leech !== "" ? humanFileSize(v.leech, true) : "0 B"; var upTotal = v.upTotal !== "" ? humanFileSize(v.upTotal, false) : "0 B"; var downTotal = v.downTotal !== "" ? humanFileSize(v.downTotal, false) : "0 B"; var date = new Date(0); date.setUTCSeconds(v.date); date = moment(date).format("LLL"); queue += ` ` + v.name + ` ` + v.status + `  ` + download + `  ` + upload + ` ` + size + ` ` + v.label + `
    ` + percent + `%
    `; }); break; case "utorrent": if (array.content === false) { queue = 'Connection Error to ' + source + ""; break; } if (array.content.queueItems == 0) { queue = 'Nothing in queue'; } $.each(array.content.queueItems, function (i, v) { count = count + 1; var upload = v.upSpeed !== "" ? humanFileSize(v.upSpeed, false) : "0 B"; var download = v.downSpeed !== "" ? humanFileSize(v.downSpeed, false) : "0 B"; var size = v.Size !== "" ? humanFileSize(v.Size, false) : "0 B"; queue += ` ` + v.Name + ` ` + v.Status + ` ` + v.Labels + `  ` + download + `  ` + upload + ` ` + size + `
    ` + v.Percent + `
    `; }); break; case "sonarr": if (array.content === false) { queue = 'Connection Error to ' + source + ""; break; } if (array.content.queueItems == 0) { queue = 'Nothing in queue'; break; } if (array.content.queueItems.records == 0) { queue = 'Nothing in queue'; break; } let sonarrQueueSet = typeof array.content.queueItems.records == "undefined" ? array.content.queueItems : array.content.queueItems.records; $.each(sonarrQueueSet, function (i, v) { count = count + 1; var percent = Math.floor(((v.size - v.sizeleft) / v.size) * 100); percent = isNaN(percent) ? "0" : percent; var size = v.size != -1 ? humanFileSize(v.size, false) : "?"; v.name = typeof v.series == "undefined" ? v.title : v.series.title; queue += ` ` + v.name + ` S` + pad(v.episode.seasonNumber, 2) + `E` + pad(v.episode.episodeNumber, 2) + ` ` + v.episode.title + ` ` + v.status + ` ` + size + ` ` + v.protocol + `
    ` + percent + `%
    `; }); break; case "radarr": if (array.content === false) { queue = 'Connection Error to ' + source + ""; break; } if (array.content.queueItems == 0) { queue = 'Nothing in queue'; break; } if (array.content.queueItems.records == 0) { queue = 'Nothing in queue'; break; } let queueSet = typeof array.content.queueItems.records == "undefined" ? array.content.queueItems : array.content.queueItems.records; $.each(queueSet, function (i, v) { count = count + 1; var percent = Math.floor(((v.size - v.sizeleft) / v.size) * 100); percent = isNaN(percent) ? "0" : percent; var size = v.size != -1 ? humanFileSize(v.size, false) : "?"; v.name = typeof v.movie == "undefined" ? v.title : v.movie.title; queue += ` ${v.name} ${ v.status } ${size} ${ v.protocol }
    ${percent}%
    `; }); if (queue == "") { queue = 'Nothing in queue'; } break; case "qBittorrent": if (array.content === false) { queue = 'Connection Error to ' + source + ""; break; } if (array.content.queueItems == 0) { queue = 'Nothing in queue'; } $.each(array.content.queueItems, function (i, v) { count = count + 1; switch (v.state) { case "stalledDL": var status = "No Peers"; break; case "metaDL": var status = "Getting Metadata"; break; case "uploading": var status = "Seeding"; break; case "queuedUP": var status = "Seeding Queued"; break; case "downloading": var status = "Downloading"; break; case "queuedDL": var status = "Queued"; break; case "checkingDL": case "checkingUP": var status = "Checking Files"; break; case "pausedDL": var status = "Paused"; break; case "pausedUP": var status = "Complete"; break; default: var status = "Complete"; } var percent = Math.floor(v.progress * 100); var size = v.total_size != -1 ? humanFileSize(v.total_size, true) : "?"; queue += ` ` + v.name + ` ` + status + ` ` + v.save_path + ` ` + size + `
    ` + percent + `%
    `; }); break; case "deluge": if (array.content === false) { queue = 'Connection Error to ' + source + ""; break; } if (array.content.queueItems.length == 0) { queue = 'Nothing in queue'; } $.each(array.content.queueItems, function (i, v) { count = count + 1; var percent = Math.floor(v.progress); var size = v.total_size != -1 ? humanFileSize(v.total_size, true) : "?"; var upload = v.upload_payload_rate != -1 ? humanFileSize(v.upload_payload_rate, true) : "?"; var download = v.download_payload_rate != -1 ? humanFileSize(v.download_payload_rate, true) : "?"; var action = v.Status == "Downloading" ? "pause" : "resume"; var actionIcon = v.Status == "Downloading" ? "pause" : "play"; queue += ` ` + v.name; if (v.tracker_status != "") queue += `
    ` + v.tracker_status + `
    `; queue += ` ` + v.state + ` ` + size + `  ` + download + `  ` + upload + `
    ` + percent + `%
    `; }); break; default: return false; } if (queue !== "") { $("." + source + "-queue").html(queue); } if (history !== "") { $("." + source + "-history").html(history); } $("#count-" + source).html(count); } function buildDownloader(source) { var queueButton = "QUEUE"; var historyButton = "HISTORY"; switch (source) { case "jdownloader": var queue = true; var history = false; queueButton = "REFRESH"; break; case "sabnzbd": case "nzbget": var queue = true; var history = true; break; case "transmission": case "qBittorrent": case "deluge": case "utorrent": var queue = true; break; case "rTorrent": case "sonarr": case "radarr": var queue = true; var history = false; queueButton = "REFRESH"; break; default: var queue = false; var history = false; } var menu = `"; if (activeInfo.settings.homepage.options.alternateHomepageHeaders) { var headerAlt = `

      ` + state + `

    ` + menu + `
    `; } else { var header = `

      ` + state + `

    ` + menu + `
    `; } return ( `
    ` + headerAlt + `
    ` + header + `
    ` + listing + `
    ` ); } function buildDownloaderCombined(source) { var first = $(".combinedDownloadRow").length == 0 ? true : false; var active = first ? "active" : ""; var queueButton = "QUEUE"; var historyButton = "HISTORY"; switch (source) { case "jdownloader": var queue = true; var history = false; queueButton = "REFRESH"; break; case "sabnzbd": case "nzbget": var queue = true; var history = true; break; case "utorrent": var queue = true; break; case "transmission": case "qBittorrent": case "deluge": case "rTorrent": case "sonarr": case "radarr": var queue = true; var history = false; queueButton = "REFRESH"; break; default: var queue = false; var history = false; } var mainMenu = `" : ""; if (first) { if (activeInfo.settings.homepage.options.alternateHomepageHeaders) { var headerAlt = `
    ` + mainMenu + `
    `; } else { var header = `
    ` + mainMenu + `
    `; } var built = `
    ` + headerAlt + `
    ` + header + `
    ` + listingMain + `
    `; $("#homepageOrderdownloader").html(built); } else { $(addToMainMenu).appendTo(".combinedMenuList"); $(listingMain).appendTo(".listingMain"); } } function buildMetadata(array, source) { var metadata = ""; var genres = ""; var actors = ""; var rating = '
    '; var sourceIcon = source === "jellyfin" ? "fish" : source; $.each(array.content, function (i, v) { // Normalize per-item source when coming from JellyStat or unknown var itemSource = source; try { if ( source === "jellystat" || (source !== "emby" && source !== "jellyfin") ) { if (v.tabName) { var tn = String(v.tabName).toLowerCase(); if (tn.indexOf("emby") !== -1) { itemSource = "emby"; } else if (tn.indexOf("jellyfin") !== -1) { itemSource = "jellyfin"; } } // Fallback inference from address if tabName did not resolve if ( (itemSource === source || itemSource === "jellystat") && v.address ) { var addr = String(v.address).toLowerCase(); if (addr.indexOf("jellyfin") !== -1) { itemSource = "jellyfin"; } else if (addr.indexOf("emby") !== -1) { itemSource = "emby"; } } } } catch (e) {} // Normalize to lowercase to avoid casing issues like 'Emby' itemSource = (itemSource || "").toString().toLowerCase(); var hasActor = typeof v.metadata.actors !== "string" ? true : false; var hasGenre = typeof v.metadata.genres !== "string" ? true : false; if (hasActor) { $.each(v.metadata.actors, function (i, v) { actors += '
    ' + v.name + '
    ' + v.role + "
    "; }); } if (hasGenre) { $.each(v.metadata.genres, function (i, v) { genres += '' + v + ""; }); } if (v.metadata.rating) { var ratingRound = Math.ceil(v.metadata.rating) * 10; rating = `
    User
    `; } var seconds = v.metadata.duration / 1000; // or "2000" seconds = parseInt(seconds); //because moment js dont know to handle number in string format var format = Math.floor(moment.duration(seconds, "seconds").asHours()) + ":" + moment.duration(seconds, "seconds").minutes() + ":" + moment.duration(seconds, "seconds").seconds(); // Build icon HTML: use image for Emby to avoid missing MDI glyphs; keep MDI for others var sourceIconHtml = ""; var iconChoice = itemSource === "jellyfin" ? "fish" : itemSource; if (itemSource === "emby") { sourceIconHtml = ''; } else { sourceIconHtml = ''; } metadata = `
    ` + rating + `

    ` + v.title + `
    ` + v.metadata.tagline + `
    ` + buildYoutubeLink(v.title + " " + v.metadata.year + " " + v.type) + `

    ` + genres + `

    ` + v.metadata.summary + `

    `; }); return metadata; } function buildYoutubeLink(title) { if (title) { var str = createRandomString(10); return ( ` ` ); } } function buildPVRLink(href, ico = "", frame = "", showLink = true) { if (href && showLink) { var styleOverride = `width:55px;height:44px;background-image: url(${ico});background-repeat:no-repeat;background-size:25px;background-position:center;`; if (frame) { return `
    `; } else { return `
    `; } } else { return ` `; } } function buildCalendarMetadata(array) { var metadata = ""; var genres = ""; var actors = ""; var rating = '
    '; var hasGenre = typeof array.genres !== "string" ? true : false; if (hasGenre) { $.each(array.genres, function (i, v) { genres += '' + v + ""; }); } if (array.ratings) { var ratingRound = Math.ceil(array.ratings) * 10; rating = `
    User
    `; } var seconds = array.runtime / 1000; // or "2000" seconds = parseInt(seconds); //because moment js dont know to handle number in string format var format = Math.floor(moment.duration(seconds, "seconds").asHours()) + ":" + moment.duration(seconds, "seconds").minutes() + ":" + moment.duration(seconds, "seconds").seconds(); metadata = `
    ` + rating + `

    ` + array.topTitle + `
    ` + array.bottomTitle + `
    ` + buildPVRLink(array.href, array.icon, array.frame, array.showLink) + buildYoutubeLink(array.topTitle) + `

    ` + genres + `

    ` + array.overview + `

    `; return metadata; } function buildHealthChecks(array) { if (array === false) { return ""; } var checks = typeof array.content.checks !== "undefined" ? array.content.checks.length : false; return checks ? `

    Health Checks :

     ` + checks + `

    ` + buildHealthChecksItem(array) + `
    ` : ""; } function buildPihole(array) { if (array === false) { return ""; } var html = `
    `; if (array["options"]["title"]) { html += `

    Pi-hole :

     

    `; } html += `
    ` + buildPiholeItem(array) + `
    `; return array ? html : ""; } function buildAdGuard(array) { if (array === false) { return ""; } var html = `
    `; if (array["options"]["title"]) { html += `

    AdGuard Home :

     

    `; } html += `
    ` + buildAdGuardItem(array) + `
    `; return array ? html : ""; } function buildUnifi(array) { if (array === false) { return ""; } var items = typeof array.content.unifi.data !== "undefined" ? array.content.unifi.data.length : false; return items ? `

    UniFi :

     

    ` + buildUnifiItem(array.content.unifi.data) + `
    ` : ""; } function buildUnifiItemNew(array) { let items = ""; let count = 0; let navTabItems = ""; $.each(array, function (i, v) { let name = typeof v.subsystem !== "undefined" ? v.subsystem : ""; let stats = {}; let panelColor = ""; let proceed = v.status == "ok"; let active = count <= 0 ? "active in" : ""; let icon = "ti-home"; count++; switch (name) { case "wlan": panelColor = "info"; stats["clients"] = v.num_user; stats["tx"] = v["tx_bytes-r"]; stats["rx"] = v["rx_bytes-r"]; break; case "wan": panelColor = "success"; stats["IP"] = v.wan_ip; stats["tx"] = v["tx_bytes-r"]; stats["rx"] = v["rx_bytes-r"]; break; case "lan": panelColor = "primary"; stats["clients"] = v.num_user; stats["tx"] = v["tx_bytes-r"]; stats["rx"] = v["rx_bytes-r"]; break; case "www": panelColor = "warning"; stats["drops"] = v.drops; stats["latency"] = v.latency; stats["uptime"] = v.uptime; stats["tx"] = v["tx_bytes-r"]; stats["rx"] = v["rx_bytes-r"]; break; case "vpn": panelColor = "inverse"; stats["clients"] = v.remote_user_num_active; stats["tx"] = v.remote_user_tx_bytes; stats["rx"] = v.remote_user_rx_bytes; break; default: } var statItems = ""; if (proceed) { navTabItems += ``; $.each(stats, function (istat, vstat) { statItems += `
    ${istat}
    ${vstat}
    `; }); items += `
    ${statItems}
    `; } }); let navTabs = ``; items = `
    ${items}
    `; return navTabs + items; } function buildUnifiItem(array) { var items = ""; $.each(array, function (i, v) { var name = typeof v.subsystem !== "undefined" ? v.subsystem : ""; var stats = {}; var panelColor = ""; var proceed = v.status == "ok"; switch (name) { case "wlan": panelColor = "info"; stats["clients"] = v.num_user; stats["tx"] = v["tx_bytes-r"]; stats["rx"] = v["rx_bytes-r"]; break; case "wan": panelColor = "success"; stats["IP"] = v.wan_ip; stats["tx"] = v["tx_bytes-r"]; stats["rx"] = v["rx_bytes-r"]; break; case "lan": panelColor = "primary"; stats["clients"] = v.num_user; stats["tx"] = v["tx_bytes-r"]; stats["rx"] = v["rx_bytes-r"]; break; case "www": panelColor = "warning"; stats["drops"] = v.drops; stats["latency"] = v.latency; stats["uptime"] = v.uptime; stats["tx"] = v["tx_bytes-r"]; stats["rx"] = v["rx_bytes-r"]; break; case "vpn": panelColor = "inverse"; stats["clients"] = v.remote_user_num_active; stats["tx"] = v.remote_user_tx_bytes; stats["rx"] = v.remote_user_rx_bytes; break; default: } var statItems = ""; if (proceed) { $.each(stats, function (istat, vstat) { statItems += `
    ${istat}
    ${vstat}
    `; }); items += `
    ${name}
    ${statItems}
    `; } }); return items; } function healthCheckIcon(tags) { var allTags = tags.split(" "); var useIcon = ""; $.each(allTags, function (i, v) { //check for image var file = v.substring(v.lastIndexOf(".") + 1, v.length).toLowerCase() || v.toLowerCase(); switch (file) { case "png": case "jpg": case "jpeg": case "gif": useIcon = ' '; break; default: } }); return useIcon; } function buildHealthChecksItem(array) { var checks = ""; $.each(array.content.checks, function (i, v) { var hasIcon = healthCheckIcon(v.tags); v.name = v.name ? v.name : "New Item"; v.desc = array.options.desc && v.desc ? "
    Notes: " + v.desc + "
    " : ""; switch (v.status) { case "up": var statusColor = "success"; var statusIcon = "ti-link text-success"; var nextPing = moment .utc(v.next_ping, "YYYY-MM-DD hh:mm[Z]") .local() .fromNow(); var lastPing = moment .utc(v.last_ping, "YYYY-MM-DD hh:mm[Z]") .local() .fromNow(); break; case "down": var statusColor = "danger animated-3 loop-animation flash"; var statusIcon = "ti-unlink text-danger"; var nextPing = "Service Down"; var lastPing = moment .utc(v.last_ping, "YYYY-MM-DD hh:mm[Z]") .local() .fromNow(); break; case "new": var statusColor = "info"; var statusIcon = "ti-time text-info"; var nextPing = "Waiting..."; var lastPing = "n/a"; break; case "grace": var statusColor = "warning"; var statusIcon = "ti-alert text-warning"; var nextPing = moment .utc(v.next_ping, "YYYY-MM-DD hh:mm[Z]") .local() .fromNow(); var lastPing = "Missed"; break; case "paused": var statusColor = "primary"; var statusIcon = "ti-control-pause text-primary"; var nextPing = "Paused"; var lastPing = moment .utc(v.last_ping, "YYYY-MM-DD hh:mm[Z]") .local() .fromNow(); break; default: var statusColor = "warning"; var statusIcon = "ti-timer text-warning"; var nextPing = "Waiting..."; var lastPing = "n/a"; } var tagPrimaryElem = "", tagSecondaryElem = ""; if (array.options.tags && v.tags) { v.tags = v.tags.split(" "); $.each(v.tags, function (key, value) { if (isURL(value)) { v.tags = arrayRemove(v.tags, value); } }); tagPrimaryElem = '' + v.tags[0] + ""; tagSecondaryElem = "
    Tags: "; tagSecondaryElem += v.tags .map((t) => { return t; }) .join(", "); tagSecondaryElem += "
    "; } checks += `
    ` + tagPrimaryElem + `

    ` + hasIcon + v.name + `

    Last: ` + lastPing + `
    Next: ` + nextPing + `
    ` + v.desc + tagSecondaryElem + `
    `; }); return checks; } function isURL(str) { const pattern = new RegExp( "^(https?:\\/\\/)?" + // protocol "((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|" + // domain name "((\\d{1,3}\\.){3}\\d{1,3}))" + // OR ip (v4) address "(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*" + // port and path "(\\?[;&a-z\\d%_.~+=-]*)?" + // query string "(\\#[-a-z\\d_]*)?$", "i" ); // fragment locator return !!pattern.test(str); } function arrayRemove(arr, value) { return arr.filter(function (ele) { return ele != value; }); } function buildAdGuardItem(array) { var stats = ` `; var length = Object.keys(array["data"]).length; var combine = array["options"]["combine"]; var totalQueries = function (data) { var card = `

    Total Queries

    `; for (var key in data) { var e = data[key]; if (length > 1 && !combine) { card += `

    (` + key + `)

    `; } card += `

    ` + e["num_dns_queries"].toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",") + `

    `; } card += `
    `; return card; }; var totalBlocked = function (data) { var card = `

    Queries Blocked

    `; for (var key in data) { var e = data[key]; if (length > 1 && !combine) { card += `

    (${key})

    `; } card += `

    ${e[ "num_blocked_filtering" ] .toString() .replace(/\B(?=(\d{3})+(?!\d))/g, ",")}

    `; } card += `
    `; return card; }; var avgProcessingTime = function (data) { var card = `

    Avg Processing Time

    `; for (var key in data) { var e = data[key]; if (length > 1 && !combine) { card += `

    (${key})

    `; } ms_time = parseFloat(e["avg_processing_time"]) * 1000; card += `

    ${ms_time.toFixed( 2 )} ms

    `; } card += `
    `; return card; }; var domainsBlocked = function (data) { var card = `

    Domains on Blocklist

    `; for (var key in data) { var e = data[key]; if (length > 1 && !combine) { card += `

    (${key})

    `; } var total_domains_blocked = 0; for (var key in e["filters"]) { total_domains_blocked += parseFloat(e["filters"][key]["rules_count"]); } card += `

    ${total_domains_blocked .toString() .replace(/\B(?=(\d{3})+(?!\d))/g, ",")}

    `; } card += `
    `; return card; }; var domainsBlocked = function (data) { var card = `

    Domains on Blocklist

    `; for (var key in data) { var e = data[key]; if (length > 1 && !combine) { card += `

    (${key})

    `; } var total_domains_blocked = 0; for (var key in e["filters"]) { total_domains_blocked += parseFloat(e["filters"][key]["rules_count"]); } total_domains_blocked += Object.keys(e["user_rules"]).length; card += `

    ${total_domains_blocked .toString() .replace(/\B(?=(\d{3})+(?!\d))/g, ",")}

    `; } card += `
    `; return card; }; var percentBlocked = function (data) { var card = `

    Percent Blocked

    `; for (var key in data) { var e = data[key]; if (typeof e["FTLnotrunning"] == "undefined") { if (length > 1 && !combine) { card += `

    (${key})

    `; } var percent = 100 * (parseFloat(e["num_blocked_filtering"]) / parseFloat(e["num_dns_queries"])); card += `

    ${percent.toFixed( 2 )}%

    `; } } card += `
    `; return card; }; if (combine) { stats += '
    '; if (array["options"]["queries"]) { stats += totalQueries(array["data"]); } if (array["options"]["blocked_count"]) { stats += totalBlocked(array["data"]); } if (array["options"]["blocked_percent"]) { stats += percentBlocked(array["data"]); } if (array["options"]["processing_time"]) { stats += avgProcessingTime(array["data"]); } if (array["options"]["domain_count"]) { stats += domainsBlocked(array["filters"]); } stats += "
    "; } else { for (var key in array["data"]) { var data = array["data"][key]; obj = {}; obj[key] = data; stats += '
    '; if (array["options"]["queries"]) { stats += totalQueries(array["data"]); } if (array["options"]["blocked_count"]) { stats += totalBlocked(array["data"]); } if (array["options"]["blocked_percent"]) { stats += percentBlocked(array["data"]); } if (array["options"]["processing_time"]) { stats += avgProcessingTime(array["data"]); } if (array["options"]["domain_count"]) { stats += domainsBlocked(array["filters"]); } stats += "
    "; } } return stats; } function buildPiholeItem(array) { var stats = ` `; var length = Object.keys(array["data"]).length; var combine = array["options"]["combine"]; var totalQueries = function (data) { var card = `

    Total queries (last 24 hours)

    `; for (var key in data) { var e = data[key]; if (typeof e["FTLnotrunning"] == "undefined") { if (length > 1 && !combine) { card += `

    (` + key + `)

    `; } let value = "Error"; if (e.length == undefined) { value = e["sum_queries"] .toString() .replace(/\B(?=(\d{3})+(?!\d))/g, ","); } card += `

    ` + value + `

    `; } } card += `
    `; return card; }; var totalBlocked = function (data) { var card = `

    Queries Blocked (last 24 hours)

    `; for (var key in data) { var e = data[key]; if (typeof e["FTLnotrunning"] == "undefined") { if (length > 1 && !combine) { card += `

    (${key})

    `; } let value = "Error"; if (e.length == undefined) { value = e["sum_blocked"] .toString() .replace(/\B(?=(\d{3})+(?!\d))/g, ","); } card += `

    ` + value + `

    `; } } card += `
    `; return card; }; var percentBlocked = function (data) { var card = `

    Percent Blocked (last 24 hours)

    `; for (var key in data) { var e = data[key]; if (typeof e["FTLnotrunning"] == "undefined") { if (length > 1 && !combine) { card += `

    (${key})

    `; } let value = "Error"; if (e.length == undefined) { value = e["percent_blocked"].toFixed(1); } card += `

    ` + value + `

    `; } } card += `
    `; return card; }; var domainsBlocked = function (data) { var card = `

    Domains on Blocklist (last 24 hours)

    `; for (var key in data) { var e = data[key]; if (typeof e["FTLnotrunning"] == "undefined") { if (length > 1 && !combine) { card += `

    (${key})

    `; } let value = "Error"; value = e["domains_being_blocked"] .map(function (x) { return `
  • ${x.toString()}
  • `; }) .join(""); card += `
      ` + value + `
    `; } } card += `
    `; return card; }; if (combine) { stats += '
    '; stats += totalQueries(array["data"]); stats += totalBlocked(array["data"]); stats += percentBlocked(array["data"]); stats += domainsBlocked(array["data"]); stats += "
    "; } else { for (var key in array["data"]) { var data = array["data"][key]; obj = {}; obj[key] = data; stats += '
    '; stats += totalQueries(obj); stats += totalBlocked(obj); stats += percentBlocked(obj); stats += domainsBlocked(obj); stats += "
    "; } } return stats; } function homepagePihole(timeout) { var timeout = typeof timeout !== "undefined" ? timeout : activeInfo.settings.homepage.refresh.homepagePiholeRefresh; organizrAPI2("GET", "api/v2/homepage/pihole/stats") .success(function (data) { try { let response = data.response; document.getElementById("homepageOrderPihole").innerHTML = ""; if (response.data !== null) { buildPihole(response.data); $("#homepageOrderPihole").html(buildPihole(response.data)); } } catch (e) { organizrCatchError(e, data); } }) .fail(function (xhr) { OrganizrApiError(xhr); }); let timeoutTitle = "PiHole-Homepage"; if (typeof timeouts[timeoutTitle] !== "undefined") { clearTimeout(timeouts[timeoutTitle]); } timeouts[timeoutTitle] = setTimeout(function () { homepagePihole(timeout); }, timeout); delete timeout; } function homepageAdGuard(timeout) { var timeout = typeof timeout !== "undefined" ? timeout : activeInfo.settings.homepage.refresh.homepageAdGuardRefresh; organizrAPI2("GET", "api/v2/homepage/adguard/stats") .success(function (data) { try { let response = data.response; document.getElementById("homepageOrderAdGuard").innerHTML = ""; if (response.data !== null) { buildAdGuard(response.data); $("#homepageOrderAdGuard").html(buildAdGuard(response.data)); } } catch (e) { organizrCatchError(e, data); } }) .fail(function (xhr) { OrganizrApiError(xhr); }); let timeoutTitle = "AdGuard-Homepage"; if (typeof timeouts[timeoutTitle] !== "undefined") { clearTimeout(timeouts[timeoutTitle]); } timeouts[timeoutTitle] = setTimeout(function () { homepageAdGuard(timeout); }, timeout); delete timeout; } function homepageHealthChecks(tags, timeout) { tags = typeof tags !== "undefined" ? tags : activeInfo.settings.homepage.options.healthChecksTags; if (tags == "") { var apiUrl = "api/v2/homepage/healthchecks"; } else { var apiUrl = "api/v2/homepage/healthchecks/" + tags; } timeout = typeof timeout !== "undefined" ? timeout : activeInfo.settings.homepage.refresh.homepageHealthChecksRefresh; organizrAPI2("GET", apiUrl) .success(function (data) { try { var response = data.response; document.getElementById("homepageOrderhealthchecks").innerHTML = ""; if (response.data !== null) { $("#homepageOrderhealthchecks").html( buildHealthChecks(response.data) ); } } catch (e) { organizrCatchError(e, data); } }) .fail(function (xhr) { OrganizrApiError(xhr); }); let timeoutTitle = "HealthChecks-Homepage"; if (typeof timeouts[timeoutTitle] !== "undefined") { clearTimeout(timeouts[timeoutTitle]); } timeouts[timeoutTitle] = setTimeout(function () { homepageHealthChecks(tags, timeout); }, timeout); delete timeout; } function homepageUnifi(timeout) { var timeout = typeof timeout !== "undefined" ? timeout : activeInfo.settings.homepage.refresh.homepageUnifiRefresh; organizrAPI2("GET", "api/v2/homepage/unifi/data") .success(function (data) { try { let response = data.response; document.getElementById("homepageOrderunifi").innerHTML = ""; if (response.data !== null) { $("#homepageOrderunifi").html(buildUnifi(response.data)); } } catch (e) { organizrCatchError(e, data); } }) .fail(function (xhr) { OrganizrApiError(xhr); }); var timeoutTitle = "Unifi-Homepage"; if (typeof timeouts[timeoutTitle] !== "undefined") { clearTimeout(timeouts[timeoutTitle]); } timeouts[timeoutTitle] = setTimeout(function () { homepageUnifi(timeout); }, timeout); delete timeout; } function homepageDownloader(type, timeout) { var timeout = typeof timeout !== "undefined" ? timeout : activeInfo.settings.homepage.refresh.homepageDownloadRefresh; switch (type) { case "jdownloader": var action = "getJdownloader"; break; case "sabnzbd": var action = "getSabnzbd"; break; case "nzbget": var action = "getNzbget"; break; case "transmission": var action = "getTransmission"; break; case "sonarr": var action = "getSonarrQueue"; break; case "radarr": var action = "getRadarrQueue"; break; case "qBittorrent": var action = "getqBittorrent"; break; case "deluge": var action = "getDeluge"; break; case "rTorrent": var action = "getrTorrent"; break; case "utorrent": var action = "getutorrent"; break; default: } let lowerType = type.toLowerCase(); organizrAPI2("GET", "api/v2/homepage/" + lowerType + "/queue") .success(function (data) { try { let response = data.response; if (response.data !== null) { buildDownloaderItem(response.data, type); } } catch (e) { organizrCatchError(e, data); } }) .fail(function (xhr) { OrganizrApiError(xhr); }); let timeoutTitle = type + "-Downloader-Homepage"; if (typeof timeouts[timeoutTitle] !== "undefined") { clearTimeout(timeouts[timeoutTitle]); } timeouts[timeoutTitle] = setTimeout(function () { homepageDownloader(type, timeout); }, timeout); delete timeout; } function homepageStream(type, timeout) { var timeout = typeof timeout !== "undefined" ? timeout : activeInfo.settings.homepage.refresh.homepageStreamRefresh; organizrAPI2("GET", "api/v2/homepage/" + type + "/streams") .success(function (data) { try { let response = data.response; document.getElementById( "homepageOrder" + type + "nowplaying" ).innerHTML = ""; $("#homepageOrder" + type + "nowplaying").html( buildStream(response.data, type) ); } catch (e) { organizrCatchError(e, data); } }) .fail(function (xhr) { OrganizrApiError(xhr); }); let timeoutTitle = type + "-Stream-Homepage"; if (typeof timeouts[timeoutTitle] !== "undefined") { clearTimeout(timeouts[timeoutTitle]); } timeouts[timeoutTitle] = setTimeout(function () { homepageStream(type, timeout); }, timeout); delete timeout; } function homepageRecent(type, timeout) { var timeout = typeof timeout !== "undefined" ? timeout : activeInfo.settings.homepage.refresh.homepageRecentRefresh; switch (type) { case "plex": var action = "getPlexRecent"; break; case "emby": case "jellyfin": var action = "getEmbyRecent"; break; default: } organizrAPI2("GET", "api/v2/homepage/" + type + "/recent") .success(function (data) { try { let response = data.response; document.getElementById("homepageOrder" + type + "recent").innerHTML = ""; $("." + type + "-recent").trigger("destroy.owl.carousel"); $("#homepageOrder" + type + "recent").html( buildRecent(response.data, type) ); $(".recent-items").owlCarousel({ nav: false, autoplay: false, dots: false, margin: 10, autoWidth: true, items: 4, }); } catch (e) { organizrCatchError(e, data); } }) .fail(function (xhr) { OrganizrApiError(xhr); }); let timeoutTitle = type + "-Recent-Homepage"; if (typeof timeouts[timeoutTitle] !== "undefined") { clearTimeout(timeouts[timeoutTitle]); } timeouts[timeoutTitle] = setTimeout(function () { homepageRecent(type, timeout); }, timeout); delete timeout; } function homepagePlaylist(type, timeout = 30000) { organizrAPI2("GET", "api/v2/homepage/" + type + "/playlists") .success(function (data) { try { let response = data.response; document.getElementById("homepageOrder" + type + "playlist").innerHTML = ""; $("#homepageOrder" + type + "playlist").html( buildPlaylist(response.data, type) ); $(".playlist-items").owlCarousel({ nav: false, autoplay: false, dots: false, margin: 10, autoWidth: true, items: 4, }); } catch (e) { organizrCatchError(e, data); } }) .fail(function (xhr) { OrganizrApiError(xhr); }); } function defaultRequestFilter(service) { switch (service) { case "ombi": var defaultFilter = { "request-filter-approved-ombi": activeInfo.settings.homepage.ombi.ombiDefaultFilterApproved, "request-filter-unapproved-ombi": activeInfo.settings.homepage.ombi.ombiDefaultFilterUnapproved, "request-filter-available-ombi": activeInfo.settings.homepage.ombi.ombiDefaultFilterAvailable, "request-filter-unavailable-ombi": activeInfo.settings.homepage.ombi.ombiDefaultFilterUnavailable, "request-filter-denied-ombi": activeInfo.settings.homepage.ombi.ombiDefaultFilterDenied, }; $.each(defaultFilter, function (i, v) { if (v == false) { $("#" + i).click(); } }); case "overseerr": var defaultFilter = { "request-filter-approved-overseerr": activeInfo.settings.homepage.overseerr.overseerrDefaultFilterApproved, "request-filter-unapproved-overseerr": activeInfo.settings.homepage.overseerr .overseerrDefaultFilterUnapproved, "request-filter-available-overseerr": activeInfo.settings.homepage.overseerr .overseerrDefaultFilterAvailable, "request-filter-unavailable-overseerr": activeInfo.settings.homepage.overseerr .overseerrDefaultFilterUnavailable, "request-filter-denied-overseerr": activeInfo.settings.homepage.overseerr.overseerrDefaultFilterDenied, }; $.each(defaultFilter, function (i, v) { if (v == false) { $("#" + i).click(); } }); } } function homepageRequests(service, timeout) { switch (service) { case "ombi": var apiUrl = "api/v2/homepage/ombi/requests"; var div = "homepageOrderombi"; var timeout = typeof timeout !== "undefined" ? timeout : activeInfo.settings.homepage.refresh.ombiRefresh; break; case "overseerr": var apiUrl = "api/v2/homepage/overseerr/requests"; var div = "homepageOrderoverseerr"; var timeout = typeof timeout !== "undefined" ? timeout : activeInfo.settings.homepage.refresh.overseerrRefresh; break; default: return false; } organizrAPI2("GET", apiUrl) .success(function (data) { try { let response = data.response; document.getElementById(div).innerHTML = ""; if (response.data.content !== false) { $("#" + div).html(buildRequest(service, div, response.data)); } $(".request-items-" + service).owlCarousel({ nav: false, autoplay: false, dots: false, margin: 10, autoWidth: true, items: 4, }); // Default Filter defaultRequestFilter(service); } catch (e) { organizrCatchError(e, data); } }) .fail(function (xhr) { OrganizrApiError(xhr); }); if (typeof timeouts[service + "-Requests-Homepage"] !== "undefined") { clearTimeout(timeouts[service + "-Requests-Homepage"]); } timeouts[service + "-Requests-Homepage"] = setTimeout(function () { homepageRequests(service, timeout); }, timeout); delete timeout; } function testAPIConnection(service, data = "") { messageSingle( "", " Testing now...", activeInfo.settings.notifications.position, "#FFF", "info", "60000" ); organizrAPI2("POST", "api/v2/test/" + service, data) .success(function (data) { try { let response = data.response; messageSingle( "", " API Connection Success", activeInfo.settings.notifications.position, "#FFF", "success", "10000" ); } catch (e) { organizrCatchError(e, data); } }) .fail(function (xhr) { OrganizrApiError(xhr, "API Error"); }); } function getUnifiSite() { messageSingle( "", " Grabbing now...", activeInfo.settings.notifications.position, "#FFF", "info", "10000" ); organizrAPI2("POST", "api/v2/test/unifi/site", {}) .success(function (data) { try { var response = data.response; if (response.data !== false) { var sites = ""; if (response.data.data) { $.each(response.data.data, function (i, v) { sites += '

    " + v.desc + "

    "; }); } else { //console.log('no'); } var div = `

    Choose Unifi Site

    ` + sites + `
    `; swal({ content: createElementFromHTML(div), buttons: false, className: "bg-org", }); } else { messageSingle( "API Connection Failed", response.data, activeInfo.settings.notifications.position, "#FFF", "error", "10000" ); } } catch (e) { organizrCatchError(e, data); } }) .fail(function (xhr) { OrganizrApiError(xhr, "API Error"); }); } function unifiSiteApply(name) { $("#homepage-UniFi-form [name=unifiSiteName]").val(name); $("#homepage-UniFi-form [name=unifiSiteName]").change(); swal.close(); messageSingle( "", " Grabbed Site - Please Save Now", activeInfo.settings.notifications.position, "#FFF", "success", "10000" ); } function homepageCalendar(timeout) { var timeout = typeof timeout !== "undefined" ? timeout : activeInfo.settings.homepage.refresh.calendarRefresh; if (activeInfo.settings.homepage.options.alternateHomepageHeaders) { $(".fc-toolbar").addClass("fc-alternate"); } organizrAPI2("GET", "api/v2/homepage/calendar") .success(function (data) { try { let response = data.response; $("#calendar").fullCalendar("removeEvents"); $("#calendar").fullCalendar("addEventSource", response.data.events); $("#calendar").fullCalendar("addEventSource", response.data.ical); $("#calendar").fullCalendar("today"); } catch (e) { organizrCatchError(e, data); } }) .fail(function (xhr) { OrganizrApiError(xhr); }); if (typeof timeouts["calendar-Homepage"] !== "undefined") { clearTimeout(timeouts["calendar-Homepage"]); } timeouts["calendar-Homepage"] = setTimeout(function () { homepageCalendar(timeout); }, timeout); delete timeout; } function buildTautulliItem(array) { var cards = ""; var homestats = array.homestats.data; var libstats = array.libstats; var options = array.options; var friendlyName = array.options.friendlyName; var buildLibraries = function (data) { var libs = data.data; var movies = []; var tv = []; var audio = []; libs.forEach((e) => { switch (e["section_type"]) { case "movie": movies.push(e); break; case "show": tv.push(e); break; case "artist": audio.push(e); break; default: break; } }); movies = movies.sort((a, b) => parseInt(a["count"]) > parseInt(b["count"]) ? -1 : 1 ); tv = tv.sort((a, b) => parseInt(a["count"]) > parseInt(b["count"]) ? -1 : 1 ); audio = audio.sort((a, b) => parseInt(a["count"]) > parseInt(b["count"]) ? -1 : 1 ); var buildCard = function (type, data) { var extraField = null; var section_name = null; if (type == "movie") { extraField = "Movies"; section_name = "Movie Libraries"; } else if (type == "show") { extraField = "Shows/Seasons/Episodes"; section_name = "TV Show Libraries"; } else if (type == "artist") { extraField = "Artists/Albums/Tracks"; section_name = "Music Libraries"; } var cardTitle = '' + section_name.toUpperCase() + '' + extraField.toUpperCase() + ""; var card = `
    ${cardTitle}
    library icon
    `; for (var i = 0; i < data.length; i++) { var rowType = i == 0 ? "tautulliFirstItem" : i == data.length - 1 ? "tautulliLastItem" : ""; var rowValue = ""; var firstDivCol = ""; var secondDivCol = ""; if (type == "movie") { rowValue = data[i]["count"]; firstDivCol = "col-md-9"; secondDivCol = "col-md-2"; } else { rowValue = data[i]["count"] + ' / ' + data[i]["parent_count"] + ' / ' + data[i]["child_count"]; firstDivCol = "col-md-5"; secondDivCol = "col-md-6"; } card += `
    ${ i + 1 }
    ${ data[i]["section_name"] }
    ${rowValue}
    `; } card += `
    `; return card; }; var card = movies.length > 0 ? buildCard("movie", movies) : ""; card += tv.length > 0 ? buildCard("show", tv) : ""; card += audio.length > 0 ? buildCard("artist", audio) : ""; return card; }; var buildStats = function (data, stat, friendlyName = true) { var card = ""; data.forEach((e) => { let classes = ""; if (e["stat_id"] == stat && e["rows"].length > 0) { if (stat === "top_platforms") { classes = " platform-" + e["rows"][0]["platform_name"] + "-rgba"; } else { classes = " bg-org-alt"; } card += `
    `; if (stat !== "top_users" && stat !== "top_platforms") { card += `
    background art
    `; } card += `
    `; if (stat == "top_users") { card += ``; } else if (stat == "top_platforms") { card += ``; } else { card += ``; } var extraField = null; if (e["stat_title"].includes("Popular")) { extraField = "users"; } else if ( e["stat_title"].includes("Watched") || e["stat_title"].includes("Active") ) { extraField = "plays"; } var cardTitle = '"; card += cardTitle + `
    user avatarplatform iconmovie poster' + e["stat_title"].toUpperCase() + '' + extraField.toUpperCase() + "
    `; for (var i = 0; i < e["rows"].length; i++) { var item = e["rows"][i]; var rowType = i == 0 ? "tautulliFirstItem" : i == e["rows"].length - 1 ? "tautulliLastItem" : ""; var rowNameValue = ""; var rowValue = ""; if (stat == "top_users") { if (friendlyName) { rowNameValue = item["friendly_name"]; } else { rowNameValue = item["user"]; } rowValue = item["total_plays"]; } else if (stat == "top_platforms") { rowNameValue = item["platform"]; rowValue = item["total_plays"]; } else if (extraField == "users") { rowNameValue = item["title"]; rowValue = item["users_watched"]; } else { rowNameValue = item["title"]; rowValue = item["total_plays"]; } card += `
    ${ i + 1 }
    ${rowNameValue}
    ${rowValue}
    `; } card += `
    `; } else { return ""; } }); return card; }; cards += '
    '; cards += options["libraries"] ? buildLibraries(libstats) : ""; cards += options["popularMovies"] ? buildStats(homestats, "popular_movies") : ""; cards += options["popularTV"] ? buildStats(homestats, "popular_tv") : ""; cards += options["topMovies"] ? buildStats(homestats, "top_movies") : ""; cards += options["topTV"] ? buildStats(homestats, "top_tv") : ""; cards += options["topUsers"] ? buildStats(homestats, "top_users", friendlyName) : ""; cards += options["topPlatforms"] ? buildStats(homestats, "top_platforms") : ""; cards += "
    "; cards += '
    '; cards += "
    "; return cards; } function buildTautulli(array) { if (array === false) { return ""; } var html = `
    `; if (array["options"]["title"]) { html += `

    ` + activeInfo.settings.homepage.options.titles.tautulli + ` :

     

    `; } html += `
    ` + buildTautulliItem(array) + `
    `; return array ? html : ""; } function homepageTautulli(timeout) { var timeout = typeof timeout !== "undefined" ? timeout : activeInfo.settings.homepage.refresh.homepageTautulliRefresh; organizrAPI2("GET", "api/v2/homepage/tautulli/data") .success(function (data) { try { let response = data.response; document.getElementById("homepageOrdertautulli").innerHTML = ""; if (response.data !== null) { $("#homepageOrdertautulli").html(buildTautulli(response.data)); } } catch (e) { organizrCatchError(e, data); } }) .fail(function (xhr) { OrganizrApiError(xhr); }); let timeoutTitle = "Tautulli-Homepage"; if (typeof timeouts[timeoutTitle] !== "undefined") { clearTimeout(timeouts[timeoutTitle]); } timeouts[timeoutTitle] = setTimeout(function () { homepageTautulli(timeout); }, timeout); delete timeout; } function weatherIcon(code, daytime = true) { switch (code) { case 1: case 2: return daytime ? "wi-day-sunny" : "wi-night-clear"; case 3: case 4: case 5: case 6: case 22: return daytime ? "wi-day-sunny-overcast" : "wi-night-alt-partly-cloudy"; case 7: case 8: case 9: return daytime ? "wi-day-cloudy-high" : "wi-night-partly-cloudy"; case 10: case 11: case 12: return daytime ? "wi-day-thunderstorm" : "wi-night-thunderstorm"; case 13: case 14: case 15: return daytime ? "wi-day-haze" : "wi-night-cloudy-windy"; case 16: case 17: case 18: return daytime ? "wi-day-fog" : "wi-night-fog"; case 19: case 20: case 21: return daytime ? "wi-day-cloudy-high" : "wi-night-cloudy-high"; case 23: case 25: return daytime ? "wi-day-rain" : "wi-night-rain"; case 24: case 26: return daytime ? "wi-day-snow" : "wi-night-snow"; case 27: case 28: case 30: case 31: case 33: return daytime ? "wi-day-rain-mix" : "wi-night-alt-rain-mix"; case 29: case 32: case 34: case 35: return daytime ? "wi-day-snow-thunderstorm" : "wi-night-alt-snow-thunderstorm"; default: return daytime ? "wi-day-sunny" : "wi-night-clear"; } } function buildWeatherAndAir(array) { var returnData = ""; if (typeof array.content === "undefined") { return ""; } if (array.content.weather !== false) { if (array.content.weather.error === null) { let dates = {}; $.each(array.content.weather.data, function (i, v) { let date = moment(v.datetime).format("YYYY-MM-DD"); if (typeof dates[date] === "undefined") { dates[date] = v; dates[date]["temps"] = { high: v.temperature.value, low: v.temperature.value, }; } else { if (moment(v.datetime).format("hh:mm a") == "12:00 pm") { dates[date]["icon_code"] = v.icon_code; dates[date]["is_day_time"] = v.is_day_time; } if (v.temperature.value > dates[date]["temps"]["high"]) { dates[date]["temps"]["high"] = v.temperature.value; } if (v.temperature.value < dates[date]["temps"]["low"]) { dates[date]["temps"]["low"] = v.temperature.value; } } }); let weatherItems = '
    '; let weatherItemsCount = 0; $.each(dates, function (i, v) { if (weatherItemsCount === 0) { weatherItems += `

    Feels Like ` + Math.round(v.feels_like_temperature.value) + `°` + moment(v.datetime).format("dddd") + `
    ` + v.weather_text + `

    • ` + Math.round(v.temperature.value) + `°` + v.temperature.units + `
    • ` + Math.round(v.wind.speed.value) + ` ` + v.wind.speed.units + `
    • ` + Math.round(v.pressure.value) + ` ` + v.pressure.units + `
    • ` + Math.round(v.relative_humidity) + `
    • ` + Math.round(v.dew_point.value) + `°
    `; } else if (weatherItemsCount !== 5) { weatherItems += `

    ` + moment(v.datetime).format("dddd") + `

    • ` + Math.round(v.temps.high) + `°` + v.temperature.units + `
    • ` + v.weather_text + `
    `; } weatherItemsCount++; }); weatherItems += "
    "; returnData += weatherItems; } } if (array.content.air !== false) { if (array.content.air.error === null) { let airItems = '
    '; let activeClasses = { poor: "", low: "", moderate: "", good: "", excellent: "", text: "", }; if (array.content.air.data.indexes.baqi.aqi <= 20) { activeClasses["poor"] = "active"; activeClasses["text"] = "text-poor-gradient"; } else if (array.content.air.data.indexes.baqi.aqi <= 40) { activeClasses["low"] = "active"; activeClasses["text"] = "text-low-gradient"; } else if (array.content.air.data.indexes.baqi.aqi <= 60) { activeClasses["moderate"] = "active"; activeClasses["text"] = "text-moderate-gradient"; } else if (array.content.air.data.indexes.baqi.aqi <= 80) { activeClasses["good"] = "active"; activeClasses["text"] = "text-good-gradient"; } else if (array.content.air.data.indexes.baqi.aqi <= 100) { activeClasses["excellent"] = "active"; activeClasses["text"] = "text-excellent-gradient"; } airItems += `
    ${ array.content.air.data.indexes.baqi.aqi }

    AirQuality Index

    Poor
    0
    20
    Low
    40
    Moderate
    60
    Good
    80
    Excellent
    100
    ${buildPollutant(array.content.air.data.pollutants)} ${buildHealthRecommendation( array.content.air.data.health_recommendations )} `; airItems += "
    "; returnData += airItems; } } if (array.content.pollen !== false) { if (array.content.pollen.error === null) { } } return returnData; } function buildHealthRecommendation(array) { var healthHeader = ""; var healthSection = ""; $.each(array, function (i, v) { var title = i .toString() .replace("_", " ") .toLowerCase() .split(" ") .map((word) => word.charAt(0).toUpperCase() + word.substring(1)) .join(" "); switch (i) { case "general_population": var icon = "fa fa-group"; break; case "elderly": var icon = "ti ti-wheelchair"; break; case "lung_diseases": var icon = "mdi mdi-spray"; break; case "heart_diseases": var icon = "mdi mdi-heart-pulse"; break; case "active": var icon = "mdi mdi-run-fast"; break; case "pregnant_women": var icon = "mdi mdi-human-pregnant"; break; case "children": var icon = "fa fa-child"; break; default: var icon = ""; } healthHeader += '
  • '; healthSection += `
    ${title}
    ${v}
    `; }); var html = ` `; return html; } function buildPollutant(array) { var pollutantHeader = ""; var pollutantSection = ""; $.each(array, function (i, v) { pollutantHeader += '
  • ' + v.display_name + '
    ' + v.concentration.value + " " + v.concentration.units + "
  • "; pollutantSection += `
    ${v.full_name}
    Sources
    ${v.sources_and_effects.sources}
    Effects
    ${v.sources_and_effects.effects}
    `; }); var html = ` `; return html; } function homepageWeatherAndAir(timeout) { var timeout = typeof timeout !== "undefined" ? timeout : activeInfo.settings.homepage.refresh.homepageWeatherAndAirRefresh; organizrAPI2("GET", "api/v2/homepage/weather/data") .success(function (data) { try { let response = data.response; if (response.data !== null) { document.getElementById("homepageOrderWeatherAndAir").innerHTML = ""; $("#homepageOrderWeatherAndAir").html( buildWeatherAndAir(response.data) ); } } catch (e) { organizrCatchError(e, data); } }) .fail(function (xhr) { OrganizrApiError(xhr); }); let timeoutTitle = "WeatherAndAir-Homepage"; if (typeof timeouts[timeoutTitle] !== "undefined") { clearTimeout(timeouts[timeoutTitle]); } timeouts[timeoutTitle] = setTimeout(function () { homepageWeatherAndAir(timeout); }, timeout); delete timeout; } function buildMonitorrItem(array) { var cards = ""; var options = array["options"]; var services = array["services"]; var tabName = ""; var buildCard = function (name, data) { if (data.status == true) { var statusColor = "success"; var imageText = "fa fa-check-circle text-success"; } else if (data.status == "unresponsive") { var statusColor = "warning animated-3 loop-animation flash"; var imageText = "fa fa-times-circle text-warning"; } else { var statusColor = "danger animated-3 loop-animation flash"; var imageText = "fa fa-times-circle text-danger"; } if (typeof data.link !== "undefined" && data.link.includes("#")) { tabName = data.link.substring(data.link.indexOf("#") + 1); console.log(tabName); // Need to rework tabActions monitorrLink = '"; } else if (typeof data.link !== "undefined") { monitorrLink = ''; } if (options["compact"]) { var card = ` `; } else { var card = ` `; } return card; }; for (var key in services) { cards += buildCard(key, services[key]); } return cards; } function buildMonitorr(array) { if (array === false) { return ""; } if (array.error != undefined) { organizrConsole("Monitorr Function", array.error, "error"); } else { var services = typeof array.services !== "undefined" ? Object.keys(array.services).length : false; var html = `
    `; if (array["options"]["titleToggle"]) { html += `

    ` + array["options"]["title"] + ` :

     ` + services + `

    `; } html += `
    ` + buildMonitorrItem(array) + `
    `; } return array ? html : ""; } function homepageMonitorr(timeout) { var timeout = typeof timeout !== "undefined" ? timeout : activeInfo.settings.homepage.refresh.homepagePiholeRefresh; organizrAPI2("GET", "api/v2/homepage/monitorr/data") .success(function (data) { try { let response = data.response; document.getElementById("homepageOrderMonitorr").innerHTML = ""; if (response.data !== null) { buildMonitorr(response.data); $("#homepageOrderMonitorr").html(buildMonitorr(response.data)); } } catch (e) { organizrCatchError(e, data); } }) .fail(function (xhr) { OrganizrApiError(xhr); }); let timeoutTitle = "Monitorr-Homepage"; if (typeof timeouts[timeoutTitle] !== "undefined") { clearTimeout(timeouts[timeoutTitle]); } timeouts[timeoutTitle] = setTimeout(function () { homepageMonitorr(timeout); }, timeout); delete timeout; } function buildUptimeKumaItem(array) { var cards = ""; var options = array["options"]; var services = array["data"]; var tabName = ""; var buildCard = function (name, data) { if (data.status == true) { var statusColor = "success"; var imageText = "fa fa-check-circle text-success"; } else { var statusColor = "danger animated-3 loop-animation flash"; var imageText = "fa fa-times-circle text-danger"; } tabName = data.name; kumaLink = '"; if (options["compact"]) { var card = ` `; } else { var card = ` `; } return card; }; for (var key in services) { cards += buildCard(key, services[key]); } return cards; } function buildUptimeKuma(array) { if (array === false) { return ""; } if (array.error != undefined) { organizrConsole("Uptime Kuma Function", array.error, "error"); } else { var html = `
    `; if (array["options"]["titleToggle"]) { html += `

    ` + array["options"]["title"] + ` :

    `; } html += `
    ` + buildUptimeKumaItem(array) + `
    `; } return array ? html : ""; } function homepageUptimeKuma(timeout) { var timeout = typeof timeout !== "undefined" ? timeout : activeInfo.settings.homepage.refresh.homepageUptimeKumaRefresh; organizrAPI2("GET", "api/v2/homepage/kuma/data") .success(function (data) { try { let response = data.response; document.getElementById("homepageOrderUptimeKuma").innerHTML = ""; if (response.data !== null) { buildUptimeKuma(response.data); $("#homepageOrderUptimeKuma").html(buildUptimeKuma(response.data)); } } catch (e) { console.log(e); organizrCatchError(e, data); } }) .fail(function (xhr) { OrganizrApiError(xhr); }); let timeoutTitle = "UptimeKuma-Homepage"; if (typeof timeouts[timeoutTitle] !== "undefined") { clearTimeout(timeouts[timeoutTitle]); } timeouts[timeoutTitle] = setTimeout(function () { homepageUptimeKuma(timeout); }, timeout); delete timeout; } function buildPromPageItem(array) { var cards = ""; var options = array["options"]; var services = array["data"]; var tabName = ""; console.log(options); var buildCard = function (name, data) { if (data.status == true) { var statusColor = "success"; var imageText = "fa fa-check-circle text-success"; } else { var statusColor = "danger animated-3 loop-animation flash"; var imageText = "fa fa-times-circle text-danger"; } tabName = data.name; if (options["compact"]) { var card = `
    `; card += `

     ` + data.name; if (data.uptime != null && options.showUptime) { card += `` + Math.round(data.uptime * 100) / 100 + `%

    `; } card += ``; card += `
    `; } else { var card = `
    `; card += `

    ` + data.name + `

    `; if (data.uptime != null && options.showUptime) { card += `

    ` + Math.round(data.uptime * 100) / 100 + `%

    `; } card += `

    `; if (data.status == true) { card += "UP"; } else { card += "DOWN"; } card += `

    `; card += `
    `; } return card; }; for (var key in services) { cards += buildCard(key, services[key]); } return cards; } function buildPromPage(array) { if (array === false) { return ""; } if (array.error != undefined) { organizrConsole("PromPage Function", array.error, "error"); } else { var html = `
    `; if (array["options"]["titleToggle"]) { html += `

    ` + array["options"]["title"] + ` :

    `; } html += `
    ` + buildPromPageItem(array) + `
    `; } return array ? html : ""; } function homepagePromPage(timeout) { var timeout = typeof timeout !== "undefined" ? timeout : activeInfo.settings.homepage.refresh.homepagePromPageRefresh; organizrAPI2("GET", "api/v2/homepage/prompage/data") .success(function (data) { try { let response = data.response; document.getElementById("homepageOrderPromPage").innerHTML = ""; if (response.data !== null) { buildUptimeKuma(response.data); $("#homepageOrderPromPage").html(buildPromPage(response.data)); } } catch (e) { console.log(e); organizrCatchError(e, data); } }) .fail(function (xhr) { OrganizrApiError(xhr); }); let timeoutTitle = "PromPage-Homepage"; if (typeof timeouts[timeoutTitle] !== "undefined") { clearTimeout(timeouts[timeoutTitle]); } timeouts[timeoutTitle] = setTimeout(function () { homepagePromPage(timeout); }, timeout); delete timeout; } function homepageSpeedtest(timeout) { var timeout = typeof timeout !== "undefined" ? timeout : activeInfo.settings.homepage.refresh.homepageSpeedtestRefresh; organizrAPI2("GET", "api/v2/homepage/speedtest/data") .success(function (data) { try { let response = data.response; document.getElementById("homepageOrderSpeedtest").innerHTML = ""; if (response.data !== null) { $("#homepageOrderSpeedtest").html(buildSpeedtest(response.data)); } } catch (e) { organizrCatchError(e, data); } }) .fail(function (xhr) { OrganizrApiError(xhr); }); let timeoutTitle = "Speedtest-Homepage"; if (typeof timeouts[timeoutTitle] !== "undefined") { clearTimeout(timeouts[timeoutTitle]); } timeouts[timeoutTitle] = setTimeout(function () { homepageSpeedtest(timeout); }, timeout); delete timeout; } function buildSpeedtest(array) { if (array === false) { return ""; } var html = ` `; var current = array.data.current; var average = array.data.average; var maximum = array.data.maximum; var minimum = array.data.minimum; var options = array.options; html += `
    `; if (options.titleToggle) { html += `

    ` + array["options"]["title"] + ` :

    `; } html += `

    Ping

    ` + parseFloat(current.ping).toFixed(1) + `

    ms (current)

    `; if (average != undefined) { html += `
    ` + parseFloat(average.ping).toFixed(1) + `

    ms (average)

    `; } if (maximum != undefined) { html += `
    ` + parseFloat(maximum.ping).toFixed(1) + `

    ms (maximum)

    `; } if (minimum != undefined) { html += `
    ` + parseFloat(minimum.ping).toFixed(1) + `

    ms (minimum)

    `; } html += `

    Download

    ` + parseFloat(current.download).toFixed(1) + `

    Mbit/s (current)

    `; if (average != undefined) { html += `
    ` + parseFloat(average.download).toFixed(1) + `

    Mbit/s (average)

    `; } if (maximum != undefined) { html += `
    ` + parseFloat(maximum.download).toFixed(1) + `

    Mbit/s (maximum)

    `; } if (minimum != undefined) { html += `
    ` + parseFloat(minimum.download).toFixed(1) + `

    Mbit/s (minimum)

    `; } html += `

    Upload

    ` + parseFloat(current.upload).toFixed(1) + `

    Mbit/s (current)

    `; if (average != undefined) { html += `
    ` + parseFloat(average.upload).toFixed(1) + `

    Mbit/s (average)

    `; } if (maximum != undefined) { html += `
    ` + parseFloat(maximum.upload).toFixed(1) + `

    Mbit/s (maximum)

    `; } if (minimum != undefined) { html += `
    ` + parseFloat(minimum.upload).toFixed(1) + `

    Mbit/s (minimum)

    `; } html += `
    `; return array ? html : ""; } function buildNetdataItem(array) { var html = ` `; var buildEasyPieChart = function (e, i, size, easySize, display) { return ( `
    ` + e.title + ` ` + parseFloat(e.value).toFixed(1) + ` ` + e.units + `
    ` ); }; var buildGaugeChart = function (e, i, size, easySize, display) { switch (size) { case "lg": easySize = 300; break; case "sm": easySize = 275; break; case "md": default: easySize = 250; break; } return ( `
    ` + e.title + ` ` + parseFloat(e.value).toFixed(1) + `
    ` ); }; array.forEach((e, i) => { var size = e.size; var easySize; if (size == "") { size = "md"; } switch (size) { case "lg": easySize = 180; break; case "sm": easySize = 140; break; case "md": default: easySize = 160; break; } var display = " "; if (e.lg) { display += " d-xl-inline-block d-lg-inline-block"; } else { display += " d-xl-none d-lg-none d-none"; } if (e.md) { display += " d-md-inline-block"; } else { display += " d-md-none d-none"; } if (e.sm) { display += " d-sm-inline-block d-xs-inline-block"; } else { display += " d-sm-none d-xs-none d-none"; } display += " "; if (e.error) { organizrConsole( "Netdata Function", "(Chart " + (i + 1) + "): " + e.error, "error" ); } else if (e.chart == "easypiechart") { html += buildEasyPieChart(e, i, size, easySize, display); } else if (e.chart == "gauge") { html += buildGaugeChart(e, i, size, easySize, display); } }); return html; } function buildNetdata(array) { var data = array.data; if (array === false) { return ""; } window.netdata = []; var html = ` `; html += `
    `; html += buildNetdataItem(data); html += `
    `; return array ? html : ""; } function homepageNetdata(timeout) { var timeout = typeof timeout !== "undefined" ? timeout : activeInfo.settings.homepage.refresh.homepageNetdataRefresh; organizrAPI2("GET", "api/v2/homepage/netdata/data") .success(function (data) { try { let response = data.response; if (!tryUpdateNetdata(response.data.data)) { document.getElementById("homepageOrderNetdata").innerHTML = ""; if (response.data !== null) { $("#homepageOrderNetdata").html(buildNetdata(response.data)); } } } catch (e) { organizrCatchError(e, data); } }) .fail(function (xhr) { OrganizrApiError(xhr); }); var timeoutTitle = "Netdata-Homepage"; if (typeof timeouts[timeoutTitle] !== "undefined") { clearTimeout(timeouts[timeoutTitle]); } timeouts[timeoutTitle] = setTimeout(function () { homepageNetdata(timeout); }, timeout); delete timeout; } function tryUpdateNetdata(array) { var existing = false; array.forEach((e, i) => { var id = i + 1; if (e.chart == "easypiechart") { if ($("#easyPieChart" + id).length) { $("#easyPieChart" + id) .data("easyPieChart") .update(e.percent); $("#easyPieChart" + id + "Value").html(parseFloat(e.value).toFixed(1)); existing = true; } } else if (e.chart == "gauge") { if (window.netdata) { if (window.netdata[i + 1]) { window.netdata[i + 1].set(e.percent); // set actual value $("#gaugeChart" + (i + 1) + "Value").html( parseFloat(e.value).toFixed(1) ); existing = true; } } else { existing = false; } } else { existing = false; } }); return existing; } function homepageJackett() { if (activeInfo.settings.homepage.options.alternateHomepageHeaders) { var header = `

      Jackett 

    `; } else { var header = `
      Jackett
    `; } let html = `
    ` + header + `

    Search

    `; $("#homepageOrderJackett").html(html); } function clearJackett() { $("#jackett-search-query").val(""); $(".clearJackett").parent().addClass("hidden"); $("#jackettDataTable").DataTable().destroy(); $(".jackettDataTable").addClass("hidden"); } function searchJackett() { let query = $("#jackett-search-query").val(); if (query !== "") { $(".jackettDataTable").removeClass("hidden"); //ajaxloader('#jackettSearch .panel-wrapper', 'in'); ajaxblocker(".jackett-panel .white-box", "in", "Searching..."); } else { return false; } $.fn.dataTable.ext.errMode = "none"; $("#jackettDataTable").DataTable().destroy(); let preferBlackholeDownload = activeInfo.settings.homepage.jackett.homepageJackettBackholeDownload; let jackettTable = $("#jackettDataTable") .on("error.dt", function (e, settings, techNote, message) { console.log("An error has been reported by DataTables: ", message); $("#jackettDataTable").DataTable().destroy(); ajaxblocker(".jackett-panel .white-box"); $(".clearJackett").parent().removeClass("hidden"); window.message( "Jackett Connection Error", "", activeInfo.settings.notifications.position, "#FFF", "error", "5000" ); }) .DataTable({ ajax: { url: "api/v2/homepage/jackett/" + query, dataSrc: function (json) { return json.response.data.content.Results; }, }, columns: [ { data: "PublishDate", render: function (data, type, row) { if (type === "display" || type === "filter") { var m = moment.tz(data, activeInfo.timezone); return moment.utc(m, "YYYY-MM-DD hh:mm[Z]").local().fromNow(); } return data; }, }, { data: "Tracker" }, { data: "Title", render: function (data, type, row) { if (row.Details !== null) { return ( '' + data + "" ); } else { return data; } }, }, { data: "Size", render: function (data, type, row) { if (type === "display" || type === "filter") { return humanFileSize(data, false); } return humanFileSize(data, false); }, }, { data: "Files" }, { data: "Grabs" }, { data: "Seeders" }, { data: "Peers" }, { data: "MagnetUri", render: function (data, type, row) { if (type === "display" || type === "filter") { if ( preferBlackholeDownload === true && row.BlackholeLink !== null ) { return ( "' ); } else if (data !== null) { return ( '' ); } else if (row.Details !== null) { return ( '' ); } else if (row.Guid !== null) { return ( '' ); } else if (row.Link !== null) { return ( '' ); } else { return "No Download Link"; } } return data; }, }, ], order: [[0, "desc"]], initComplete: function (settings, json) { //ajaxloader(); ajaxblocker(".jackett-panel .white-box"); $(".clearJackett").parent().removeClass("hidden"); }, }); } function jackettDownload(url) { let blackholeLink = url.substring(url.indexOf("/bh/")); var post = { url: blackholeLink, }; organizrAPI2("POST", "api/v2/homepage/jackett/download/", post, true) .success(function () { message( "Torrent downloaded", "", activeInfo.settings.notifications.position, "#FFF", "success", "5000" ); }) .fail(function (xhr) { OrganizrApiError(xhr, "Error downloading torrent"); }); } function homepageProwlarr() { if (activeInfo.settings.homepage.options.alternateHomepageHeaders) { var header = `

      Prowlarr 

    `; } else { var header = `
      Prowlarr
    `; } let html = `
    ` + header + `

    Search

    `; $("#homepageOrderProwlarr").html(html); } function clearProwlarr() { $("#prowlarr-search-query").val(""); $(".clearProwlarr").parent().addClass("hidden"); $("#prowlarrDataTable").DataTable().destroy(); $(".prowlarrDataTable").addClass("hidden"); } function searchProwlarr() { let query = $("#prowlarr-search-query").val(); if (query !== "") { $(".prowlarrDataTable").removeClass("hidden"); ajaxloader("#prowlarrSearch .panel-wrapper", "in"); } else { return false; } $.fn.dataTable.ext.errMode = "none"; $("#prowlarrDataTable").DataTable().destroy(); let preferBlackholeDownload = activeInfo.settings.homepage.prowlarr.homepageProwlarrBackholeDownload; let prowlarrTable = $("#prowlarrDataTable") .on("error.dt", function (e, settings, techNote, message) { console.log("An error has been reported by DataTables: ", message); }) .DataTable({ ajax: { url: "api/v2/homepage/prowlarr/" + query, dataSrc: function (json) { return json.response.data.content; }, }, columns: [ { data: "publishDate", render: function (data, type, row) { if (type === "display" || type === "filter") { var m = moment.tz(data, activeInfo.timezone); return moment.utc(m, "YYYY-MM-DD hh:mm[Z]").local().fromNow(); } return data; }, }, { data: "indexer" }, { data: "title", render: function (data, type, row) { if (row.Details !== null) { return ( '' + data + "" ); } else { return data; } }, }, { data: "size", render: function (data) { return humanFileSize(data, false); }, }, { data: "grabs" }, { data: "seeders" }, { data: "leechers" }, { data: "downloadUrl", render: function (data, type, row) { if (type === "display" || type === "filter") { if (data !== null) { if (preferBlackholeDownload === true && row.guid !== null) { return ( "' ); } else { return ( '' ); } } else { return "No Download Link"; } } return data; }, }, ], order: [[5, "desc"]], initComplete: function (settings, json) { ajaxloader(); //ajaxblocker('.prowlarr-panel .white-box'); $(".clearProwlarr").parent().removeClass("hidden"); }, }); } function prowlarrDownload(url) { const args = url.split(","); var post = { guid: args[0], indexerId: args[1], }; organizrAPI2("POST", "api/v2/homepage/prowlarr/download/", post, true) .success(function () { message( "Torrent downloaded", "", activeInfo.settings.notifications.position, "#FFF", "success", "5000" ); }) .fail(function (xhr) { OrganizrApiError(xhr, "Error downloading torrent"); }); } function homepageOctoprint(timeout) { var timeout = typeof timeout !== "undefined" ? timeout : activeInfo.settings.homepage.refresh.homepageOctoprintRefresh; organizrAPI2("GET", "api/v2/homepage/octoprint/data") .success(function (data) { try { let response = data.response; document.getElementById("homepageOrderOctoprint").innerHTML = ""; if (response.data !== null) { $("#homepageOrderOctoprint").html(buildOctoprint(response.data)); } } catch (e) { organizrCatchError(e, data); } }) .fail(function (xhr) { OrganizrApiError(xhr); }); let timeoutTitle = "Octoprint-Homepage"; if (typeof timeouts[timeoutTitle] !== "undefined") { clearTimeout(timeouts[timeoutTitle]); } timeouts[timeoutTitle] = setTimeout(function () { homepageOctoprint(timeout); }, timeout); delete timeout; } function buildOctoprint(array) { var menu = `"; if (activeInfo.settings.homepage.options.alternateHomepageHeaders) { var headerAlt = `

     

    ` + menu + `
    `; } else { var header = `

     

    ` + menu + `
    `; } content = "

    State: " + array.data.job.state + "

    "; if (array.data.job.state == "Printing") { content += "

    File: " + array.data.job.job.file.display + "

    "; content += "

    Progress: " + parseFloat(array.data.job.progress.completion).toFixed(0) + "%

    "; content += "

    Approx. Total Print Time: " + octoprintFormatTime(array.data.job.job.estimatedPrintTime) + "

    "; content += "

    Print Time Left: " + octoprintFormatTime(array.data.job.progress.printTimeLeft) + "

    "; } if (array.data.settings.webcam.webcamEnabled) { webcamUrl = array.data.settings.webcam.streamUrl; if (webcamUrl[0] == "/") { webcamUrl = array.data.url + webcamUrl; } } if (webcamUrl) { var webcamHtml = `
    `; } return ( css + `
    ` + headerAlt + `
    ` + header + `
    ` + content + `
    ` + webcamHtml + `
    ` ); } function octoprintFormatTime(seconds) { var format = ""; var days = Math.floor(moment.duration(seconds, "seconds").asDays()); var hours = Math.floor(moment.duration(seconds, "seconds").asHours()); var minutes = moment.duration(seconds, "seconds").minutes(); var seconds = moment.duration(seconds, "seconds").seconds(); if (days > 0) { format += days + " " + octoprintPluralize("day", days) + " "; } if (hours > 0) { format += hours + " " + octoprintPluralize("hour", hours) + " "; } if (minutes > 0) { format += minutes + " " + octoprintPluralize("minute", minutes) + " "; } if (seconds > 0) { format += seconds + " " + octoprintPluralize("second", seconds) + " "; } return format; } function octoprintPluralize(s, n) { if (n > 1) { return s + "s"; } return s; } function pad(n, width, z) { z = z || "0"; n = n + ""; return n.length >= width ? n : new Array(width - n.length + 1).join(z) + n; } // Thanks Swifty! function PopupCenter(url, title, w, h) { // Fixes dual-screen position Most browsers Firefox var dualScreenLeft = window.screenLeft != undefined ? window.screenLeft : window.screenX; var dualScreenTop = window.screenTop != undefined ? window.screenTop : window.screenY; var width = window.innerWidth ? window.innerWidth : document.documentElement.clientWidth ? document.documentElement.clientWidth : screen.width; var height = window.innerHeight ? window.innerHeight : document.documentElement.clientHeight ? document.documentElement.clientHeight : screen.height; var left = width / 2 - w / 2 + dualScreenLeft; var top = height / 2 - h / 2 + dualScreenTop; var newWindow = window.open( url, title, "scrollbars=yes, width=" + w + ", height=" + h + ", top=" + top + ", left=" + left ); // Puts focus on the newWindow if (window.focus) { newWindow.focus(); } return newWindow; } function getPlexHeaders() { let plexTitle = activeInfo.appearance.title == "" ? "Organizr" : cleanClass(activeInfo.appearance.title); return { Accept: "application/json", "X-Plex-Product": plexTitle, "X-Plex-Version": "2.0", "X-Plex-Client-Identifier": activeInfo.settings.misc.uuid, "X-Plex-Model": "Plex OAuth", "X-Plex-Platform": activeInfo.osName, "X-Plex-Platform-Version": activeInfo.osVersion, "X-Plex-Device": activeInfo.browserName, "X-Plex-Device-Name": activeInfo.browserVersion, "X-Plex-Device-Screen-Resolution": window.screen.width + "x" + window.screen.height, "X-Plex-Language": "en", }; } var plex_oauth_window = null; const plex_oauth_loader = "" + '"; function closePlexOAuthWindow() { if (plex_oauth_window) { plex_oauth_window.close(); } } getPlexOAuthPin = function () { var x_plex_headers = getPlexHeaders(); var deferred = $.Deferred(); $.ajax({ url: "https://plex.tv/api/v2/pins?strong=true", type: "POST", headers: x_plex_headers, success: function (data) { deferred.resolve({ pin: data.id, code: data.code }); }, error: function () { closePlexOAuthWindow(); deferred.reject(); }, }); return deferred; }; var polling = null; function PlexOAuth( successCallback, errorCallback, maxRetryCallback, pollingCallback, preFunction, clientID = null ) { if (typeof preFunction === "function") { preFunction(); } closePlexOAuthWindow(); plex_oauth_window = PopupCenter("", "Plex-OAuth", 600, 700); $(plex_oauth_window.document.body).html(plex_oauth_loader); getPlexOAuthPin().then( function (data) { var x_plex_headers = getPlexHeaders(); const pin = data.pin; const code = data.code; var oauth_params = { clientID: x_plex_headers["X-Plex-Client-Identifier"], "context[device][product]": x_plex_headers["X-Plex-Product"], "context[device][version]": x_plex_headers["X-Plex-Version"], "context[device][platform]": x_plex_headers["X-Plex-Platform"], "context[device][platformVersion]": x_plex_headers["X-Plex-Platform-Version"], "context[device][device]": x_plex_headers["X-Plex-Device"], "context[device][deviceName]": x_plex_headers["X-Plex-Device-Name"], "context[device][model]": x_plex_headers["X-Plex-Model"], "context[device][screenResolution]": x_plex_headers["X-Plex-Device-Screen-Resolution"], "context[device][layout]": "desktop", code: code, }; plex_oauth_window.location = "https://app.plex.tv/auth/#!?" + encodeData(oauth_params); polling = pin; let maxPollCount = 120; (function poll() { maxPollCount--; $.ajax({ url: "https://plex.tv/api/v2/pins/" + pin, type: "GET", headers: x_plex_headers, success: function (data) { if (data.authToken) { polling = null; closePlexOAuthWindow(); if (typeof successCallback === "function") { successCallback("plex", data.authToken, clientID); } } }, complete: function () { if (maxPollCount <= 0) { closePlexOAuthWindow(); if (typeof maxRetryCallback === "function") { maxRetryCallback(); } } else if (polling === pin) { setTimeout(function () { poll(); }, 1000); if (typeof pollingCallback === "function") { pollingCallback(maxPollCount); } } }, timeout: 1000, }); })(); }, function () { closePlexOAuthWindow(); if (typeof errorCallback === "function") { errorCallback(); } } ); } function openOAuth(provider) { // will actually fix this later closePlexOAuthWindow(); plex_oauth_window = PopupCenter("", "OAuth", 600, 700); $(plex_oauth_window.document.body).html(plex_oauth_loader); plex_oauth_window.location = "api/v2/oauth/trakt"; } function encodeData(data) { return Object.keys(data) .map(function (key) { return [key, data[key]].map(encodeURIComponent).join("="); }) .join("&"); } function oAuthSuccess(type, token, id = null) { switch (type) { case "plex": if (id) { $(id).val(token); $(id).change(); messageSingle( "", window.lang.translate("Grabbed Token - Please Save"), activeInfo.settings.notifications.position, "#FFF", "success", "5000" ); } else { $("#oAuth-Input").val(token); $("#oAuthType-Input").val(type); $("#login-username-Input").addClass("hidden"); $("#login-password-Input").addClass("hidden"); $("#oAuth-div").removeClass("hidden"); $(".login-button").first().trigger("click"); } break; default: break; } } function oAuthError() { messageSingle( "", window.lang.translate("Error Connecting to oAuth Provider"), activeInfo.settings.notifications.position, "#FFF", "error", "5000" ); } function oAuthMaxRetry() { messageSingle( "", window.lang.translate("Max Retry Error Connecting to oAuth Provider"), activeInfo.settings.notifications.position, "#FFF", "error", "5000" ); } function oAuthStart(type) { switch (type) { case "plex": PlexOAuth(oAuthSuccess, oAuthError, oAuthMaxRetry, null, null); break; default: break; } } function oidcStart(provider) { // Redirect in same window to OIDC provider window.location.href = "api/v2/oidc/" + encodeURIComponent(provider) + "/authorize"; } function testOIDCConnection(provider) { organizrAPI2( "GET", "api/v2/oidc/" + encodeURIComponent(provider) + "/test", "" ) .success(function (data) { if (data.response.result === "success") { messageSingle( "OIDC Test", data.response.message || "Connection successful", activeInfo.settings.notifications.position, "#FFF", "success", "5000" ); } else { messageSingle( "OIDC Test", data.response.message || "Connection failed", activeInfo.settings.notifications.position, "#FFF", "error", "5000" ); } }) .fail(function (xhr) { var msg = "Connection failed"; try { var resp = JSON.parse(xhr.responseText); msg = resp.response.message || msg; } catch (e) {} messageSingle( "OIDC Test", msg, activeInfo.settings.notifications.position, "#FFF", "error", "5000" ); }); } function clearAJAX(id = "all") { if (id == "all") { $.each(timeouts, function (i, v) { clearTimeout(timeouts[i]); }); } else if (id == "homepage") { $.each(timeouts, function (i, v) { if (i.indexOf("-Homepage") > 0) { clearTimeout(timeouts[i]); } }); } else { clearTimeout(timeouts[id]); } } //Generate API function generateCode() { var code = ""; var possible = "abcdefghijklmnopqrstuvwxyz0123456789"; for (var i = 0; i < 20; i++) code += possible.charAt(Math.floor(Math.random() * possible.length)); return code; } // uppercase word function toUpper(str) { return str .toLowerCase() .split(" ") .map(function (word) { return word[0].toUpperCase() + word.substr(1); }) .join(" "); } // human filesize function humanFileSize(bytes, si) { var thresh = si ? 1000 : 1024; if (Math.abs(bytes) < thresh) { return bytes + " B"; } var units = si ? ["kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"] : ["KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB"]; var u = -1; do { bytes /= thresh; ++u; } while (Math.abs(bytes) >= thresh && u < units.length - 1); return bytes.toFixed(1) + " " + units[u]; } //youtube search function youtubeSearch(searchQuery) { return $.ajax({ url: "api/v2/homepage/youtube/" + searchQuery, }); } function youtubeCheck(title, link) { youtubeSearch(title) .success(function (data) { var response = data.response; if (response.data) { inlineLoad(); var id = response.data.items["0"].id.videoId; var div = `
    `; $(".youtube-div").html(div); $("." + link).trigger("click"); player = new Plyr("#player-" + link); } }) .fail(function (xhr) { OrganizrApiError(xhr, "YouTube API Error"); // Fallback: open YouTube search in a new tab/window var q = ""; try { q = decodeURIComponent(title); } catch (e1) { try { q = unescape(title); } catch (e2) { q = title; } } var url = "https://www.youtube.com/results?search_query=" + encodeURIComponent(q + " trailer"); window.open(url, "_blank"); }); } function requestSearch(title, page = 1) { return $.ajax({ url: "https://api.themoviedb.org/3/search/multi?api_key=83cf4ee97bb728eeaf9d4a54e64356a1&language=" + activeInfo.language + "&query=" + title + "&page=" + page + "&include_adult=false", }); } function requestSearchList(list, page = 1) { var url = ""; switch (list) { case "top-movie": url = "https://api.themoviedb.org/3/movie/top_rated?api_key=83cf4ee97bb728eeaf9d4a54e64356a1&language=" + activeInfo.language + "®ion=US&page=" + page; break; case "pop-movie": url = "https://api.themoviedb.org/3/movie/popular?api_key=83cf4ee97bb728eeaf9d4a54e64356a1&language=" + activeInfo.language + "®ion=US&page=" + page; break; case "up-movie": url = "https://api.themoviedb.org/3/movie/upcoming?api_key=83cf4ee97bb728eeaf9d4a54e64356a1&language=" + activeInfo.language + "®ion=US&page=" + page; break; case "theatre-movie": url = "https://api.themoviedb.org/3/movie/now_playing?api_key=83cf4ee97bb728eeaf9d4a54e64356a1&language=" + activeInfo.language + "®ion=US&page=" + page; break; case "top-tv": url = "https://api.themoviedb.org/3/tv/top_rated?api_key=83cf4ee97bb728eeaf9d4a54e64356a1&language=" + activeInfo.language + "®ion=US&page=" + page; break; case "pop-tv": url = "https://api.themoviedb.org/3/tv/popular?api_key=83cf4ee97bb728eeaf9d4a54e64356a1&language=" + activeInfo.language + "®ion=US&page=" + page; break; case "today-tv": url = "https://api.themoviedb.org/3/tv/airing_today?api_key=83cf4ee97bb728eeaf9d4a54e64356a1&language=" + activeInfo.language + "®ion=US&page=" + page; break; case "org-mod": url = "https://api.themoviedb.org/4/list/64438?api_key=83cf4ee97bb728eeaf9d4a54e64356a1&language=" + activeInfo.language + "&page=" + page; break; default: } return $.ajax({ url: url, }); } function requestNewID(id) { return $.ajax({ url: "https://api.themoviedb.org/3/tv/" + id + "/external_ids?api_key=83cf4ee97bb728eeaf9d4a54e64356a1&language=en-US", }); } function getTmdbImages(id, type) { return $.ajax({ url: `https://api.themoviedb.org/3/${type}/${id}/images?api_key=83cf4ee97bb728eeaf9d4a54e64356a1`, }); } function inlineLoad() { $(".inline-popups").magnificPopup({ removalDelay: 500, //delay removal by X to allow out-animation closeOnBgClick: true, //closeOnContentClick: true, callbacks: { beforeOpen: function () { this.st.mainClass = this.st.el.attr("data-effect"); this.st.focus = "#request-input"; }, close: function () { if (typeof player !== "undefined") { player.destroy(); } }, }, midClick: true, // allow opening popup on middle mouse click. Always set it to true if you don't provide alternative source. }); } //Import Users function importUsers(type) { $(".importUsersButton").attr("disabled", true); messageSingle( "", window.lang.translate("Importing Users"), activeInfo.settings.notifications.position, "#FFF", "success", "5000" ); organizrAPI2("POST", "api/v2/users/import/" + type, { type: type }) .success(function (data) { try { var response = data.response; message( "User Import", response.message, activeInfo.settings.notifications.position, "#FFF", "success", "5000" ); $(".importUsersButton").attr("disabled", false); } catch (e) { organizrCatchError(e, data); } }) .fail(function (xhr) { OrganizrApiError(xhr, "Import Error"); }); } //Settings change auth function changeAuth() { var type = $("#authSelect").val(); var service = $("#authBackendSelect").val(); switch (service) { case "plex": $(".switchAuth").parent().parent().parent().hide(); $(".backendAuth").parent().parent().parent().show(); $(".plexAuth").parent().parent().parent().show(); break; case "emby_local": case "emby_connect": case "emby_all": $(".switchAuth").parent().parent().parent().hide(); $(".backendAuth").parent().parent().parent().show(); $(".embyAuth").parent().parent().parent().show(); break; case "jellyfin": $(".switchAuth").parent().parent().parent().hide(); $(".backendAuth").parent().parent().parent().show(); $(".jellyfinAuth").parent().parent().parent().show(); break; case "ftp": $(".switchAuth").parent().parent().parent().hide(); $(".backendAuth").parent().parent().parent().show(); $(".ftpAuth").parent().parent().parent().show(); break; case "ldap": $(".switchAuth").parent().parent().parent().hide(); $(".backendAuth").parent().parent().parent().show(); $(".ldapAuth").parent().parent().parent().show(); break; default: $(".switchAuth").parent().parent().parent().hide(); $(".backendAuth").parent().parent().parent().show(); } if (type == "internal") { $(".switchAuth").parent().parent().parent().hide(); } } function organizrSpecialSettings(array) { //media search if ( array.settings.homepage.search.enabled == true && typeof array.settings.homepage.search.type !== "undefined" ) { var htmlDOM = `
  • `; var searchBoxResults = `
    `; $(htmlDOM).prependTo(".navbar-right"); $(searchBoxResults).appendTo($(".organizr-area")); } } function checkLocalForwardStatus(array) { if ( array.settings.login.enableLocalAddressForward == true && typeof array.settings.login.enableLocalAddressForward !== "undefined" ) { if ( array.settings.login.wanDomain !== "" && array.settings.login.localAddress !== "" ) { organizrConsole("Organizr Function", "Local Login Enabled"); organizrConsole("Organizr Function", "Local Login Testing..."); let remoteSite = array.settings.login.wanDomain; let localSite = array.settings.login.localAddress; try { let currentURL = decodeURI(window.location.href); let currentSite = window.location.host; if ( activeInfo.settings.user.local && currentSite.indexOf(remoteSite) !== -1 && currentURL.indexOf("override") === -1 ) { organizrConsole( "Organizr Function", "Local Login Status: Local | Forwarding Now" ); window.location = localSite; } else { organizrConsole( "Organizr Function", "Local Login Status: Not Local or Override was set - Ignoring Forward Request" ); } } catch (e) { console.error(e); } } } } function forceSearch(term) { $.magnificPopup.close(); let tabInfo = findTab("api/v2/page/homepage", "access_url"); if (tabInformation[tabInfo.id]["loaded"]) { if (tabInformation[tabInfo.id]["active"]) { setTimeout(function () { $("#newRequestButton").trigger("click"); $("#request-input").val(term); doneTyping(); }, 500); } else { tabActions("click", tabInfo.id); setTimeout(function () { $("#newRequestButton").trigger("click"); $("#request-input").val(term); doneTyping(); }, 1000); } } else { tabActions("click", tabInfo.id); setTimeout(function () { $("#newRequestButton").trigger("click"); $("#request-input").val(term); doneTyping(); }, 3000); } } function splitPoster(str) { var words = str.split(" "); var newWord = ""; $.each(words, function (i, v) { newWord += v + "
    "; }); return newWord; } function buildMediaResults(array, source, term) { if (array.content.length == 0) { var none = '

    No Results for:

    ' + term + "

    "; none += activeInfo.settings.homepage.ombi.enabled == true || activeInfo.settings.homepage.overseerr.enabled == true ? `` : ""; return none; } var results = ""; var tv = 0; var movie = 0; var music = 0; var total = 0; $.each(array.content, function (i, v) { total = total + 1; tv = v.type == "tv" ? tv + 1 : tv; movie = v.type == "movie" ? movie + 1 : movie; music = v.type == "music" ? music + 1 : music; var bg = v.imageURL; var top = v.title; var bottom = v.metadata.originallyAvailableAt; results += `
    `; }); //requests setup? if ( activeInfo.settings.homepage.ombi.enabled == true || activeInfo.settings.homepage.overseerr.enabled == true ) { results += `

    ` + term + `

    Request Me!
    `; } var buttons = `
    `; results = '
    ' + results + "
    "; return buttons + results; } function getPingList(arrayItems) { var pingList = []; var timeout = activeInfo.user.groupID <= 1 ? activeInfo.settings.homepage.refresh.adminPingRefresh : activeInfo.settings.homepage.refresh.otherPingRefresh; if ( Array.isArray(arrayItems["data"]["tabs"]) && arrayItems["data"]["tabs"].length > 0 ) { $.each(arrayItems["data"]["tabs"], function (i, v) { if (v.ping && v.ping_url !== null) { pingList.push(v.ping_url); } }); } return pingList.length > 0 ? pingUpdate(pingList, timeout) : false; } function pingUpdateItem(ping) { if (activeInfo.user.groupID > activeInfo.settings.ping.auth) { return false; } organizrAPI2("GET", "api/v2/ping/" + ping) .success(function (data) { try { var response = data.response; } catch (e) { organizrCatchError(e, data); } var i = ping; var v = response.data; var elm = $(".menu-" + cleanClass(i) + "-ping"); var elmMs = $(".menu-" + cleanClass(i) + "-ping-ms"); var catElm = elm .parent() .parent() .parent() .parent() .children("a") .find(".menu-category-ping"); var error = '
    '; var success = ""; var badCount = 0; var goodCount = 0; var previousState = elm.attr("data-previous-state") == "" ? "" : elm.attr("data-previous-state"); var tabName = elm.attr("data-tab-name"); var status = v == null ? "down" : "up"; var ms = v == null ? "down" : v + "ms"; var sendMessage = previousState !== status && previousState !== "" && activeInfo.user.groupID <= activeInfo.settings.ping.authMessage ? true : false; var audioDown = sendMessage ? new Audio(activeInfo.settings.ping.offlineSound) : ""; var audioUp = sendMessage ? new Audio(activeInfo.settings.ping.onlineSound) : ""; elm.attr("data-previous-state", status); let listing = elm .parent() .parent() .parent() .parent() .children("a") .find(".menu-category-ping") .parent() .parent() .find("li") .find("div[class$='-ping']"); $.each(listing, function (i, v) { let state = $(v).attr("data-previous-state"); if (state == "up") { goodCount = goodCount + 1; } else if (state == "down") { badCount = badCount + 1; } }); if (catElm.length > 0) { catElm.attr("data-bad", badCount); catElm.attr("data-good", goodCount); if (badCount == 0) { catElm.html(success); } } if ( activeInfo.user.groupID <= activeInfo.settings.ping.authMs && activeInfo.settings.ping.ms ) { elmMs.removeClass("hidden").html(ms); } switch (status) { case "down": elm.html(error); catElm.html(error); elm.parent().find("img").addClass("grayscale"); var msg = sendMessage ? message( tabName, "Server Down", activeInfo.settings.notifications.position, "#FFF", "error", "600000" ) : ""; var audio = sendMessage && activeInfo.settings.ping.statusSounds ? audioDown.play() : ""; break; default: elm.html(success); elm.parent().find("img").removeClass("grayscale"); var msg = sendMessage ? message( tabName, "Server Back Online", activeInfo.settings.notifications.position, "#FFF", "success", "600000" ) : ""; var audio = sendMessage && activeInfo.settings.ping.statusSounds ? audioUp.play() : ""; } }) .fail(function (xhr) { OrganizrApiError(xhr); }); } function pingUpdate(pingList, timeout) { $.each(pingList, function (i, v) { pingUpdateItem(v); }); var timeoutTitle = "ping"; if (typeof timeouts[timeoutTitle] !== "undefined") { clearTimeout(timeouts[timeoutTitle]); } timeouts[timeoutTitle] = setTimeout(function () { pingUpdate(pingList, timeout); }, timeout); } function include(filename) { var type = filename.split(".").pop(); switch (type) { case "js": var body = document.getElementsByTagName("body")[0]; var script = document.createElement("script"); script.src = filename; script.type = "text/javascript"; body.appendChild(script); break; case "css": var head = document.getElementById("style"); var script = document.createElement("link"); script.href = filename; script.type = "text/css"; script.rel = "stylesheet"; head.appendChild(script); break; default: return false; } return false; } function defineNotification() { var bb = typeof activeInfo !== "undefined" ? activeInfo.settings.notifications.backbone : "izi"; switch (bb) { case "toastr": include("plugins/bower_components/toast-master/css/jquery.toast.css"); include("plugins/bower_components/toast-master/js/jquery.toast.js"); window.notificationFunction = "$.toast"; break; case "izi": include("plugins/bower_components/iziToast/css/iziToast.min.css"); include("plugins/bower_components/iziToast/js/iziToast.min.js"); window.notificationFunction = "iziToast"; break; case "alertify": include("plugins/bower_components/alertify/alertify.min.css"); include("plugins/bower_components/alertify/default.min.css"); include("plugins/bower_components/alertify/alertify.min.js"); window.notificationFunction = "alertify"; break; case "noty": include("plugins/bower_components/noty/noty.min.js"); include("plugins/bower_components/noty/mo.min.js"); include("plugins/bower_components/noty/noty.css"); include("plugins/bower_components/noty/mint.css"); window.notificationFunction = "Noty"; break; default: return false; } window.notificationsReady = true; } function messagePositions() { return { br: { toastr: "bottom-right", alertify: "bottom-right", izi: "bottomRight", noty: "bottomRight", }, bl: { toastr: "bottom-left", alertify: "bottom-left", izi: "bottomLeft", noty: "bottomLeft", }, bc: { toastr: "bottom-center", alertify: "bottom-center", izi: "bottomCenter", noty: "bottomCenter", }, tr: { toastr: "top-right", alertify: "top-right", izi: "topRight", noty: "topRight", }, tl: { toastr: "top-left", alertify: "top-left", izi: "topLeft", noty: "topLeft", }, tc: { toastr: "top-center", alertify: "top-center", izi: "topCenter", noty: "topCenter", }, c: { toastr: "center", alertify: "bottom-center", izi: "center", noty: "center", }, }; } function message( heading, text, position, color, icon, timeout, single = false ) { let bb = typeof activeInfo !== "undefined" ? activeInfo.settings.notifications.backbone : "izi"; let activePosition = typeof activeInfo !== "undefined" ? activeInfo.settings.notifications.position : "bc"; position = typeof position !== "undefined" ? position : activePosition; text = typeof text !== "undefined" ? text : ""; color = typeof color !== "undefined" ? color : "#FFF"; icon = typeof icon !== "undefined" ? icon : "info"; timeout = typeof timeout !== "undefined" ? timeout : 10000; switch (bb) { case "toastr": var ready = eval(notificationFunction) !== undefined ? true : false; break; case "izi": case "alertify": case "noty": try { var ready = typeof eval(notificationFunction) !== undefined ? true : false; } catch (e) { if (e instanceof SyntaxError) { setTimeout(function () { message(heading, text, position, color, icon, timeout, single); }, 100); } } break; default: var ready = false; } if (notificationsReady && ready) { oldPosition = position; position = messagePositions()[position][bb]; if (typeof activeInfo === "undefined") { setTimeout(function () { message(heading, text, oldPosition, color, icon, timeout, single); }, 100); return false; } if (single) { switch (bb) { case "toastr": $.toast().reset("all"); break; case "izi": iziToast.destroy(); break; case "alertify": alertify.dismissAll(); break; case "noty": Noty.closeAll(); break; default: return false; } } switch (bb) { case "toastr": $.toast({ heading: heading, text: text, position: position, loaderBg: color, icon: icon, hideAfter: timeout, stack: 6, showHideTransition: "slide", }); break; case "izi": switch (icon) { case "success": var msg = { icon: "mdi mdi-check-circle-outline", }; break; case "info": var msg = { icon: "mdi mdi-information-outline", }; break; case "error": var msg = { icon: "mdi mdi-close-circle-outline", }; break; case "warning": var msg = { icon: "mdi mdi-alert-circle-outline", }; break; case "update": var msg = { icon: "mdi mdi-webpack", }; break; default: var msg = { icon: "mdi mdi-alert-circle-outline", }; } iziToast.show({ close: true, progressBar: true, progressBarEasing: "ease", class: icon + "-notify", title: heading, message: text, position: position, timeout: timeout, layout: 2, transitionIn: "flipInX", transitionOut: "flipOutX", balloon: false, icon: msg["icon"], }); break; case "alertify": var msgFull = heading !== "" ? heading + "
    " + text : text; timeout = timeout / 1000; alertify.set("notifier", "position", position); alertify.notify(msgFull, icon + "-alertify", timeout); break; case "noty": if (typeof mojs == "undefined") { setTimeout(function () { message(heading, text, oldPosition, color, icon, timeout); }, 100); return false; } var msgFull = heading !== "" ? heading + "
    " + text : text; new Noty({ type: icon + "-noty", layout: position, text: msgFull, progressBar: true, timeout: timeout, animation: { open: function (promise) { var n = this; var Timeline = new mojs.Timeline(); var body = new mojs.Html({ el: n.barDom, x: { 500: 0, delay: 0, duration: 500, easing: "elastic.out" }, isForce3d: true, onComplete: function () { promise(function (resolve) { resolve(); }); }, }); var parent = new mojs.Shape({ parent: n.barDom, width: 200, height: n.barDom.getBoundingClientRect().height, radius: 0, x: { [150]: -150 }, duration: 1.2 * 500, isShowStart: true, }); n.barDom.style["overflow"] = "visible"; parent.el.style["overflow"] = "hidden"; var burst = new mojs.Burst({ parent: parent.el, count: 10, top: n.barDom.getBoundingClientRect().height + 75, degree: 90, radius: 75, angle: { [-90]: 40 }, children: { fill: "#EBD761", delay: "stagger(500, -50)", radius: "rand(8, 25)", direction: -1, isSwirl: true, }, }); var fadeBurst = new mojs.Burst({ parent: parent.el, count: 2, degree: 0, angle: 75, radius: { 0: 100 }, top: "90%", children: { fill: "#EBD761", pathScale: [0.65, 1], radius: "rand(12, 15)", direction: [-1, 1], delay: 0.8 * 500, isSwirl: true, }, }); Timeline.add(body, burst, fadeBurst, parent); Timeline.play(); }, close: function (promise) { var n = this; new mojs.Html({ el: n.barDom, x: { 0: 500, delay: 10, duration: 500, easing: "cubic.out" }, skewY: { 0: 10, delay: 10, duration: 500, easing: "cubic.out" }, isForce3d: true, onComplete: function () { promise(function (resolve) { resolve(); }); }, }).play(); }, }, }).show(); break; default: organizrConsole("Organizr Function", "Message case not setup"); } } else { setTimeout(function () { message(heading, text, position, color, icon, timeout, single); }, 100); } } function messageSingle(heading, text, position, color, icon, timeout) { let activePosition = typeof activeInfo !== "undefined" ? activeInfo.settings.notifications.position : "bc"; position = typeof position !== "undefined" ? position : activePosition; text = typeof text !== "undefined" ? text : ""; color = typeof color !== "undefined" ? color : "#FFF"; icon = typeof icon !== "undefined" ? icon : "info"; timeout = typeof timeout !== "undefined" ? timeout : 10000; message(heading, text, position, color, icon, timeout, true); } function blockDev(e) { var evtobj = window.event ? event : e; if (evtobj.keyCode == 73 && evtobj.shiftKey && evtobj.ctrlKey) { evtobj.preventDefault(); } } function authDebugCheck() { if (activeInfo.settings.misc.authDebug == true) { message( "REMINDER", "Auth Debug is still enabled", activeInfo.settings.notifications.position, "#FFF", "warning", "20000" ); } } function lock() { if (activeInfo.settings.user.oAuthLogin == true) { message( "Lock Disabled", "Lock function disabled if logged in via oAuth", activeInfo.settings.notifications.position, "#FFF", "warning", "5000" ); return false; } organizrAPI2("POST", "api/v2/users/lock", "") .success(function (data) { try { let html = data.response; location.reload(); } catch (e) { organizrCatchError(e, data); } }) .fail(function (xhr) { OrganizrApiError(xhr, "Lock Error"); }); } function openSettings() { let tabInfo = findTab("api/v2/page/settings", "access_url"); tabActions("click", tabInfo.id); } function openHomepage() { let tabInfo = findTab("api/v2/page/homepage", "access_url"); tabActions("click", tabInfo.id); } function toggleFullScreenIcon() { $(".fullscreen-icon") .toggleClass("ti-fullscreen") .toggleClass("mdi mdi-fullscreen-exit"); } function toggleFullScreen() { toggleFullScreenIcon(); if ( !document.fullscreenElement && // alternative standard method !document.mozFullScreenElement && !document.webkitFullscreenElement && !document.msFullscreenElement ) { // current working methods if (document.documentElement.requestFullscreen) { document.documentElement.requestFullscreen(); } else if (document.documentElement.msRequestFullscreen) { document.documentElement.msRequestFullscreen(); } else if (document.documentElement.mozRequestFullScreen) { document.documentElement.mozRequestFullScreen(); } else if (document.documentElement.webkitRequestFullscreen) { document.documentElement.webkitRequestFullscreen( Element.ALLOW_KEYBOARD_INPUT ); } } else { if (document.exitFullscreen) { document.exitFullscreen(); } else if (document.msExitFullscreen) { document.msExitFullscreen(); } else if (document.mozCancelFullScreen) { document.mozCancelFullScreen(); } else if (document.webkitExitFullscreen) { document.webkitExitFullscreen(); } } } function orgErrorCode(code) { switch (code) { case "upgrading": window.location.href = "./plugins/static/upgrade.html"; default: } } function clickPath(type, path = null) { switch (type) { case "c": case "custom": if (path !== null) { if (typeof path == "object") { $.each(path, function (i, v) { $(v).trigger("click"); }); } else { $(path).trigger("click"); } } else { return null; } break; case "update": $("#settings-main-system-settings-anchor").trigger("click"); $("#settings-settings-updates-anchor").trigger("click"); break; case "sso": $("#settings-main-system-settings-anchor").trigger("click"); $("#settings-settings-sso-anchor").trigger("click"); break; default: return null; } } function toggleWritableFolders() { $(".folders-writable").toggleClass("hidden"); } function getAllTabNames() { var allTabs = $(".tabEditor"); var tabList = []; $.each(allTabs, function (i, v) { tabList[i] = v.getAttribute("data-name").toLowerCase(); }); return tabList; } function checkIfTabNameExists(tabName) { if (getAllTabNames().indexOf(tabName.toLowerCase()) == -1) { return false; } else { return true; } } function getLatestBlackberryThemes() { return $.ajax({ url: "https://api.github.com/repos/Archmonger/Blackberry-Themes/contents/Themes", }); } function getBlackberryTheme(theme) { return $.ajax({ url: "https://api.github.com/repos/Archmonger/Blackberry-Themes/contents/Themes/" + theme + "/Icons", }); } function showBlackberryThemes(target) { getLatestBlackberryThemes() .success(function (data) { try { let themes = ""; $.each(data, function (i, v) { if (v.name !== "Beta") { themes += `${v.name}`; } }); themes = `
    ${themes}
    `; let html = `
    Choose a Theme
    ${themes}
    `; swal({ content: createElementFromHTML(html), button: "Close", className: "orgErrorAlert", dangerMode: true, }); } catch (e) { organizrCatchError(e, data); } }) .fail(function (xhr) { OrganizrApiError(xhr); }); } function selectBlackberryTheme(theme, target) { getBlackberryTheme(theme) .success(function (data) { try { let icons = ""; $.each(data, function (i, v) { v.name = v.name.split(".")[0]; v.name = cleanClass(v.name); icons += `${v.name}`; }); icons = ``; let html = `
    Choose an Icon
    ${icons}
    `; swal({ content: createElementFromHTML(html), buttons: { back: { text: "Back To Themes", value: "back", dangerMode: true, className: "bg-org-alt", }, }, className: "orgErrorAlert", dangerMode: true, }).then((value) => { switch (value) { case "back": showBlackberryThemes(); break; } }); } catch (e) { organizrCatchError(e, data); } }) .fail(function (xhr) { OrganizrApiError(xhr); }); } function orgErrorAlert(error) { let showError = false; if (typeof activeInfo === "undefined") { showError = true; } else { if (activeInfo.settings.misc.debugErrors) { showError = true; } } if (showError) { let div = `
    ERROR
    ${error}
    `; swal({ content: createElementFromHTML(div), button: "OK", className: "orgErrorAlert", dangerMode: true, }); } } function toggleDebug() { var div = `
    Organizr Information: 
    `; swal({ content: createElementFromHTML(div), button: "OK", className: "orgErrorAlert", }); getDebugPreInfo(); } function toggleCalendarFilter() { var div = `
    Filter Calendar
    `; swal({ content: createElementFromHTML(div), className: "bg-org", button: false, }); } function closeOrgError() { $("#main-org-error-container").removeClass("show"); $("#main-org-error").html(""); } function isJSON(data) { if (typeof data != "string") { data = JSON.stringify(data); } try { JSON.parse(data); return true; } catch (e) { return false; } } function createElementFromHTML(htmlString) { var div = document.createElement("div"); div.innerHTML = htmlString.trim(); return div.firstChild; } function addCoordinatesToInput(latitude, longitude) { $("#homepage-Weather-Air-form [name=homepageWeatherAndAirLatitude]") .val(latitude) .change(); $("#homepage-Weather-Air-form [name=homepageWeatherAndAirLongitude]") .val(longitude) .change(); swal.close(); message( "Coordinates Added", "Please Save", activeInfo.settings.notifications.position, "#FFF", "success", "10000" ); } function searchCoordinatesAPI(query) { messageSingle( "Submitting Query", "", activeInfo.settings.notifications.position, "#FFF", "info", "5000" ); organizrAPI2("POST", "api/v2/homepage/weather/coordinates", { query: query }) .success(function (data) { try { let html = data.response; if (html.data.type == "FeatureCollection") { var entries = ""; $.each(html.data.features, function (i, v) { entries += '
  • " + v.place_name + "
  • "; }); var div = `

    Select Place

      ` + entries + `
    `; if (entries !== "") { swal.close(); swal({ content: createElementFromHTML(div), buttons: false, className: "bg-org", }); } else { message( "API Error", "No results found...", activeInfo.settings.notifications.position, "#FFF", "warning", "10000" ); } } else { message( "API Error", "", activeInfo.settings.notifications.position, "#FFF", "warning", "10000" ); console.error("Organizr Function: API failed"); } } catch (e) { organizrCatchError(e, data); } }) .fail(function (xhr) { OrganizrApiError(xhr, "API Error"); }); } function showLookupCoordinatesModal() { var div = `

    Enter City or Address

    `; swal({ content: createElementFromHTML(div), buttons: false, className: "bg-org", }); } function showLDAPLoginTest() { var div = `

    LDAP User Info

    `; swal({ content: createElementFromHTML(div), buttons: false, className: "bg-org", }); } function showPlexTokenForm(selector = null) { var div = `

    Get Plex Token

    Enter Plex Details
    `; swal({ content: createElementFromHTML(div), buttons: false, className: "bg-org", }); } function getPlexToken(selector) { $(".plexTokenMessage").text("Grabbing Token"); $(".plexTokenHeader") .addClass("panel-info") .removeClass("panel-warning") .removeClass("panel-danger"); var plex_username = $("#get-plex-token-form [name=username]").val().trim(); var plex_password = $("#get-plex-token-form [name=password]").val().trim(); var plex_tfa = $("#get-plex-token-form [name=tfa]").val().trim(); if (plex_password !== "" && plex_password !== "") { $.ajax({ type: "POST", headers: { "X-Plex-Product": "Organizr", "X-Plex-Version": "2.0", "X-Plex-Client-Identifier": "01010101-10101010", }, url: "https://plex.tv/users/sign_in.json", data: { "user[login]": plex_username, "user[password]": plex_password + plex_tfa, force: true, }, cache: false, async: true, complete: function (xhr, status) { var result = $.parseJSON(xhr.responseText); if (xhr.status === 201) { $(".plexTokenMessage").text(xhr.statusText); $(".plexTokenHeader") .addClass("panel-success") .removeClass("panel-info") .removeClass("panel-warning") .removeClass("panel-danger"); $(selector).val(result.user.authToken); $(selector).change(); messageSingle( "Token created", "Please save...", activeInfo.settings.notifications.position, "#FFF", "success", "5000" ); } else { $(".plexTokenMessage").text(xhr.statusText); $(".plexTokenHeader") .addClass("panel-danger") .removeClass("panel-info") .removeClass("panel-warning"); } }, }); } else { $(".plexTokenMessage").text("Enter Username and Password"); $(".plexTokenHeader") .addClass("panel-warning") .removeClass("panel-info") .removeClass("panel-danger"); } } function showPlexMachineForm(selector = null) { var div = `

    Get Plex Machine

    Contacting server...
    `; swal({ content: createElementFromHTML(div), buttons: false, className: "bg-org", }).then( organizrAPI2("GET", "api/v2/plex/servers?owned") .success(function (data) { try { let response = data.response; $(".plexMachineMessage").text("Choose Plex Server"); $(".plexMachineHeader") .addClass("panel-success") .removeClass("panel-info") .removeClass("panel-warning"); let machines = ''; $.each(response.data, function (i, v) { let name = v.name; let machine = v.machineIdentifier; name = name + " [" + machine + "]"; machines += '"; }); let listing = '"; $(".plexMachineListing").html(listing); } catch (e) { organizrCatchError(e, data); } }) .fail(function (xhr) { OrganizrApiError(xhr, "API Error"); $(".plexMachineMessage").text("Plex Token Needed First"); $(".plexMachineHeader") .addClass("panel-warning") .removeClass("panel-info") .removeClass("panel-danger"); }) ); } function bypassLocalLogin() { if (activeInfo.settings.user.bypass !== true) { return false; } const bypass = $.urlParam("bypassDisable"); if (bypass) { return false; } OAuthLoginNeeded = true; oAuthLoginNeededCheck("Bypass"); } function oAuthLoginNeededCheck(type = "OAuth") { if (OAuthLoginNeeded == false) { return false; } else { if (activeInfo.user.loggedin == true) { return false; } } let data = ""; if (type === "Bypass") { const bypass = $.urlParam("bypassDisable"); if (bypass) { data = "bypass"; } } message( type, " Proceeding to login", activeInfo.settings.notifications.position, "#FFF", "info", "10000" ); organizrAPI2("POST", "api/v2/login", data) .success(function (data) { local("set", "message", "Welcome|Login Successful|success"); local("r", "loggingIn"); location.reload(); }) .fail(function (xhr) { $("div.login-box").unblock({}); switch (xhr.status) { case 401: if (xhr.responseJSON.response.message == "2FA Code incorrect") { $("div.login-box").unblock({}); $("#tfa-div").removeClass("hidden"); $("#loginform [name=tfaCode]").focus(); } break; case 403: $("div.login-box").block({ message: '
    Locked Out!
    ', css: { color: "#fff", border: "1px solid #e91e63", backgroundColor: "#f44336", }, }); setTimeout(function () { local("r", "loggingIn"); location.reload(); }, 10000); break; case 422: $("div.login-box").unblock({}); $("#tfa-div").removeClass("hidden"); $("#loginform [name=tfaCode]").focus(); break; default: message( "Login Error", "API Connection Failed", activeInfo.settings.notifications.position, "#FFF", "error", "10000" ); console.error("Organizr Function: API Connection Failed"); } message( "Login Error", xhr.responseJSON.response.message, activeInfo.settings.notifications.position, "#FFF", "warning", "10000" ); console.error("Organizr Function: " + xhr.responseJSON.response.message); local("r", "loggingIn"); }); } function ipInfoSpan(ip) { return '' + ip + ""; } function jsFriendlyJSONStringify(s) { return JSON.stringify(s) .replace("'", "") .replace(/\u2028/g, "\\u2028") .replace(/\u2029/g, "\\u2029"); } function exportLogs() { const query = "api/v2/log/0?filter=NONE&pageSize=1000&offset=0"; $.get(query, function (data) { const logs = data.response.data.results; let csvContent = "data:text/csv;charset=utf-8,Date,Severity,Function,Message,IP Address,User\n"; logs.forEach(function (log) { const row = [ log.datetime, log.log_level, log.channel, log.message, log.remote_ip_address, log.username, ].join(","); csvContent += row + "\n"; }); const encodedUri = encodeURI(csvContent); const link = document.createElement("a"); link.setAttribute("href", encodedUri); link.setAttribute("download", "organizr_logs.csv"); document.body.appendChild(link); link.click(); document.body.removeChild(link); }); } function logContext(row) { let buttons = ""; buttons += Object.keys(row).length > 0 ? '' : ""; buttons += Object.keys(row).length > 0 ? '' : ""; return buttons; } function formatLogDetails(details) { if (!details) { return false; } let m = moment.tz(details.datetime + "Z", activeInfo.timezone); details.datetime = moment(m).format("LLL"); let items = ""; items += `
  • ${details.datetime}Date
  • `; items += `
  • ${details.trace_id}Trace ID
  • `; items += `
  • ${details.username}User
  • `; items += `
  • ${details.channel}Function
  • `; items += `
  • ${details.file}#L${details.line}File
  • `; let items2 = ""; items2 += Object.keys(details.context).length > 0 ? `
    Context
    ${JSON.stringify(
              details.context,
              null,
              5
            )}
    ` : ""; items2 += typeof details.errors !== "undefined" ? `
    Errors
    ${JSON.stringify(
              details.errors,
              null,
              5
            )}
    ` : ""; var div = `
    Log Details ${logIcon( details.log_level, true )}

    ${details.message}

      ${items}
    ${items2}
    `; swal({ content: createElementFromHTML(div), buttons: false, className: "orgAlertTransparent", }); pageLoad(); } function checkToken(activate = false) { if (typeof activeInfo !== "undefined") { if (typeof activeInfo.settings.misc.uuid !== "undefined") { var token = getCookie("organizr_token_" + activeInfo.settings.misc.uuid); if (token) { setTimeout(function () { checkToken(true); }, 5000); } else { if (activate) { local( "set", "message", "Token Expired|You have been logged out|error" ); location.reload(); } } } } } function objDiff(obj1, obj2) { // Make sure an object to compare is provided if (!obj2 || Object.prototype.toString.call(obj2) !== "[object Object]") { return obj1; } // // Variables // var diffs = {}; var key; // // Methods // /** * Check if two arrays are equal * @param {Array} arr1 The first array * @param {Array} arr2 The second array * @return {Boolean} If true, both arrays are equal */ var arraysMatch = function (arr1, arr2) { // Check if the arrays are the same length if (arr1.length !== arr2.length) return false; // Check if all items exist and are in the same order for (var i = 0; i < arr1.length; i++) { if (arr1[i] !== arr2[i]) return false; } // Otherwise, return true return true; }; /** * Compare two items and push non-matches to object * @param {*} item1 The first item * @param {*} item2 The second item * @param {String} key The key in our object */ var compare = function (item1, item2, key) { // Get the object type var type1 = Object.prototype.toString.call(item1); var type2 = Object.prototype.toString.call(item2); // If type2 is undefined it has been removed if (type2 === "[object Undefined]") { diffs[key] = null; return; } // If items are different types if (type1 !== type2) { diffs[key] = item2; return; } // If an object, compare recursively if (type1 === "[object Object]") { var objDifference = objDiff(item1, item2); if (Object.keys(objDifference).length > 1) { diffs[key] = objDifference; } return; } // If an array, compare if (type1 === "[object Array]") { if (!arraysMatch(item1, item2)) { diffs[key] = item2; } return; } // Else if it's a function, convert to a string and compare // Otherwise, just compare if (type1 === "[object Function]") { if (item1.toString() !== item2.toString()) { diffs[key] = item2; } } else { if (item1 !== item2) { diffs[key] = item2; } } }; // // Compare our objects // // Loop through the first object for (key in obj1) { if (obj1.hasOwnProperty(key)) { compare(obj1[key], obj2[key], key); } } // Loop through the second object and find missing items for (key in obj2) { if (obj2.hasOwnProperty(key)) { if (!obj1[key] && obj1[key] !== obj2[key]) { diffs[key] = obj2[key]; } } } // Return the object of differences return diffs; } function organizrConsole(subject, msg, type = "info") { let color; switch (type) { case "error": color = "#ed2e72"; break; case "warning": color = "#272361"; break; default: color = "#2cabe3"; break; } console.info( "%c " + subject + " %c ".concat(msg, " "), "color: white; background: " + color + "; font-weight: 700;", "color: " + color + "; background: white; font-weight: 700;" ); } function organizrCatchError(e, data) { organizrConsole("Organizr API Function", data, "warning"); orgErrorAlert( "

    " + e + '

    Trace Log has been outputted to Browser Console

    Output of last API call
    ' + formatDebug(data) ); console.trace(); return false; } function OrganizrApiError(xhr, secondaryMessage = null) { let msg = ""; if (typeof xhr.responseJSON !== "undefined") { msg = xhr.responseJSON.response.message; } else if (typeof xhr.statusText !== "undefined") { msg = xhr.statusText; } else if (typeof xhr.responseText !== "undefined") { msg = xhr.responseText; } else { msg = "Connection Error"; } organizrConsole("Organizr API Function", msg, "error"); if (msg !== "abort") { if (secondaryMessage) { messageSingle( secondaryMessage, msg, activeInfo.settings.notifications.position, "#FFF", "error", "10000" ); } console.trace(); } return false; } function checkForUpdates() { if ( activeInfo.user.loggedin && activeInfo.user.groupID <= 1 && activeInfo.settings.misc.checkForUpdate ) { updateCheck(); checkCommitLoad(); checkPluginUpdates(); } } function loadJavascript(script = null, defer = false) { if (script) { organizrConsole("JS Loader", script); organizrConsole("JS Loader", "Checking if script is loaded..."); let loaded = $('script[src="' + script + '"]').length; if (!loaded) { organizrConsole("JS Loader", "Script is NOT loaded... Loading now..."); let head = document.getElementsByTagName("head")[0]; let scriptEl = document.createElement("script"); scriptEl.type = "text/javascript"; scriptEl.src = script; scriptEl.defer = false; head.appendChild(scriptEl); } else { organizrConsole("JS Loader", "Script already loaded"); } } } function tabShit() {} function msToTime(s) { let pad = (n, z = 2) => ("00" + n).slice(-z); let hours = pad((s / 3.6e6) | 0) !== "00" ? pad((s / 3.6e6) | 0) + ":" : ""; let mins = pad(((s % 3.6e6) / 6e4) | 0) + ":"; let secs = pad(((s % 6e4) / 1000) | 0); let ms = pad(s % 1000, 3); if (ms >= "500") { secs = pad(parseFloat(secs) + 1, 2); } return hours + mins + secs; } function clickSettingsTab() { let tabs = $(".allTabsList"); $.each(tabs, function (i, v) { let tab = $(v); if (tab.attr("data-url") == "api/v2/page/settings") { tab.find("a").trigger("click"); } }); } function clickMenuItem(selector) { if ($(selector).length >= 1) { $(selector).click(); } else { $("body").arrive(selector, { onceOnly: true }, function () { $(selector).click(); }); } } function shortcut(selectors = "") { let timeout = 200; if (typeof selectors == "string") { if (selectors == "") { selectors = []; } else { switch (selectors) { case "log-settings": clickSettingsTab(); selectors = [ "#settings-main-system-settings-anchor", "#settings-settings-main-anchor", 'a[href$="Logs"]', ]; break; case "plugin-marketplace": clickSettingsTab(); selectors = [ "#settings-main-plugins-anchor", "#settings-plugins-marketplace-anchor", ]; break; case "custom-cert": clickSettingsTab(); selectors = [ "#settings-main-system-settings-anchor", "#settings-settings-main-anchor", 'a[href$="Certificate"]', ]; break; default: clickSettingsTab(); selectors = ["#settings-main-system-settings-anchor"]; } } } selectors.forEach(function (selector) { timeout = timeout + 200; setTimeout(function () { clickMenuItem(selector); }, timeout); }); } function getJournalMode() { organizrAPI2("GET", "api/v2/database/journal") .success(function (data) { try { let response = data.response; $(".journal-mode").html(response.data.journal_mode); } catch (e) { organizrCatchError(e, data); } }) .fail(function (xhr) { OrganizrApiError(xhr); }); } function setJournalMode(mode) { messageSingle( "Setting New Journal Mode", "", activeInfo.settings.notifications.position, "#FFF", "info", "1500" ); organizrAPI2("PUT", "api/v2/database/journal/" + mode, {}) .success(function (data) { try { getJournalMode(); let response = data.response; message( "Set New Journal Mode", response.data.journal_mode, activeInfo.settings.notifications.position, "#FFF", "success", "5000" ); } catch (e) { organizrCatchError(e, data); } }) .fail(function (xhr) { OrganizrApiError(xhr); }); } function toggleSideMenuClasses() { $("#page-wrapper").toggleClass("sidebar-hidden"); $(".sidebar").toggleClass("sidebar-hidden"); $(".navbar").toggleClass("sidebar-hidden"); } function sideMenuCollapsed() { if (activeInfo.settings.misc.sideMenuCollapsed) { toggleSideMenuClasses(); } } function toggleSideMenu() { toggleSideMenuClasses(); $(".sidebar-head .open-close i") .first() .toggleClass("ti-menu ti-shift-left mouse"); $(".toggle-side-menu").toggleClass("hidden"); } function toggleTopBarHamburger() { toggleSideMenuClasses(); $(".sidebar-head .hide-menu.hidden-xs").text("Hide Menu"); $(".sidebar-head .open-close i") .first() .toggleClass("ti-menu ti-shift-left mouse"); $(".toggle-side-menu").toggleClass("hidden"); } function toggleLogFilter(filter = "INFO") { //choose-organizr-log filter = filter.toUpperCase(); $.each($(".choose-organizr-log").children(), function (i, v) { let url = $(v).val(); let newURL = updateUrlParameter(url, "filter", filter); $(v).val(newURL); }); $(".log-filter-text").text(filter); $(".log-filter-text").text(filter); let currentURL = organizrLogTable.ajax.url(); let updatedURL = updateUrlParameter(currentURL, "filter", filter); organizrLogTable.ajax.url(updatedURL); organizrLogTable.clear().draw().ajax.reload(null, false); } function updateUrlParameter(uri, key, value) { // remove the hash part before operating on the uri var i = uri.indexOf("#"); var hash = i === -1 ? "" : uri.substr(i); uri = i === -1 ? uri : uri.substr(0, i); var re = new RegExp("([?&])" + key + "=.*?(&|$)", "i"); var separator = uri.indexOf("?") !== -1 ? "&" : "?"; if (value === null) { // remove key-value pair if value is specifically null uri = uri.replace(new RegExp("([?&]?)" + key + "=[^&]*", "i"), ""); if (uri.slice(-1) === "?") { uri = uri.slice(0, -1); } // replace first occurrence of & by ? if no ? is present if (uri.indexOf("?") === -1) uri = uri.replace(/&/, "?"); } else if (uri.match(re)) { uri = uri.replace(re, "$1" + key + "=" + value + "$2"); } else { uri = uri + separator + key + "=" + value; } return uri + hash; } function launch() { console.info( "https://docs.organizr.app/help/faq/migration-guide#version-2-0-greater-than-version-2-1" ); organizrConsole( "API V2 API", "If you see a 404 Error for api/v2/launch below this line, you have not setup the new location block... See URL above this line", "error" ); organizrConnect("api/v2/launch") .success(function (data) { try { let json = data.response; if (json.data.user == false) { location.reload(); } currentVersion = json.data.version; activeInfo = { tabs: json.data.tabs, categories: json.data.categories, timezone: Intl.DateTimeFormat().resolvedOptions().timeZone, offest: new Date().getTimezoneOffset(), language: language(moment.locale(navigator.languages[0])), browserVersion: bowser.name, browserName: bowser.version, mobile: bowser.mobile, tablet: bowser.tablet, osName: bowser.osname, osVersion: bowser.osversion, serverOS: json.data.status.os, phpVersion: json.data.status.php, token: json.data.user.token, user: json.data.user, plugins: json.data.plugins, branch: json.data.branch, sso: json.data.sso, settings: json.data.settings, appearance: json.data.appearance, theme: json.data.theme, style: json.data.style, version: json.data.version, }; // Add element to signal activeInfo Ready $("#wrapper").after('
    '); console.info( "%c Organizr %c ".concat(currentVersion, " "), "color: white; background: #66D9EF; font-weight: 700; font-size: 24px; font-family: Monospace;", "color: #66D9EF; background: white; font-weight: 700; font-size: 24px; font-family: Monospace;" ); console.info( "%c Status %c ".concat("Starting Up...", " "), "color: white; background: #F92671; font-weight: 700;", "color: #F92671; background: white; font-weight: 700;" ); //local('set','initial',true); //setTimeout(function(){ local('r','initial'); }, 300); defineNotification(); checkMessage(); errorPage(); uriRedirect(); changeStyle(activeInfo.style); //changeTheme(activeInfo.theme); setSSO(); checkToken(); switch (json.data.status.status) { case "wizard": buildWizard(); buildLanguage("wizard"); break; case "dependencies": buildDependencyCheck(json); break; case "ok": loadAppearance(json.data.appearance); sideMenuCollapsed(); if (activeInfo.user.locked == 1) { buildLockscreen(); } else { userMenu(json); categoryProcess(json); tabProcess(json); buildSplashScreen(json); accountManager(json); organizrSpecialSettings(json.data); getPingList(json); checkLocalForwardStatus(json.data); checkForUpdates(); } loadCustomJava(json.data.appearance); if (getCookie("lockout")) { $(".show-login").click(); setTimeout(function () { $("div.login-box").block({ message: '
    Locked Out!
    ', css: { color: "#fff", border: "1px solid #e91e63", backgroundColor: "#f44336", }, }); }, 1000); setTimeout(function () { location.reload(); }, 60000); } break; default: console.error("Organizr Function: Action not set or defined"); } console.info( "%c Organizr %c ".concat("DOM Fully loaded", " "), "color: white; background: #AD80FD; font-weight: 700;", "color: #AD80FD; background: white; font-weight: 700;" ); oAuthLoginNeededCheck(); bypassLocalLogin(); } catch (e) { orgErrorCode(data); defineNotification(); message("FATAL ERROR", data, "br", "#FFF", "error", "60000"); console.warn(data); console.warn(e); return false; } }) .fail(function (xhr) { defineNotification(); if (xhr.status == 404) { orgErrorAlert( '

    Webserver not setup for Organizr v2.1

    Please goto Migration guide to complete the changes...

    Webserver Error:

    ' + xhr.responseText ); message( "FATAL ERROR", "You need to update webserver location block... check browser console for migration URL", "br", "#FFF", "error", "60000" ); } else { orgErrorAlert("

    Webserver Error:

    " + xhr.responseText); } }); } function homepageBookmarks(timeout) { var timeout = typeof timeout !== "undefined" ? timeout : activeInfo.settings.homepage.refresh.homepageBookmarksRefresh; organizrAPI2("GET", "api/v2/plugins/bookmark/page") .success(function (data) { try { let response = data.response; document.getElementById("homepageOrderBookmarks").innerHTML = ""; if (response.data !== null) { $("#homepageOrderBookmarks").html(buildBookmarks(response.data)); } } catch (e) { organizrCatchError(e, data); } }) .fail(function (xhr) { OrganizrApiError(xhr); }); let timeoutTitle = "Bookmarks-Homepage"; if (typeof timeouts[timeoutTitle] !== "undefined") { clearTimeout(timeouts[timeoutTitle]); } timeouts[timeoutTitle] = setTimeout(function () { homepageBookmarks(timeout); }, timeout); delete timeout; } function buildBookmarks(data) { var returnData = data; return returnData; }