// Create language switcher instance var lang = new Lang(); loadLanguageList(); lang.init({ defaultLang: 'en', currentLang: language(moment.locale(navigator.languages[0])), cookie: { name: 'organizrLanguage', expiry: 365, path: '/' }, allowCookieOverride: true }); var timeouts = {}; // Start Organizr $(document).ready(function () { launch(); }); /* NORMAL FUNCTIONS */ 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(){ var languages = languageList(); $.each(languages, function(i,v) { lang.dynamic(i, 'js/langpack/'+i+'.json'); }); lang.dynamic('strings', 'js/langpack/strings.json'); } function languageList(){ return { 'en':{ 'lang':'English', 'image':'plugins/images/languages/en.png' }, 'nb':{ 'lang':'Bokmål', 'image':'plugins/images/languages/nb.png' }, 'nl':{ 'lang':'Dutch', 'image':'plugins/images/languages/nl.png' }, 'fr':{ 'lang':'French', 'image':'plugins/images/languages/fr.png' }, 'de':{ 'lang':'German', 'image':'plugins/images/languages/de.png' }, 'de-ch':{ 'lang':'German (Switzerland)', 'image':'plugins/images/languages/de-ch.png' }, 'it':{ 'lang':'Italian', 'image':'plugins/images/languages/it.png' } }; } 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 timerIncrement() { //check for cookieExpiry if(hasCookie){ if(getCookie('organizrToken')){ //do nothing }else{ location.reload(); } } idleTime = idleTime + 1; if(activeInfo.settings.lockout.enabled){ 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 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(tabName,tabType){ if(getHash() === false){ if(tabName !== null && tabType !== null){ switchTab(tabName,tabType); }else{ $('#side-menu').children().first().children().click() } }else{ var hashTab = getHash(); var hashType = getTabType(hashTab); if (typeof hashTab !== 'undefined' && typeof hashType !== 'undefined') { switchTab(hashTab,hashType); }else{ console.warn("Tab Function: "+hashTab+" is not a defined tab"); } } } function getTabType(tabName){ var tabType = $('#menu-'+tabName); if (typeof tabType !== 'undefined') { return tabType.attr('type'); }else{ return false; } } function getHash(){ if ($(location).attr('hash')){ return $(location).attr('hash').substr(1); } return false; } function setHash(hash){ window.location.hash = '#'+hash; } function getQueryVariable(variable){ var query = window.location.search.substring(1); console.log(query); var vars = query.split("&"); console.log(vars); for (var i=0;i'; }else{ return 'tabIcon'; } }else{ return 'tabIcon'; } } function cleanClass(string){ return string.replace(/ +/g, "-").replace(/\W+/g, "-"); } function noTabs(arrayItems){ if (arrayItems.data.user.loggedin === true) { organizrConnect('api/?v1/no_tabs').success(function(data) { var json = JSON.parse(data); console.log("Organizr Function: No Tabs Available"); $(json.data).appendTo($('.organizr-area')); }).fail(function(xhr) { console.error("Organizr Function: API Connection Failed"); }); }else { $('.show-login').trigger('click'); } } function formatImage (icon) { if (!icon.id || icon.text == 'Select or type Icon') { 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'); organizrAPI('GET','api/?v1/logout').success(function(data) { var html = JSON.parse(data); if(html.data == true){ location.reload(); }else{ message('Logout Error',' An Error Occured',activeInfo.settings.notifications.position,'#FFF','warning','10000'); console.error('Organizr Function: Logout failed'); } }).fail(function(xhr) { console.error("Organizr Function: Logout Failed"); }); } function reloadOrganizr(){ location.reload(); } function hideFrames(){ $(".iFrame-listing div[class^='frame-container']").addClass("hidden").removeClass('show'); $(".internal-listing div[class^='internal-container']").addClass("hidden").removeClass('show'); } function closeSideMenu(){ $('.fix-header').removeClass('show-sidebar'); } function removeMenuActive(){ $("#side-menu a").removeClass('active'); } function swapDisplay(type){ switch (type) { case 'internal': $('body').removeClass('fix-header'); $('.iFrame-listing').addClass('hidden').removeClass('show'); $('.internal-listing').addClass('show').removeClass('hidden'); $('.login-area').addClass('hidden').removeClass('show'); //$('body').removeClass('fix-header'); break; case 'iframe': $('body').addClass('fix-header'); $('.iFrame-listing').addClass('show').removeClass('hidden'); $('.internal-listing').addClass('hidden').removeClass('show'); $('.login-area').addClass('hidden').removeClass('show'); //$('body').addClass('fix-header'); break; case 'login': $('body').removeClass('fix-header'); $('.iFrame-listing').addClass('hidden').removeClass('show'); $('.internal-listing').addClass('hidden').removeClass('show'); $('.login-area').addClass('show').removeClass('hidden'); if(activeInfo.settings.misc.minimalLoginScreen == true){ $('.sidebar').addClass('hidden'); $('.navbar').addClass('hidden'); $('#pagewrapper').addClass('hidden'); } break; default: } } function toggleParentActive(tab){ var childTab = $('#menu-'+tab); if(childTab.parent().hasClass('nav-second-level')){ if(!childTab.parent().hasClass('in')){ childTab.parent().addClass('collapse in'); childTab.parent().parent().addClass('active'); } } } function swapBodyClass(tab){ var prior = $('body').attr('data-active-tab'); if(prior !== ''){ $('body').removeClass('active-tab-'+prior); } $('body').attr('data-active-tab', tab); $('body').addClass('active-tab-'+tab); } function switchTab(tab, type){ if(type !== 2){ hideFrames(); closeSideMenu(); removeMenuActive(); toggleParentActive(tab); setHash(tab); swapBodyClass(tab); } switch (type) { case 0: case '0': case 'internal': swapDisplay('internal'); var newTab = $('#internal-'+tab); var tabURL = newTab.attr('data-url'); $('#menu-'+cleanClass(tab)).find('a').addClass("active"); if(newTab.hasClass('loaded')){ console.log('Tab Function: Switching to tab: '+tab); newTab.addClass("show").removeClass('hidden'); }else{ $("#preloader").fadeIn(); console.log('Tab Function: Loading new tab for: '+tab); $('#menu-'+tab+' a').children().addClass('tabLoaded'); newTab.addClass("show loaded").removeClass('hidden'); loadInternal(tabURL,cleanClass(tab)); $("#preloader").fadeOut(); } break; case 1: case '1': case 'iframe': swapDisplay('iframe'); var newTab = $('#container-'+tab); var tabURL = newTab.attr('data-url'); $('#menu-'+cleanClass(tab)).find('a').addClass("active"); if(newTab.hasClass('loaded')){ console.log('Tab Function: Switching to tab: '+tab); newTab.addClass("show").removeClass('hidden'); }else{ $("#preloader").fadeIn(); console.log('Tab Function: Loading new tab for: '+tab); $('#menu-'+tab+' a').children().addClass('tabLoaded'); newTab.addClass("show loaded").removeClass('hidden'); $(buildFrame(tab,tabURL)).appendTo(newTab); $("#preloader").fadeOut(); } break; case 2: case 3: case '2': case '3': case '_blank': case 'popout': popTab(cleanClass(tab), type); break; default: console.error('Tab Function: Action not set'); } } function popTab(tab, type){ switch (type) { case 0: case '0': case 'internal': console.warn('Tab Function: New window not supported for tab: '+tab); break; case 1: case '1': case 'iframe': case 2: case 3: case '2': case '3': case '_blank': case 'popout': console.log('Tab Function: Creating New Window for tab: '+tab); var url = $('#menu-'+cleanClass(tab)).attr('data-url'); window.open(url, '_blank'); break; default: console.error('Tab Function: Action not set'); } } function closeTab(tab, type){ } function reloadTab(tab, type){ $("#preloader").fadeIn(); console.log('Tab Function: Reloading tab: '+tab); switch (type) { case 0: case '0': case 'internal': break; case 1: case '1': case 'iframe': $('#frame-'+cleanClass(tab)).attr('src', $('#frame-'+cleanClass(tab)).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 reloadCurrentTab(){ $("#preloader").fadeIn(); console.log('Tab Function: Reloading Current tab'); var iframe = $('.iFrame-listing').find('.show'); var 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': var activeInternal = $('.internal-listing').find('.show'); $(activeInternal).html(''); loadInternal(activeInternal.attr('data-url'),activeInternal.attr('data-name')); break; case 1: case '1': case 'iframe': var activeFrame = $('.iFrame-listing').find('.show').children('iframe'); 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(){ var next = $('#page-wrapper').find('.loaded').attr('data-name'); if (typeof next !== 'undefined') { var type = $('#page-wrapper').find('.loaded').attr('data-type'); switchTab(next,type); }else{ console.log("Tab Function: No Available Tab to open"); } } function closeCurrentTab(){ var iframe = $('.iFrame-listing').find('.show'); var 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': var tab = $('.internal-listing').find('.show').attr('data-name'); console.log('Tab Function: Closing tab: '+tab); $('#internal-'+cleanClass(tab)).html(''); $('#menu-'+cleanClass(tab)+' a').removeClass("active"); $('#menu-'+tab+' a').children().removeClass('tabLoaded'); $('#internal-'+cleanClass(tab)).removeClass("loaded show"); $('#menu-'+cleanClass(tab)).removeClass("active"); loadNextTab(); break; case 1: case '1': case 'iframe': var tab = $('.iFrame-listing').find('.show').children('iframe').attr('data-name'); console.log('Tab Function: Closing tab: '+tab); $('#menu-'+cleanClass(tab)+' a').removeClass("active"); $('#menu-'+tab+' a').children().removeClass('tabLoaded'); $('#container-'+cleanClass(tab)).removeClass("loaded show"); $('#frame-'+cleanClass(tab)).remove(); loadNextTab(); break; case 2: case 3: case '2': case '3': case '_blank': case 'popout': break; default: console.error('Tab Function: Action not set'); } } function tabActions(event,name, type){ $('.splash-screen').removeClass('in').addClass('hidden'); if(event.ctrlKey){ popTab(cleanClass(name), type); }else if(event.altKey){ console.log('alt key'); }else if(event.shiftKey){ reloadTab(cleanClass(name), type); }else{ switchTab(cleanClass(name), type); } } 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){ //console.log(options); 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 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 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 '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 'hidden': return ''; break; case 'select': return smallLabel+''; break; case 'select2': 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; default: return false; } } function buildPluginsItem(array){ var activePlugins = ''; var inactivePlugins = ''; $.each(array, function(i,v) { var settingsPage = (v.settings == true) ? `
`+v.name+` Settings
` : ''; 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) { var json = JSON.parse(data); switch (type) { case 'plugins': loadMarketplacePluginsItems(json); break; case 'themes': loadMarketplaceThemesItems(json); break; default: } }).fail(function(xhr) { console.error("Organizr Function: Github Connection Failed"); }); } function loadMarketplacePluginsItems(plugins){ var pluginList = ''; $.each(plugins, function(i,v) { if(v.icon == null || v.icon == ''){ v.icon = 'test.png'; } v.status = pluginStatus(i,v.version); 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 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' : ''; v.name = i; themeList += `
    user-img
    `+i+`
    `+v.version+`
    `+v.author+` `+v.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.name,activeInfo.settings.notifications.position,"#FFF","success","5000"); plugin.downloadList = pluginFileList(plugin.files,plugin.github_folder,'plugins'); organizrAPI('POST','api/?v1/plugin/remove',{plugin:plugin}).success(function(data) { var html = JSON.parse(data); if(html.data.substr(0, 7) == 'Success'){ var newPlugins = html.data.split('!@!'); activeInfo.settings.misc.installedPlugins = newPlugins[1]; loadMarketplace('plugins'); message(plugin.name+' Removed','Please Click Plugins Above to refresh',activeInfo.settings.notifications.position,"#FFF","success","5000"); }else{ message('Remove Failed',html.data,activeInfo.settings.notifications.position,"#FFF","warning","10000"); } }).fail(function(xhr) { message('Remove Failed',plugin.name,activeInfo.settings.notifications.position,"#FFF","warning","5000"); console.error("Organizr Function: Connection Failed"); }); } function removeTheme(theme=null){ if(theme == null){ return false; } message('Removing Plugin',theme.name,activeInfo.settings.notifications.position,"#FFF","success","5000"); theme.downloadList = pluginFileList(theme.files,theme.github_folder,'plugins'); organizrAPI('POST','api/?v1/theme/remove',{theme:theme}).success(function(data) { var html = JSON.parse(data); if(html.data.substr(0, 7) == 'Success'){ var newThemes = html.data.split('!@!'); activeInfo.settings.misc.installedThemes = newThemes[1]; loadMarketplace('themes'); message(theme.name+' Removed','Please Click Customize Above to refresh',activeInfo.settings.notifications.position,"#FFF","success","5000"); }else{ message('Remove Failed',html.data,activeInfo.settings.notifications.position,"#FFF","warning","10000"); } }).fail(function(xhr) { message('Remove Failed',theme.name,activeInfo.settings.notifications.position,"#FFF","warning","5000"); console.error("Organizr Function: Connection Failed"); }); } function installPlugin(plugin=null){ if(plugin == null){ return false; } message('Installing Plugin',plugin.name,activeInfo.settings.notifications.position,"#FFF","success","5000"); plugin.downloadList = pluginFileList(plugin.files,plugin.github_folder,'plugins'); organizrAPI('POST','api/?v1/plugin/install',{plugin:plugin}).success(function(data) { var html = JSON.parse(data); if(html.data.substr(0, 7) == 'Success'){ var newPlugins = html.data.split('!@!'); activeInfo.settings.misc.installedPlugins = newPlugins[1]; loadMarketplace('plugins'); message(plugin.name+' Installed','Please Click Plugins Above to refresh',activeInfo.settings.notifications.position,"#FFF","success","5000"); }else{ message('Install Failed',html.data,activeInfo.settings.notifications.position,"#FFF","warning","10000"); } }).fail(function(xhr) { message('Install Failed',plugin.name,activeInfo.settings.notifications.position,"#FFF","warning","5000"); console.error("Organizr Function: Connection Failed"); }); } function installTheme(theme=null){ if(theme == null){ return false; } message('Installing Theme',theme.name,activeInfo.settings.notifications.position,"#FFF","success","5000"); theme.downloadList = pluginFileList(theme.files,theme.github_folder,'themes'); organizrAPI('POST','api/?v1/theme/install',{theme:theme}).success(function(data) { var html = JSON.parse(data); console.log(data); if(html.data.substr(0, 7) == 'Success'){ var newThemes = html.data.split('!@!'); activeInfo.settings.misc.installedThemes = newThemes[1]; loadMarketplace('themes'); message(theme.name+' Installed','Please Click Customize Above to refresh',activeInfo.settings.notifications.position,"#FFF","success","5000"); }else{ message('Install Failed',html.data,activeInfo.settings.notifications.position,"#FFF","warning","10000"); } }).fail(function(xhr) { message('Install Failed',theme.name,activeInfo.settings.notifications.position,"#FFF","warning","5000"); console.error("Organizr Function: Connection 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 buildHomepageItem(array){ var listing = ''; if (Array.isArray(array)) { $.each(array, function(i,v) { if(v.enabled){ listing += `

    `+v.name+`

    `+v.category+`
    `+v.name+`
    `+buildFormGroup(v.settings)+`
    `; } }); } return listing; } function buildPlugins(){ organizrAPI('GET','api/?v1/settings/plugins/list').success(function(data) { var response = JSON.parse(data); $('#main-plugin-area').html(buildPluginsItem(response.data)); }).fail(function(xhr) { console.error("Organizr Function: API Connection Failed"); }); } function buildHomepage(){ organizrAPI('GET','api/?v1/settings/homepage/list').success(function(data) { var response = JSON.parse(data); $('#settings-homepage-list').html(buildHomepageItem(response.data)); customHTMLoneEditor = ace.edit("customHTMLoneEditor"); var HTMLMode = ace.require("ace/mode/html").Mode; customHTMLoneEditor.session.setMode(new HTMLMode()); customHTMLoneEditor.setTheme("ace/theme/idle_fingers"); customHTMLoneEditor.setShowPrintMargin(false); customHTMLoneEditor.session.on('change', function(delta) { $('.customHTMLoneTextarea').val(customHTMLoneEditor.getValue()); $('#homepage-CustomHTML-1-form-save').removeClass('hidden'); }); customHTMLtwoEditor = ace.edit("customHTMLtwoEditor"); customHTMLtwoEditor.session.setMode(new HTMLMode()); customHTMLtwoEditor.setTheme("ace/theme/idle_fingers"); customHTMLtwoEditor.setShowPrintMargin(false); customHTMLtwoEditor.session.on('change', function(delta) { $('.customHTMLtwoTextarea').val(customHTMLtwoEditor.getValue()); $('#homepage-CustomHTML-2-form-save').removeClass('hidden'); }); }).fail(function(xhr) { console.error("Organizr Function: API Connection Failed"); }); } function buildFormGroup(array){ var mainCount = 0; var group = '
    '; var uList = ''+group; } function buildImageManagerViewItem(array){ var imageListing = ''; if (Array.isArray(array)) { $.each(array, function(i,v) { var filepath = v.split("/"); var name = filepath[3].split("."); imageListing += `
    `+name[0]+`
    `; }); } return imageListing; } function buildImageManagerView(){ organizrAPI('GET','api/?v1/image/list').success(function(data) { var response = JSON.parse(data); $('#settings-image-manager-list').html(buildImageManagerViewItem(response.data)); }).fail(function(xhr) { console.error("Organizr Function: API Connection Failed"); }); } function buildCustomizeAppearance(){ organizrAPI('GET','api/?v1/customize/appearance').success(function(data) { var response = JSON.parse(data); $('#customize-appearance-form').html(buildFormGroup(response.data)); cssEditor = ace.edit("customCSSEditor"); var CssMode = ace.require("ace/mode/css").Mode; cssEditor.session.setMode(new CssMode()); cssEditor.setTheme("ace/theme/idle_fingers"); cssEditor.setShowPrintMargin(false); cssEditor.session.on('change', function(delta) { $('.cssTextarea').val(cssEditor.getValue()); $('#customize-appearance-form-save').removeClass('hidden'); }); cssThemeEditor = ace.edit("customThemeCSSEditor"); var CssThemeMode = ace.require("ace/mode/css").Mode; cssThemeEditor.session.setMode(new CssThemeMode()); cssThemeEditor.setTheme("ace/theme/idle_fingers"); cssThemeEditor.setShowPrintMargin(false); cssThemeEditor.session.on('change', function(delta) { $('.cssThemeTextarea').val(cssThemeEditor.getValue()); $('#customize-appearance-form-save').removeClass('hidden'); }); javaEditor = ace.edit("customJavaEditor"); var JavaMode = ace.require("ace/mode/javascript").Mode; javaEditor.session.setMode(new JavaMode()); javaEditor.setTheme("ace/theme/idle_fingers"); javaEditor.setShowPrintMargin(false); javaEditor.session.on('change', function(delta) { $('.javaTextarea').val(javaEditor.getValue()); $('#customize-appearance-form-save').removeClass('hidden'); }); javaThemeEditor = ace.edit("customThemeJavaEditor"); var JavaThemeMode = ace.require("ace/mode/javascript").Mode; javaThemeEditor.session.setMode(new JavaThemeMode()); javaThemeEditor.setTheme("ace/theme/idle_fingers"); javaThemeEditor.setShowPrintMargin(false); javaThemeEditor.session.on('change', function(delta) { $('.javaThemeTextarea').val(javaThemeEditor.getValue()); $('#customize-appearance-form-save').removeClass('hidden'); }); $("input.pick-a-color").ColorPickerSliders({ placement: 'bottom', color: '#987654', hsvpanel: true, previewformat: 'hex', }); }).fail(function(xhr) { console.error("Organizr Function: API Connection Failed"); }); } function buildSSO(){ organizrAPI('GET','api/?v1/sso').success(function(data) { var response = JSON.parse(data); $('#sso-form').html(buildFormGroup(response.data)); }).fail(function (xhr) { console.error("Organizr Function: API Connection Failed"); }); } function buildSettingsMain(){ organizrAPI('GET','api/?v1/settings/main').success(function(data) { var response = JSON.parse(data); $('#settings-main-form').html(buildFormGroup(response.data)); changeAuth(); }).fail(function(xhr) { console.error("Organizr Function: API Connection Failed"); }); } function buildUserManagement(){ organizrAPI('GET','api/?v1/user/list').success(function(data) { var response = JSON.parse(data); $('#manageUserTable').html(buildUserManagementItem(response.data)); }).fail(function(xhr) { console.error("Organizr Function: API Connection Failed"); }); } function buildGroupManagement(){ organizrAPI('GET','api/?v1/user/list').success(function(data) { var response = JSON.parse(data); $('#manageGroupTable').html(buildGroupManagementItem(response.data)); }).fail(function(xhr) { console.error("Organizr Function: API Connection Failed"); }); } function buildTabEditor(){ organizrAPI('GET','api/?v1/tab/list').success(function(data) { var response = JSON.parse(data); $('#tabEditorTable').html(buildTabEditorItem(response.data)); }).fail(function(xhr) { console.error("Organizr Function: API Connection Failed"); }); } function buildCategoryEditor(){ organizrAPI('GET','api/?v1/tab/list').success(function(data) { var response = JSON.parse(data); $('#categoryEditorTable').html(buildCategoryEditorItem(response.data)); }).fail(function(xhr) { console.error("Organizr Function: API Connection Failed"); }); } function settingsAPI(post, callbacks=null){ organizrAPI('POST',post.api,post).success(function(data) { var response = JSON.parse(data); console.log(response); message(post.messageTitle,post.messageBody,activeInfo.settings.notifications.position,"#FFF","success","5000"); if(callbacks){ callbacks.fire(); } }).fail(function(xhr) { console.error(post.error); }); } /* END ORGANIZR API FUNCTIONS */ function buildLanguage(replace=false,newLang=null){ var languages = languageList(); var languageItems = ''; var currentLanguage = (getCookie('organizrLanguage')) ? getCookie('organizrLanguage') : window.lang.currentLang; $.each(languages, function(i,v) { var active = (i == currentLanguage) ? '' : ''; languageItems += `
    `+v.lang+`
    `+active+`
    `; }); var lang = ` `; if(replace == true){ $('#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 removeFile(path,name){ if(path !== '' && name !== ''){ var post = { path:path, name:name }; ajaxloader(".content-wrap","in"); organizrAPI('POST','api/?v1/remove/file',post).success(function(data) { var response = JSON.parse(data); if(response.data == true){ messageSingle('',window.lang.translate('Removed File')+' - '+name,activeInfo.settings.notifications.position,'#FFF','success','5000'); }else{ messageSingle('','File Removal Error',activeInfo.settings.notifications.position,'#FFF','error','5000'); } }).fail(function(xhr) { console.error("Organizr Function: API Connection Failed"); }); ajaxloader(); } } 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'); } if(username !== '' && email !== '' && passwordMatch == true){ var post = { username:username, email:email, password:password1 }; ajaxloader(".content-wrap","in"); organizrAPI('POST','api/?v1/manage/user',post).success(function(data) { var response = JSON.parse(data); if(response.data == true){ $.magnificPopup.close(); messageSingle('',window.lang.translate('User Info Updated'),activeInfo.settings.notifications.position,'#FFF','success','5000'); }else{ messageSingle('',response.data,activeInfo.settings.notifications.position,'#FFF','error','5000'); } }).fail(function(xhr) { console.error("Organizr Function: API Connection Failed"); }); ajaxloader(); } } function accountManager(user){ if (user.data.user.loggedin === true) { var accountDiv = `
    Account Information
    `; $('.organizr-area').after(accountDiv); pageLoad(); } } function userMenu(user){ var menuList = ''; menuList += buildLanguage(); if (user.data.user.loggedin === true) { menuList += ` `; }else{ menuList += ` `; } $(menuList).appendTo('.navbar-right').html; message("",window.lang.translate('Welcome')+" "+user.data.user.username,activeInfo.settings.notifications.position,"#FFF","success","3500"); console.log(window.lang.translate('Welcome')+" "+user.data.user.username); } function menuExtras(active){ var supportFrame = buildFrameContainer('Organizr Support','https://organizr.app/support',1); var adminMenu = (activeInfo.user.groupID <= 1) ? buildMenuList('Organizr Support','https://organizr.app/support',1,'fontawesome::life-ring'): ''; $(supportFrame).appendTo($('.iFrame-listing')); if(active === true){ return `
  • Logout
  • GitHub
  • `+adminMenu; }else{ return `
  • `; } } function categoryProcess(arrayItems){ var menuList = ''; 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(name,url){ return ` `; } function buildFrameContainer(name,url,type){ return ``; } function buildInternalContainer(name,url,type){ return ``; } function buildMenuList(name,url,type,icon,ping=null){ var ping = (ping !== null) ? `` : ''; return ``; } function tabProcess(arrayItems) { var iFrameList = ''; var internalList = ''; var defaultTabName = null; var defaultTabType = null; if (Array.isArray(arrayItems['data']['tabs']) && arrayItems['data']['tabs'].length > 0) { $.each(arrayItems['data']['tabs'], function(i,v) { if(v.enabled === 1){ if(v.default === 1){ defaultTabName = cleanClass(v.name); defaultTabType = v.type; } switch (v.type) { case 0: case '0': case 'internal': internalList = buildInternalContainer(v.name,v.url,v.type); $(internalList).appendTo($('.internal-listing')); break; case 1: case '1': case 'iframe': iFrameList = buildFrameContainer(v.name,v.url,v.type); $(iFrameList).appendTo($('.iFrame-listing')); break; case 2: case 3: case '2': case '3': case '_blank': case 'popout': break; default: console.error('Tab Process: Action not set'); } menuList = buildMenuList(v.name,v.url,v.type,v.image,v.ping_url); 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{ $(menuList).prependTo($('.category-'+v.category_id)); } $('#side-menu').metisMenu({ toggle: false }); } }); getDefault(defaultTabName,defaultTabType); }else{ noTabs(arrayItems); } $(menuExtras(arrayItems.data.user.loggedin)).appendTo($('#side-menu')); } function buildLogin(){ swapDisplay('login'); closeSideMenu(); removeMenuActive(); $('#menu-login a').addClass('active'); organizrConnect('api/?v1/login_page').success(function(data) { var json = JSON.parse(data); console.log("Organizr Function: Opening Login Page"); $('.login-area').html(json.data); }).fail(function(xhr) { console.error("Organizr Function: Login Connection Failed"); }); $("#preloader").fadeOut(); } function buildLockscreen(){ $("#preloader").fadeIn(); closeSideMenu(); organizrConnect('api/?v1/lockscreen').success(function(data) { var json = JSON.parse(data); console.log("Organizr Function: Adding Lockscreen"); $(json.data).appendTo($('body')); }).fail(function(xhr) { console.error("Organizr Function: Lockscreen Connection Failed"); }); $("#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){ splashList += ` `; } }); } return (splashList !== '') ? splashList : false; } function buildSplashScreen(json){ var items = buildSplashScreenItem(json); var menu = '
  • Splash Page
  • '; if(items){ closeSideMenu(); console.log("Organizr Function: Adding Splash Screen"); var splash = `
    `+items+`
    `+iconPrefix('fontawesome::home')+`   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){ var groupSelect = ''; var selected = ''; $.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':'Internal' }, { 'type_id':1, 'type':'iFrame' }, { 'type_id':2, 'type':'New Window' } ]; var typeSelect = ''; var selected = ''; $.each(array, function(i,v) { selected = ''; if(v.type_id == typeID){ selected = 'selected'; } 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) { var deleteDisabled = v.url.indexOf('/settings/') > 0 ? 'disabled' : 'deleteTab'; var buttonDisabled = v.url.indexOf('/settings/') > 0 ? 'disabled' : ''; var typeDisabled = v.url.indexOf('/?v1/') > 0 ? 'disabled' : ''; tabList += `
    `+iconPrefix(v.image)+`
    `+v.name+` `+buildTabCategorySelect(array.categories,v.id, v.category_id)+` `+buildTabGroupSelect(array.groups,v.id, v.group_id)+` `+buildTabTypeSelect(v.id, v.type, typeDisabled)+`
    `; }); return tabList; } function submitSettingsForm(form){ var list = $( "#"+form ).serializeToJSON(); var size = 0; var submit = {}; $.each(list, function(i,v) { if(v !== '#987654' && i.includes('disable-pwd-mgr') == false){ size++; var input = $( "#"+form+" [name='"+i+"']" ); 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().toString(); break; default: var value = input.val(); } submit[i] = {name: i , value: value, type: dataType}; } }); var post = { api:'api/?v1/update/config/multiple/form', payload:submit, messageTitle:'', messageBody:'Updated Items', error:'Organizr Function: API Connection Failed' }; var callbacks = $.Callbacks(); // Custom Callbacks switch(form){ case 'customize-appearance-form': //callbacks.add( buildCustomizeAppearance ); break; default: } if(size > 0){ console.log(submit); settingsAPI(post,callbacks); $("#"+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 submitHomepageOrder(){ var list = $( "#homepage-values" ).serializeToJSON(); var size = 0; var submit = {}; $.each(list, function(i,v) { if(v !== ''){ size++; submit[i] = v; } }); var post = { api:'api/?v1/update/config/multiple', payload:submit, messageTitle:'', messageBody:'Updated Homepage Order', error:'Organizr Function: API Connection Failed' }; var callbacks = $.Callbacks(); //callbacks.add( buildCustomizeAppearance ); if(size > 0){ settingsAPI(post,callbacks); $('#submitHomepageOrder-save').addClass('hidden'); }else{ console.log('add error'); } } function submitTabOrder(){ var post = { action:'changeOrder', api:'api/?v1/settings/tab/editor/tabs', tabs:$( "#submit-tabs-form" ).serializeToJSON(), messageTitle:'', messageBody:window.lang.translate('Tab Order Saved'), error:'Organizr Function: API Connection Failed' }; var callbacks = $.Callbacks(); callbacks.add( buildTabEditor ); settingsAPI(post,callbacks); } function submitCategoryOrder(){ var post = { action:'changeOrder', api:'api/?v1/settings/tab/editor/categories', categories:$( "#submit-categories-form" ).serializeToJSON(), messageTitle:'', messageBody:window.lang.translate('Category Order Saved'), error:'Organizr Function: API Connection Failed' }; var callbacks = $.Callbacks(); callbacks.add( buildCategoryEditor ); settingsAPI(post,callbacks); } function buildTR(array,type,badge){ var listing = ''; var arrayItems = array.split("|"); if(hasValue(arrayItems) === true){ $.each(arrayItems, function(i,v) { listing += ` `+type+` `+v+` `; }); return listing; } return ' '; } function buildVersion(array){ var x = 0; var versions = '

    Organizr 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 = ''; } versions += `
    `+button+`

    `+i+`

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

    `+v.title+`

    `+listing+`
    `; listing = ''; button = ''; x++; }); return versions; } function loadInternal(url,tabName){ organizrAPI('get',url).success(function(data) { var html = JSON.parse(data); $('#internal-'+tabName).html(html.data); }).fail(function(xhr) { console.error("Organizr Function: Connection Failed"); }); } function loadSettingsPage(api,element,organizrFn){ organizrAPI('get',api).success(function(data) { var json = JSON.parse(data); console.log('Organizr Function: Loading '+organizrFn); $(element).html(json.data); }).fail(function(xhr) { console.error("Organizr Function: API Connection Failed"); }); } function updateCheck(){ githubVersions().success(function(data) { var json = JSON.parse(data); for (var a in reverseObject(json)){ var latest = a; break; } if(latest !== currentVersion){ console.log('Update Function: Update to '+latest+' is available'); message(window.lang.translate('Update Available'),latest+' '+window.lang.translate('is available, goto')+' Update Tab',activeInfo.settings.notifications.position,'#FFF','update','60000'); } $('#githubVersions').html(buildVersion(reverseObject(json))); }).fail(function(xhr) { console.error("Organizr Function: Github Connection Failed"); }); } function updateBar(){ return `

    0%
    `; } 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 updateNow(){ console.log('Organizr Function: Starting Update Process'); $(updateBar()).appendTo('.organizr-area'); 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'); organizrAPI('POST','api/?v1/update', {branch:activeInfo.branch,stage:1}).success(function(data) { var json = JSON.parse(data); if(json.data == true){ 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'); organizrAPI('POST','api/?v1/update', {branch:activeInfo.branch,stage:2}).success(function(data) { var json = JSON.parse(data); if(json.data == true){ 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'); organizrAPI('POST','api/?v1/update', {branch:activeInfo.branch,stage:3}).success(function(data) { var json = JSON.parse(data); if(json.data == true){ 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'); organizrAPI('POST','api/?v1/update', {branch:activeInfo.branch,stage:4}).success(function(data) { var json = JSON.parse(data); if(json.data == true){ 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'); }else{ message('',window.lang.translate('Update Cleanup Failed'),activeInfo.settings.notifications.position,'#FFF','error','10000'); } }).fail(function(xhr) { console.error("Organizr Function: API Connection Failed"); }); }else{ message('',window.lang.translate('Update File Copy Failed'),activeInfo.settings.notifications.position,'#FFF','error','10000'); } }).fail(function(xhr) { console.error("Organizr Function: API Connection Failed"); }); }else{ message('',window.lang.translate('Update File Unzip Failed'),activeInfo.settings.notifications.position,'#FFF','error','10000'); } }).fail(function(xhr) { console.error("Organizr Function: API Connection Failed"); }); }else{ message('',window.lang.translate('Update File Download Failed'),activeInfo.settings.notifications.position,'#FFF','error','10000'); } }).fail(function(xhr) { console.error("Organizr Function: API Connection Failed"); }); } function organizrAPI(type,path,data=null){ //console.log('Organizr API: Calling API: '+path); switch (type) { case 'get': case 'GET': case 'g': return $.ajax({ url:path, method:"GET", beforeSend: function(request) { request.setRequestHeader("Token", activeInfo.token); }, timeout: 10000, }); break; case 'post': case 'POST': case 'p': return $.ajax({ url:path, method:"POST", beforeSend: function(request) { request.setRequestHeader("Token", activeInfo.token); }, 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 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(){ organizrConnect('api/?v1/wizard_page').success(function(data) { var json = JSON.parse(data); console.log("Organizr Function: Starting Install Wizard"); $(json.data).appendTo($('.organizr-area')); }).fail(function(xhr) { console.error("Organizr Function: Wizard Connection Failed"); }); $("#preloader").fadeOut(); } function buildDependencyCheck(orgdata){ organizrConnect('api/?v1/dependencies_page').success(function(data) { var json = JSON.parse(data); console.log("Organizr Function: Starting Dependencies Check"); $(json.data).appendTo($('.organizr-area')); $(buildBrowserInfo()).appendTo($('#browser-info')); $('#web-folder').html(buildWebFolder(orgdata)); $('#php-version-check').html(buildPHPCheck(orgdata)); $(buildDependencyInfo(orgdata)).appendTo($('#depenency-info')); }).fail(function(xhr) { console.error("Organizr Function: Dependencies Connection Failed"); }); $("#preloader").fadeOut(); } function buildDependencyInfo(arrayItems){ var listing = ''; $.each(arrayItems.data.status.dependenciesActive, function(i,v) { listing += '
  • '+v+'
  • '; }); $.each(arrayItems.data.status.dependenciesInactive, function(i,v) { listing += '
  • '+v+'
  • '; }); return listing; } function buildWebFolder(arrayItems){ var writable = (arrayItems.data.status.writable == 'yes') ? 'Writable - All Good' : 'Not Writable - Please fix permissions'; var className = (writable == 'Writable - All Good') ? 'bg-primary' : 'bg-danger text-warning'; $('#web-folder').addClass(className); return writable; } function buildPHPCheck(arrayItems){ var phpTest = (arrayItems.data.status.minVersion == 'yes') ? 'PHP Version Approved' : 'Upgrade PHP Version to 7.0'; var className = (arrayItems.data.status.minVersion == 'yes') ? 'bg-primary' : 'bg-danger text-warning'; $('#php-version-check').addClass(className); 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 '; break; case "warning": return ''; break; case "error": return ''; break; default: return ''; } } function radioLoop(element){ $('[type=radio][id!="'+element.id+'"]').each(function() { this.checked=false }); } function loadAppearance(appearance){ //console.log(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 { background-color: `+appearance.accentColor+` !important; } .panel-blue .panel-heading, .panel-info .panel-heading { border-color: `+appearance.accentColor+`; } .text-info, .btn-link, a { color: `+appearance.accentColor+`; } `; } if(appearance.accentTextColor !== ''){ cssSettings += ` .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 { color: `+appearance.accentTextColor+`; } `; } if(appearance.buttonColor !== ''){ cssSettings += ` .btn-info, .btn-info.disabled { background: `+appearance.buttonColor+` !important; border: 1px solid `+appearance.buttonColor+` !important; } `; } if(appearance.buttonTextColor !== ''){ cssSettings += ` .btn-info, .btn-info.disabled { color: `+appearance.buttonTextColor+` !important; } `; } if(appearance.loginWallpaper !== ''){ cssSettings += ` .login-register { background: url(`+appearance.loginWallpaper+`) center center/cover no-repeat!important; height: 100%; position: fixed; } .lock-screen { background: url(`+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(cssSettings !== ''){ $('#user-appearance').html(cssSettings); } if(appearance.customThemeCss !== ''){ $('#custom-theme-css').html(appearance.customThemeCss); } if(appearance.customCss !== ''){ $('#custom-css').html(appearance.customCss); } if(appearance.customThemeJava !== ''){ $('#custom-theme-javascript').html(appearance.customThemeJava); } if(appearance.customJava !== ''){ $('#custom-javascript').html(appearance.customJava); } } function clearForm(form){ $(form+" input[type=text]", 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){ local('set','error',$.urlParam('error')); } if($.urlParam('return') !== null){ local('set','uri',$.urlParam('return')); } if ( window.location !== window.parent.location ) { 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 = redirect; } } } function changeTheme(theme){ //$("#preloader").fadeIn(); $('#theme').attr({ href: 'css/themes/' + theme + '.css?v='+activeInfo.version }); //$("#preloader").fadeOut(); console.log('Theme: '+theme); } function changeStyle(style){ //$("#preloader").fadeIn(); $('#style').attr({ href: 'css/' + style + '.css?v='+activeInfo.version }); //$("#preloader").fadeOut(); console.log('Style: '+style); } function setSSO(){ $.each(activeInfo.sso, function(i,v) { if(v !== false){ local('set', i, v); }else{ local('r', i); } }); } function buildStreamItem(array,source){ var cards = ''; var count = 0; var total = array.length; 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 = 56; bg = ` `; 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'; }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+')'; } var streamInfo = ''; streamInfo += `
    Stream: `+userStream+`
    `; streamInfo += (v.userStream.videoResolution) ? `
    Video: `+userVideo+`
    ` : ''; streamInfo += `
    Audio: `+userAudio+`
    `; v.session = v.session.replace(/[\W_]+/g,"-"); 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 += '
    '; return cards; } 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 = ''; $.each(array, function(i,v) { if(extra == null){ var badge = ''; var badge2 = ''; var bg = (v.background.includes('.')) ? v.background : 'plugins/images/cache/no-np.png'; //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 : ''; 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; 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 = ''; 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') ? true : 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(array){ var requests = (typeof array.content !== 'undefined') ? true : false; var dropdown = ''; var headerAlt = ''; var header = ''; var ombiButton = (activeInfo.settings.homepage.ombi.enabled == true) ? `` : ''; if(requests){ var builtDropdown = ` `+ombiButton+` `; } if(activeInfo.settings.homepage.options.alternateHomepageHeaders){ var headerAlt = `

    Requested Content

    `+builtDropdown+`
    `; }else{ var header = `
      Requested Content
    `+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 = ''; 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/cache/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+'
  • ' }); 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 processRequest(id,type){ if(type == 'tv'){ requestNewID(id).success(function(data) { var newID = data.tvdb_id; ombiActions(newID,'add',type); }).fail(function(xhr) { console.error("Organizr Function: TMDB Connection Failed"); }); }else{ ombiActions(id,'add',type); } } //Ombi actions function ombiActions(id,action,type){ //console.log(id,action,type); var msg = (activeInfo.user.groupID <= 1) ? 'Not Org Fault - Ask Ombi' : 'Connection Error to Request Server'; ajaxloader('.preloader-'+id,'in'); organizrAPI('POST','api/?v1/ombi',{id:id, action:action, type:type}).success(function(data) { var response = JSON.parse(data); console.log(response.data); if(response.data !== false){ var responseData = JSON.parse(response.data.bd); console.log(responseData); var responseMessage = (responseData.isError == true) ? responseData.errorMessage : 'Success'; var responseType = (responseData.isError == true) ? 'error' : 'success'; homepageRequests(); if(action !== 'add'){ $.magnificPopup.close(); message(window.lang.translate('Updated Request Item'),responseMessage,activeInfo.settings.notifications.position,"#FFF",responseType,"3500"); }else{ ajaxloader(); message(window.lang.translate('Added Request Item'),responseMessage,activeInfo.settings.notifications.position,"#FFF",responseType,"3500"); } }else{ ajaxloader(); message("",msg,activeInfo.settings.notifications.position,"#FFF","error","3500"); } }).fail(function(xhr) { ajaxloader(); console.error("Organizr Function: API Connection Failed"); }); } function doneTyping () { var page = ($('#request-page').val()) ? $('#request-page').val() : 1; if(typeof searchTerm !== 'undefined'){ if(searchTerm !== $('#request-input').val()){ page = 1; } } ajaxloader('.search-div', 'in'); var title = $('#request-input').val(); 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) { console.error("Organizr Function: TMDB Connection Failed"); 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) { console.error("Organizr Function: TMDB Connection Failed"); ajaxloader(); }); } function buildDownloaderItem(array, source, type='none'){ var items = ''; switch (source) { case 'sabnzbd': switch (type) { case 'queue': if(array.queue.slots.length == 0){ return 'Nothing in queue'; } $.each(array.queue.slots, function(i,v) { var action = (v.status == "Downloading") ? 'pause' : 'resume'; var actionIcon = (v.status == "Downloading") ? 'pause' : 'play'; items += ` `+v.filename+` `+v.status+` `+v.cat+` `+v.size+` `+v.timeleft+`
    `+v.percentage+`%
    `; }); break; case 'history': if(array.history.slots.length == 0){ return 'Nothing in history'; } $.each(array.history.slots, function(i,v) { items += ` `+v.name+` `+v.status+` `+v.category+` `+v.size+`
    100%
    `; }); break; default: return false; } break; case 'nzbget': switch (type) { case 'queue': if(array.result.length == 0){ return 'Nothing in queue'; } $.each(array.result, function(i,v) { 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); v.Category = (v.Category !== '') ? v.Category : 'Not Set'; items += ` `+v.NZBName+` `+v.Status+` `+v.Category+` `+humanFileSize(v.FileSizeLo,true)+`
    `+percent+`%
    `; }); break; case 'history': if(array.result.length == 0){ return 'Nothing in history'; } $.each(array.result, function(i,v) { v.Category = (v.Category !== '') ? v.Category : 'Not Set'; items += ` `+v.NZBName+` `+v.Status+` `+v.Category+` `+humanFileSize(v.FileSizeLo,true)+`
    100%
    `; }); break; default: } break; case 'transmission': switch (type) { case 'queue': if(array.arguments.torrents == 0){ return 'Nothing in queue'; } $.each(array.arguments.torrents, function(i,v) { 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'; items += ` `+v.name+` `+status+` `+v.downloadDir+` `+humanFileSize(v.totalSize,true)+`
    `+percent+`%
    `; }); break; default: } break; case 'qBittorrent': switch (type) { case 'queue': if(array.arguments.torrents == 0){ return 'Nothing in queue'; } $.each(array.arguments.torrents, function(i,v) { 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) : "?"; items += ` `+v.name+` `+status+` `+v.save_path+` `+size+`
    `+percent+`%
    `; }); break; default: } break; case 'deluge': switch (type) { case 'queue': if(array.length == 0){ return 'Nothing in queue'; } $.each(array, function(i,v) { 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'; items += ` `+v.name+` `+v.state+` `+size+`  `+download+`  `+upload+`
    `+percent+`%
    `; }); break; default: } break; default: return false; } return items; } function buildDownloader(array, source){ var menu = `'; if(activeInfo.settings.homepage.options.alternateHomepageHeaders){ var headerAlt = `

      `+state+`

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

      `+state+`

    `+menu+`
    `; } return downloader ? `
    `+headerAlt+`
    `+header+`
    `+listing+`
    ` : ''; } function buildMetadata(array, source){ var metadata = ''; var genres = ''; var actors = ''; var rating = '
    '; $.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 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+`
    `+buildYoutubeLink(array.topTitle)+`

    `+genres+`

    `+array.overview+`

    `; return metadata; } function homepageDownloader(type, timeout){ var timeout = (typeof timeout !== 'undefined') ? timeout : activeInfo.settings.homepage.refresh.homepageDownloadRefresh; //if(isHidden()){ return; } switch (type) { case 'sabnzbd': var action = 'getSabnzbd'; break; case 'nzbget': var action = 'getNzbget'; break; case 'transmission': var action = 'getTransmission'; break; case 'qBittorrent': var action = 'getqBittorrent'; break; case 'deluge': var action = 'getDeluge'; break; default: } organizrAPI('POST','api/?v1/homepage/connect',{action:action}).success(function(data) { var response = JSON.parse(data); document.getElementById('homepageOrder'+type).innerHTML = ''; if(response.data !== null){ $('#homepageOrder'+type).html(buildDownloader(response.data, type)); } }).fail(function(xhr) { console.error("Organizr Function: API Connection Failed"); }); var timeoutTitle = type+'-Downloader'; if(typeof timeouts[timeoutTitle] !== 'undefined'){ clearTimeout(timeouts[timeoutTitle]); } timeouts[timeoutTitle] = setTimeout(function(){ homepageDownloader(type,timeout); }, timeout); } function homepageStream(type, timeout){ var timeout = (typeof timeout !== 'undefined') ? timeout : activeInfo.settings.homepage.refresh.homepageStreamRefresh; switch (type) { case 'plex': var action = 'getPlexStreams'; break; case 'emby': var action = 'getEmbyStreams'; break; default: } organizrAPI('POST','api/?v1/homepage/connect',{action:action}).success(function(data) { var response = JSON.parse(data); document.getElementById('homepageOrder'+type+'nowplaying').innerHTML = ''; $('#homepageOrder'+type+'nowplaying').html(buildStream(response.data, type)); }).fail(function(xhr) { console.error("Organizr Function: API Connection Failed"); }); var timeoutTitle = type+'-Stream'; if(typeof timeouts[timeoutTitle] !== 'undefined'){ clearTimeout(timeouts[timeoutTitle]); } timeouts[timeoutTitle] = setTimeout(function(){ homepageStream(type,timeout); }, timeout); } function homepageRecent(type, timeout){ var timeout = (typeof timeout !== 'undefined') ? timeout : activeInfo.settings.homepage.refresh.homepageRecentRefresh; //if(isHidden()){ return; } switch (type) { case 'plex': var action = 'getPlexRecent'; break; case 'emby': var action = 'getEmbyRecent'; break; default: } organizrAPI('POST','api/?v1/homepage/connect',{action:action}).success(function(data) { var response = JSON.parse(data); document.getElementById('homepageOrder'+type+'recent').innerHTML = ''; $('#homepageOrder'+type+'recent').html(buildRecent(response.data, type)); $('.recent-items').owlCarousel({ nav:false, autoplay:false, dots:false, margin:10, autoWidth:true, items:4 }) }).fail(function(xhr) { console.error("Organizr Function: API Connection Failed"); }); var timeoutTitle = type+'-Recent'; if(typeof timeouts[timeoutTitle] !== 'undefined'){ clearTimeout(timeouts[timeoutTitle]); } timeouts[timeoutTitle] = setTimeout(function(){ homepageRecent(type,timeout); }, timeout); } function homepagePlaylist(type, timeout=30000){ //if(isHidden()){ return; } switch (type) { case 'plex': var action = 'getPlexPlaylists'; break; default: } organizrAPI('POST','api/?v1/homepage/connect',{action:action}).success(function(data) { var response = JSON.parse(data); 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 }) }).fail(function(xhr) { console.error("Organizr Function: API Connection Failed"); }); } function homepageRequests(timeout){ var timeout = (typeof timeout !== 'undefined') ? timeout : activeInfo.settings.homepage.refresh.ombiRefresh; organizrAPI('POST','api/?v1/homepage/connect',{action:'getRequests'}).success(function(data) { var response = JSON.parse(data); document.getElementById('homepageOrderombi').innerHTML = ''; if(response.data.content !== false){ $('#homepageOrderombi').html(buildRequest(response.data)); } $('.request-items').owlCarousel({ nav:false, autoplay:false, dots:false, margin:10, autoWidth:true, items:4 }) }).fail(function(xhr) { console.error("Organizr Function: API Connection Failed"); }); if(typeof timeouts['ombi'] !== 'undefined'){ clearTimeout(timeouts['ombi']); } timeouts['ombi'] = setTimeout(function(){ homepageRequests(timeout); }, timeout); } function testAPIConnection(service){ messageSingle('',' Testing now...',activeInfo.settings.notifications.position,'#FFF','info','10000'); organizrAPI('POST','api/?v1/test/api/connection',{action:service}).success(function(data) { var response = JSON.parse(data); if(response.data == true){ messageSingle('',' API Connection Success',activeInfo.settings.notifications.position,'#FFF','success','10000'); }else{ messageSingle('API Connection Failed',response.data,activeInfo.settings.notifications.position,'#FFF','error','10000'); } console.log(response); }).fail(function(xhr) { console.error("Organizr Function: API Connection Failed"); message('',' Organizr Error',activeInfo.settings.notifications.position,'#FFF','error','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'); } organizrAPI('POST','api/?v1/homepage/connect',{action:'getCalendar'}).success(function(data) { var response = JSON.parse(data); $('#calendar').fullCalendar('removeEvents'); $('#calendar').fullCalendar('addEventSource', response.data.events); $('#calendar').fullCalendar('addEventSource', response.data.ical); response = ''; }).fail(function(xhr) { console.error("Organizr Function: API Connection Failed"); }); if(typeof timeouts['calendar'] !== 'undefined'){ clearTimeout(timeouts['calendar']); } timeouts['calendar'] = setTimeout(function(){ homepageCalendar(timeout); }, timeout); } function clearAJAX(id='all'){ if(id == 'all'){ $.each(timeouts, function(i,v) { 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: "https://www.googleapis.com/youtube/v3/search?part=snippet&q="+searchQuery+"+official+trailer&part=snippet&maxResults=1&type=video&videoDuration=short&key=AIzaSyD-8SHutB60GCcSM8q_Fle38rJUV7ujd8k", }); } function youtubeCheck(title,link){ youtubeSearch(title).success(function(data) { inlineLoad(); var id = data.items["0"].id.videoId; var div = `
    `; $('.youtube-div').html(div); $('.'+link).trigger('click'); player = new Plyr('#player-'+link); }).fail(function(xhr) { console.error("Organizr Function: YouTube Connection Failed"); }); } //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+'®ion=US&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 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'){ console.log('STOP STOP STOP'); player.destroy(); } } }, midClick: true // allow opening popup on middle mouse click. Always set it to true if you don't provide alternative source. }); } //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 '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 forceSearch(term){ $.magnificPopup.close(); var tabName = $("li[data-url^='api/?v1/homepage/page']").find('span').html(); if($("li[data-url^='api/?v1/homepage/page']").find('i').hasClass('tabLoaded')){ console.log('yup'); if($("li[data-url^='api/?v1/homepage/page']").find('a').hasClass('active')){ setTimeout( function(){ $('#newRequestButton').trigger('click'); $('#request-input').val(term); doneTyping(); }, 1000); }else{ tabActions('click',tabName,0); setTimeout( function(){ $('#newRequestButton').trigger('click'); $('#request-input').val(term); doneTyping(); }, 1000); } }else{ tabActions('click',tabName,0); 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) ? `` : ''; 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 += `
    `; }); //ombi setup? if(activeInfo.settings.homepage.ombi.enabled == true){ results += `

    `+term+`

    Request Me!
    `; } var buttons = `
    `; 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 pingUpdate(pingList,timeout){ organizrAPI('POST','api/?v1/ping',{pingList:pingList}).success(function(data) { var response = JSON.parse(data); if (response.data !== false || response.data !== null) { $('.menu-category-ping').each(function( index ) { $(this).attr('data-good','0'); $(this).attr('data-bad','0'); }); $.each(response.data, function(i,v) { 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 = (catElm.length !== 0) ? parseInt(catElm.attr('data-bad')) : 0; var goodCount = (catElm.length !== 0) ? parseInt(catElm.attr('data-good')) : 0; var previousState = (elm.attr('data-previous-state') == "") ? '' : elm.attr('data-previous-state'); var tabName = elm.attr('data-tab-name'); var status = (v == false) ? 'down' : 'up'; var ms = (v == false) ? '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); if(activeInfo.user.groupID <= activeInfo.settings.ping.authMs && activeInfo.settings.ping.ms){ elmMs.removeClass('hidden').html(ms); } switch (status){ case 'down': if(catElm.length > 0){ badCount = badCount + 1; catElm.attr('data-bad', badCount); } 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) ? audioDown.play() : ''; break; default: if(catElm.length > 0){ goodCount = goodCount + 1; catElm.attr('data-good', goodCount); if(badCount == 0){ catElm.html(success); } } 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) ? audioUp.play() : ''; } }); } }).fail(function(xhr) { console.error("Organizr Function: API Connection Failed"); }); 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(){ switch(activeInfo.settings.notifications.backbone){ 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){ var bb = activeInfo.settings.notifications.backbone; 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); }, 100); } } break; default: var ready = false; } if(notificationsReady && ready){ oldPosition = position; position = messagePositions()[position][bb]; if(local('g','initial')){ setTimeout(function(){ message(heading,text,oldPosition,color,icon,timeout); }, 100); 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': iziToast.settings({ 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, }); 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(msg); break; case 'alertify': console.log(heading,text,position,color,icon,timeout); 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: console.log('msg not setup') } }else{ setTimeout(function(){ message(heading,text,position,color,icon,timeout); }, 100); } } function messageSingle(heading,text,position,color,icon,timeout){ var bb = activeInfo.settings.notifications.backbone; 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(){ messageSingle(heading,text,position,color,icon,timeout); }, 100); } } break; default: var ready = false; } if(notificationsReady && ready){ 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; } message(heading,text,position,color,icon,timeout); }else{ setTimeout(function(){ messageSingle(heading,text,position,color,icon,timeout); }, 100); } } 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(){ organizrAPI('POST','api/?v1/lock','').success(function(data) { var html = JSON.parse(data); console.log(html); if(html.data == true){ location.reload(); }else{ message('Login Error',html.data,activeInfo.settings.notifications.position,'#FFF','warning','10000'); console.error('Organizr Function: Login failed'); } }).fail(function(xhr) { console.error("Organizr Function: Login Failed"); }); } function openSettings(){ var tab = $("li[data-url='api/?v1/settings/page']").find('span').text(); tabActions('click',tab,0); } function openHomepage(){ var tab = $("li[data-url='api/?v1/homepage/page']").find('span').text(); tabActions('click',tab,0); } function toggleFullScreen() { $('.fullscreen-icon').toggleClass('ti-fullscreen').toggleClass('mdi mdi-fullscreen-exit'); 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 launch(){ organizrConnect('api/?v1/launch_organizr').success(function (data) { try { var json = JSON.parse(data); } catch (e) { message('FATAL ERROR',data,activeInfo.settings.notifications.position,'#FFF','error','60000'); return false; } if(json.data.user == false){ location.reload(); } currentVersion = json.data.status.version; activeInfo = { 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.branch, sso:json.sso, settings:json.settings, theme:json.theme, style:json.style, version:json.version }; console.log("%cOrganizr","color: #66D9EF; font-size: 24px; font-family: Monospace;"); console.log("%cVersion: "+currentVersion,"color: #AD80FD; font-size: 12px; font-family: Monospace;"); console.log("%cStarting Up...","color: #F92671; font-size: 12px; font-family: Monospace;"); local('set','initial',true); setTimeout(function(){ local('r','initial'); }, 3000); defineNotification(); checkMessage(); errorPage(); uriRedirect(); changeStyle(activeInfo.style); changeTheme(activeInfo.theme); setSSO(); switch (json.data.status.status) { case "wizard": buildWizard(); buildLanguage('wizard'); break; case "dependencies": buildDependencyCheck(json); break; case "ok": loadAppearance(json.appearance); if(activeInfo.user.locked == 1){ buildLockscreen(); }else{ userMenu(json); categoryProcess(json); tabProcess(json); buildSplashScreen(json); accountManager(json); organizrSpecialSettings(json); getPingList(json); } break; default: console.error('Organizr Function: Action not set or defined'); } }); }