// 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'; }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; } 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) + ''; break; case 'input': case 'text': return smallLabel+''; break; case 'number': return smallLabel+''; break; case 'textbox': return smallLabel+''; break; case 'password': return smallLabel+pwgMgr+''; break; case 'password-alt': return smallLabel+'
'+pwgMgr+'
'; break; case 'password-alt-copy': return smallLabel+'
'+pwgMgr+'
'; break; case 'hidden': return ''; break; case 'select': return smallLabel+''; break; case 'select2': var select2ID = (item.id) ? '#'+item.id : '.'+item.name; let settings = (item.settings) ? item.settings : '{}'; return smallLabel+''; break; case 'switch': case 'checkbox': return smallLabel+''; break; case 'button': return smallLabel+''; break; case 'blank': return ''; break; case 'accordion': return '
'+accordionOptions(item.options, item.id)+'
'; break; case 'html': return item.html; break; case 'arrayMultiple': return 'BuildFormItem Class not setup...'; break; case 'cron': return `${smallLabel}
`; break; 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{ $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 = /\[[^\]]*\]/mg; 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, }); break; 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)); break; case 'switch': case 's': return (result == "0") ? ('off') : ((result == "1") ? ('on') : (string)); break; case 'checkbox': case 'c': return (result == "0") ? ('') : ((result == "1") ? ('checked') : (string)); break; case 'integer': case 'number': case 'i': case 'n': return (result == "0") ? (0) : ((result == "1") ? (1) : (string)); break; case 'question': case 'q': return (result == "0") ? ('yes') : ((result == "1") ? ('no') : (string)); break; case 'string': return string.toString(); break; 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   '+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) { 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(); 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

    `; 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['dns_queries_today'].toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","); } card += `

    `+value+`

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

    Queries Blocked

    `; 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['ads_blocked_today'].toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","); } card += `

    `+value+`

    `; } } 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})

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

    `+value+`

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

    Domains on Blocklist

    `; 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['domains_being_blocked'].toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",") } 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 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(success, error, pre, id = null) { if (typeof pre === "function") { pre() } 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; (function poll() { $.ajax({ url: 'https://plex.tv/api/v2/pins/' + pin, type: 'GET', headers: x_plex_headers, success: function (data) { if (data.authToken){ closePlexOAuthWindow(); if (typeof success === "function") { success('plex',data.authToken, id) } } }, error: function (jqXHR, textStatus, errorThrown) { if (textStatus !== "timeout") { closePlexOAuthWindow(); if (typeof error === "function") { error() } } }, complete: function () { if (!plex_oauth_window.closed && polling === pin){ setTimeout(function() {poll()}, 1000); } }, timeout: 10000 }); })(); }, function () { closePlexOAuthWindow(); if (typeof error === "function") { error() } }); } 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 oAuthStart(type){ switch(type){ case 'plex': PlexOAuth(oAuthSuccess,oAuthError); break; default: break; } } 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'); }); } //request search 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: [.65, 1], radius: 'rand(12, 15)', direction: [-1, 1], delay: .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 oAuthLoginNeededCheck() { if(OAuthLoginNeeded == false){ return false; }else{ if(activeInfo.user.loggedin == true){ return false; } } message('OAuth', ' Proceeding to login', activeInfo.settings.notifications.position, '#FFF', 'info', '10000'); organizrAPI2('POST', 'api/v2/login', '').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 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(); } 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; }