';
var uList = '
';
$.each(array, function(i,v) {
mainCount++;
var count = 0;
var total = v.length;
var active = (mainCount == 1) ? 'active' : '';
var customID = createRandomString(10);
if(i == 'custom'){
group += v;
}else{
uList += ``+i+` `;
group += `
`;
$.each(v, function(i,v) {
var override = '6';
if(typeof v.override !== 'undefined'){
override = v.override;
}
var arrayMultiple = false;
if(typeof v.type !== 'undefined'){
if(v.type == 'arrayMultiple'){
arrayMultiple = true;
}
}
count++;
if (count % 2 !== 0) {
group += '
';
}
var helpID = '#help-info-'+v.name;
var helpTip = (v.help) ? '
' : '';
var builtItems = '';
if(arrayMultiple == true){
$.each(v.value, function(index,value){
if (typeof value === 'object'){
builtItems += '
';
$.each(value, function(number,formItem) {
let clearfix = (formItem.type == 'blank') ? '
' : '';
builtItems += `
${clearfix}
`;
});
builtItems += '
';
}else{
builtItems += buildFormItem(value);
}
});
}else{
builtItems = `
`;
}
group += builtItems;
if (count % 2 == 0 || count == total) {
group += '
';
}
});
group += '
';
}
});
return uList+' '+group+'
';
}
function createImageSwal(attr){
let title = attr.attr('data-title');
let fullPath = attr.attr('data-image-path');
let clipboardText = attr.attr('data-clipboard-text');
let name = attr.attr('data-image-name');
let extension = attr.attr('data-image-name-ext');
let div = `
`+title+`
Choose action:
Copy to Clipboard
Delete
`;
swal({
content: createElementFromHTML(div),
buttons: false,
className: 'bg-org'
})
}
function buildImageManagerViewItem(array){
var imageListing = '';
if (Array.isArray(array)) {
$.each(array, function(i,v) {
var filepath = v.split("/");
var name = filepath[3].split(".");
var clipboardText = v.replace(/ /g,"%20");
imageListing += `
`;
});
}
return imageListing;
}
function buildImageManagerView(){
organizrAPI2('GET','api/v2/image').success(function(data) {
try {
let response = data.response;
$('.settings-image-manager-list').html(buildImageManagerViewItem(response.data));
$container = $("#gallery-content-center");
try{
if(typeof $container.isotope == 'undefined'){
$container.isotope({itemSelector : "img"});
}else{
$container.isotope({itemSelector : "img"});
}
}catch{
$container.isotope('destroy');
$container.isotope({itemSelector : "img"});
}
}catch(e) {
organizrCatchError(e,data);
}
}).fail(function(xhr) {
OrganizrApiError(xhr);
});
}
function buildCustomizeAppearance(){
organizrAPI2('GET','api/v2/settings/appearance').success(function(data) {
try {
var response = data.response;
}catch(e) {
organizrCatchError(e,data);
}
$('#customize-appearance-form').html(buildFormGroup(response.data));
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-custom-options").ColorPickerSliders({
placement: 'bottom',
color: '#987654',
hsvpanel: true,
previewformat: 'hex',
});
}).fail(function(xhr) {
OrganizrApiError(xhr);
});
}
function buildSSO(){
organizrAPI2('GET','api/v2/settings/sso').success(function(data) {
try {
var response = data.response;
}catch(e) {
organizrCatchError(e,data);
}
$('#sso-form').html(buildFormGroup(response.data));
}).fail(function (xhr) {
console.error("Organizr Function: API Connection Failed");
});
}
function buildSettingsMain(){
organizrAPI2('GET','api/v2/settings/main').success(function(data) {
try {
var response = data.response;
}catch(e) {
organizrCatchError(e,data);
}
$('#settings-main-form').html(buildFormGroup(response.data));
changeAuth();
}).fail(function(xhr) {
OrganizrApiError(xhr);
});
}
function buildUserManagement(){
organizrAPI2('GET','api/v2/users?includeGroups').success(function(data) {
try {
var response = data.response;
}catch(e) {
organizrCatchError(e,data);
}
$('#manageUserTable').html(buildUserManagementItem(response.data));
}).fail(function(xhr) {
OrganizrApiError(xhr);
});
}
function buildGroupManagement(){
organizrAPI2('GET','api/v2/groups?includeUsers').success(function(data) {
try {
var response = data.response;
}catch(e) {
organizrCatchError(e,data);
}
$('#manageGroupTable').html(buildGroupManagementItem(response.data));
}).fail(function(xhr) {
OrganizrApiError(xhr);
});
}
function buildTabEditor(){
organizrAPI2('GET','api/v2/tabs').success(function(data) {
try {
var response = data.response;
}catch(e) {
organizrCatchError(e,data);
}
$('#tabEditorTable').html(buildTabEditorItem(response.data));
checkTabHomepageItems();
}).fail(function(xhr) {
OrganizrApiError(xhr);
});
}
function checkTabHomepageItems(){
var tabList = $('.checkTabHomepageItem');
$.each(tabList, function(i,v) {
var el = $(v);
var id = el.attr('id');
var name = el.attr('data-name');
var url = el.attr('data-url');
var urlLocal = el.attr('data-url-local');
checkTabHomepageItem(id, name, url, urlLocal);
});
}
function sortHomepageItemHrefs(){
var hrefList = $('.popup-with-form');
window.hrefList = new Array();
$.each(hrefList, function(i,v) {
var el = $(v);
var href = el.attr('href');
if(href.includes('#homepage-')){
var splitHref = href.split("-");
window.hrefList[splitHref[1]] = i;
}
});
}
function checkTabHomepageItemList(name, url, urlLocal, id, check, tab) {
// might use this later
if (name.includes(check) || url.includes(check) || urlLocal.includes(check)) {
addEditHomepageItem(id, tab);
}
}
function checkTabHomepageItem(id, name, url, urlLocal){
name = name.toLowerCase();
url = url.toLowerCase();
urlLocal = urlLocal.toLowerCase();
try {
let urlObject = (new URL(url));
if(urlObject.pathname !== '/' && urlObject !== '#'){
url = urlObject.pathname;
}
} catch {
url = url;
}
if(name.includes('sonarr') || url.includes('sonarr') || urlLocal.includes('sonarr')){
addEditHomepageItem(id,'Sonarr');
}else if(name.includes('radarr') || url.includes('radarr') || urlLocal.includes('radarr')){
addEditHomepageItem(id,'Radarr');
}else if(name.includes('lidarr') || url.includes('lidarr') || urlLocal.includes('lidarr')){
addEditHomepageItem(id,'Lidarr');
}else if(name.includes('couchpotato') || url.includes('couchpotato') || urlLocal.includes('couchpotato')){
addEditHomepageItem(id,'CouchPotato');
}else if(name.includes('sick') || url.includes('sick') || urlLocal.includes('sick')){
addEditHomepageItem(id,'SickRage');
}else if((name.includes('plex') || url.includes('plex') || urlLocal.includes('plex')) && !name.includes('plexpy')){
addEditHomepageItem(id,'Plex');
}else if(name.includes('emby') || url.includes('emby') || urlLocal.includes('emby')){
addEditHomepageItem(id,'Emby');
}else if(name.includes('jdownloader') || url.includes('jdownloader') || urlLocal.includes('jdownloader') || name.includes('rsscrawler') || url.includes('rsscrawler') || urlLocal.includes('rsscrawler')){
addEditHomepageItem(id,'jDownloader');
}else if(name.includes('sab') || url.includes('sab') || urlLocal.includes('sab')){
addEditHomepageItem(id,'SabNZBD');
}else if(name.includes('nzbget') || url.includes('nzbget') || urlLocal.includes('nzbget')){
addEditHomepageItem(id,'NZBGet');
}else if(name.includes('transmission') || url.includes('transmission') || urlLocal.includes('transmission')){
addEditHomepageItem(id,'Transmission');
}else if(name.includes('qbit') || url.includes('qbit') || urlLocal.includes('qbit')){
addEditHomepageItem(id,'qBittorrent');
}else if(name.includes('rtorrent') || url.includes('rtorrent') || urlLocal.includes('rtorrent')){
addEditHomepageItem(id,'rTorrent');
}else if(name.includes('utorrent') || url.includes('utorrent') || urlLocal.includes('utorrent')){
addEditHomepageItem(id,'utorrent');
}else if(name.includes('deluge') || url.includes('deluge') || urlLocal.includes('deluge')){
addEditHomepageItem(id,'Deluge');
}else if(name.includes('ombi') || url.includes('ombi') || urlLocal.includes('ombi')){
addEditHomepageItem(id,'Ombi');
}else if(name.includes('healthcheck') || url.includes('healthcheck') || urlLocal.includes('healthcheck')){
addEditHomepageItem(id,'HealthChecks');
}else if(name.includes('jackett') || url.includes('jackett') || urlLocal.includes('jackett')){
addEditHomepageItem(id,'Jackett');
}else if(name.includes('unifi') || url.includes('unifi') || urlLocal.includes('unifi')){
addEditHomepageItem(id,'Unifi');
}else if(name.includes('tautulli') || url.includes('tautulli') || urlLocal.includes('tautulli')){
addEditHomepageItem(id,'Tautulli');
}
}
function addEditHomepageItem(id, type){
let html = '
';
$('#'+id).html(html);
$('#'+id).attr('onclick', 'editHomepageItem("'+type+'")');
return false;
}
function buildCategoryEditor(){
organizrAPI2('GET','api/v2/tabs').success(function(data) {
try {
var response = data.response;
}catch(e) {
organizrCatchError(e,data);
}
$('#categoryEditorTable').html(buildCategoryEditorItem(response.data));
}).fail(function(xhr) {
OrganizrApiError(xhr);
});
}
/* END ORGANIZR API FUNCTIONS */
function buildLanguage(replace=false,newLang=null){
var languageItems = '';
var currentLanguage = (getCookie('organizrLanguage')) ? getCookie('organizrLanguage') : window.lang.currentLang;
var newLangCode = '';
$.each(languageList, function(i,v) {
if(newLang === v.language){
newLangCode = v.code;
}
var active = (v.code == currentLanguage) ? '' : '';
languageItems += `
`+v.language+` `+active+`
`;
});
var lang = `
`;
if(replace == true){
setLangCookie(newLangCode);
$('#languageDropdown').replaceWith(lang);
message("",window.lang.translate('Changed Language To')+": "+newLang,activeInfo.settings.notifications.position,"#FFF","success","3500");
}else if(replace == 'wizard'){
$(lang).appendTo('.navbar-right');
}else{
return lang;
}
}
function updateUserInformation(){
var passwordMatch = true;
var username = $('#accountUsername').val();
var email = $('#accountEmail').val();
var password1 = $('#accountPassword1').val();
var password2 = $('#accountPassword2').val();
if(password1 != password2){
passwordMatch = false;
messageSingle('','Passwords do not match',activeInfo.settings.notifications.position,'#FFF','error','5000');
return false;
}
if(username !== '' && email !== '' && passwordMatch == true){
var post = {
username:username,
email:email
};
if(password1 !== ''){
post['password'] = password1
}
ajaxloader(".content-wrap","in");
organizrAPI2('PUT','api/v2/users/' + activeInfo.user.userID,post).success(function(data) {
try {
var response = data.response;
$.magnificPopup.close();
messageSingle('',window.lang.translate('User Info Updated'),activeInfo.settings.notifications.position,'#FFF','success','5000');
}catch(e) {
organizrCatchError(e,data);
}
ajaxloader();
}).fail(function(xhr) {
OrganizrApiError(xhr, 'Update User');
ajaxloader();
});
}
}
function twoFA(action, type, secret = null){
switch(action){
case 'activate':
organizrAPI2('POST','api/v2/2fa/' + type,{}).success(function(data) {
try {
var html = data.response;
}catch(e) {
organizrCatchError(e,data);
}
let div = `
Enable 2FA: `+html.data.type+`
`+html.data.secret+`
`;
swal({
content: createElementFromHTML(div),
buttons: false,
className: 'bg-org'
})
}).fail(function(xhr) {
OrganizrApiError(xhr, '2FA');
});
break;
case 'deactivate':
organizrAPI2('DELETE','api/v2/2fa').success(function(data) {
try {
message('2FA Removed','',activeInfo.settings.notifications.position,'#FFF','success','5000');
$('.2fa-list').replaceWith(buildTwoFA('internal'));
}catch(e) {
organizrCatchError(e,data);
}
}).fail(function(xhr) {
OrganizrApiError(xhr, '2FA');
});
break;
case 'verify':
var secret = $('.twofa-modal-secret').text();
var code = $('#twofa-verify').val();
if(type !== '' && secret !== '' && code !== ''){
organizrAPI2('POST','api/v2/2fa',{type:type, secret:secret, code:code}).success(function(data) {
try {
var html = data.response;
message('2FA Success','Input Code Validated! Saving...',activeInfo.settings.notifications.position,"#FFF","success","5000");
swal.close();
twoFA('save', type, secret);
}catch(e) {
organizrCatchError(e,data);
}
}).fail(function(xhr) {
OrganizrApiError(xhr, '2FA');
});
}else{
message('2FA Failed','Input Code',activeInfo.settings.notifications.position,"#FFF","warning","5000");
}
break;
case 'save':
organizrAPI2('PUT','api/v2/2fa',{type:type, secret:secret}).success(function(data) {
try {
var html = data.response;
message('2FA Success','2FA Saved',activeInfo.settings.notifications.position,"#FFF","success","5000");
$('.2fa-list').replaceWith(buildTwoFA(type));
}catch(e) {
organizrCatchError(e,data);
}
}).fail(function(xhr) {
OrganizrApiError(xhr, '2FA');
});
break;
}
}
function buildTwoFA(current){
switch(current){
case 'internal':
var option = `
Organizr Authenticator
Current
`;
break;
case 'google':
var option = `
`;
break;
default:
break;
}
var element = `
`;
return element;
}
function scrapeCall(){
// Define the URL to scrape [only supports GET at the moment
var url = 'https://api.github.com/users/causefx/repos';
// Define callbacks variable first
var callbacks = $.Callbacks();
// Add functions that will deal with the data
callbacks.add( scrapeFunction );
// Call the API function to scrape the page you want [types = 'json' or 'html']
scrapeAPI(url, callbacks, 'json');
}
function scrapeFunction(data){
// Here you would do whatever you like
if(data.data.result == 'Success'){
console.log('Success!!!');
}
console.log('data:')
console.log(data);
}
function scrapeAPI(url, callbacks = null, type = null){
if (typeof url === 'undefined'){
console.log('error');
return false;
}
organizrAPI2('POST','api/v2/homepage/scrape',{url:url, type:type}).success(function(data) {
try {
let response = data.response;
if(response){
if(callbacks){ callbacks.fire(response); }
}
}catch(e) {
organizrCatchError(e,data);
}
}).fail(function(xhr) {
OrganizrApiError(xhr, 'Scrape');
});
}
function revokeToken(id){
organizrAPI2('DELETE','api/v2/token/' + id,{}).success(function(data) {
try {
$('#token-'+id).fadeOut();
message(window.lang.translate('Removed Token'),"",activeInfo.settings.notifications.position,"#FFF","success","3500");
}catch(e) {
organizrCatchError(e,data);
}
}).fail(function(xhr) {
ajaxloader();
OrganizrApiError(xhr, 'Revoke Token');
});
}
function buildActiveTokens(array) {
var parser = new UAParser();
var tokens = '';
$.each(array, function(i,v) {
parser.setUA(v.browser);
var result = parser.getResult();
var className = (activeInfo.user.token == v.token) ? 'bg-success text-inverse' : '';
var extraText = (activeInfo.user.token == v.token) ? '
...'+v.token.substr(-10, 10)+' ' : v.token.substr(-10, 10);
tokens += `
`+v.id+`
`+extraText+`
`+moment(v.created).format('LLL')+`
`+moment(v.expires).format('LLL')+`
`+(result.browser.name)+`
Browser
`+result.browser.name+`
Version
`+result.browser.version+`
OS
`+result.os.name+`
Version
`+result.os.version+`
`+(v.ip)+`
`;
});
return `
#
Token
Created
Expires
Browser
IP
Action
`+tokens+`
`;
}
function accountManager(user){
var passwordMessage = '';
switch(activeInfo.settings.misc.authBackend){
case 'plex':
passwordMessage = `
`;
break;
case 'emby':
passwordMessage = `
`;
break;
default:
passwordMessage = '';
break;
}
if (user.data.user.loggedin === true) {
var twoFADisable = (buildTwoFA(user.data.user.authService) == 'internal') ? '' : 'disabled';
var activeTokens = buildActiveTokens(user.data.user.tokenList);
var accountDiv = `
`;
$('.organizr-area').after(accountDiv);
pageLoad();
}
}
function userMenu(user){
$('body').attr('data-active-user-group-name',user.data.user.group);
$('body').attr('data-active-user-group-id',user.data.user.groupID);
var sideMenu = '';
var menuList = '
';
var showDebug = (activeInfo.settings.misc.debugArea) ? '
Debug Area ' : '';
menuList += buildLanguage();
if (user.data.user.loggedin === true) {
menuList += `
`+user.data.user.username+`
`;
sideMenu += `
`;
}else{
menuList += `
`+user.data.user.username+`
`;
sideMenu += `
`;
}
$(menuList).appendTo('.navbar-right').html;
//$(sideMenu).appendTo('#side-menu').html;
//message("",window.lang.translate('Welcome')+" "+user.data.user.username,activeInfo.settings.notifications.position,"#FFF","success","3500");
console.info("%c "+window.lang.translate('Welcome')+" %c ".concat(user.data.user.username, " "), "color: white; background: #AD80FD; font-weight: 700;", "color: #AD80FD; background: white; font-weight: 700;");
}
function menuExtras(active){
let adminMenu = '
';
let extraOrganizrLinks = [
{
'type':2,
'group_id':1,
'name':'Github Repo',
'url':'https://github.com/causefx/organizr',
'icon':'fontawesome::github',
'active':activeInfo.settings.menuLink.githubMenuLink
},
{
'type':1,
'group_id':1,
'name':'Organizr Support',
'url':'https://organizr.app/support',
'icon':'fontawesome::life-ring',
'active':activeInfo.settings.menuLink.organizrSupportMenuLink
},
{
'type':2,
'group_id':1,
'name':'Organizr Docs',
'url':'https://docs.organizr.app',
'icon':'simpleline::docs',
'active':activeInfo.settings.menuLink.organizrDocsMenuLink
},
{
'type':1,
'group_id':1,
'name':'Feature Request',
'url':'https://vote.organizr.app',
'icon':'simpleline::arrow-up-circle',
'active':activeInfo.settings.menuLink.organizrFeatureRequestLink
}
];
$.each(extraOrganizrLinks, function(i,v) {
if(v.type == 1){
let frame = buildFrameContainer(v.name,v.url,v.type);
$(frame).appendTo($('.iFrame-listing'));
}
adminMenu += (activeInfo.user.groupID <= v.group_id && v.active) ? buildMenuList(v.name,v.url,v.type,v.icon) : '';
});
if(active === true){
return (activeInfo.settings.menuLink.organizrSignoutMenuLink) ? `
` + adminMenu : '' + adminMenu;
}else{
return (activeInfo.settings.menuLink.organizrSignoutMenuLink) ? `
` : '';
}
}
function categoryProcess(arrayItems){
var menuList = '';
let categoryIn = activeInfo.settings.misc.expandCategoriesByDefault ? 'in' : '';
let categoryActive = activeInfo.settings.misc.expandCategoriesByDefault ? 'active' : '';
let categoryExpanded = activeInfo.settings.misc.expandCategoriesByDefault ? 'true' : 'false';
if (Array.isArray(arrayItems['data']['categories']) && Array.isArray(arrayItems['data']['tabs'])) {
$.each(arrayItems['data']['categories'], function(i,v) {
if(v.count !== 0 && v.category_id !== 0){
menuList += `
`+iconPrefix(v.image)+`
`;
}
});
$(menuList).appendTo($('#side-menu'));
}
}
function buildFrame(name,url, split = null){
let extra = split ? 'right-' : '';
var sandbox = activeInfo.settings.misc.sandbox;
sandbox = sandbox.replace(/,/gi, ' ');
sandbox = (sandbox) ? ' sandbox="' + sandbox + '"' : '';
return `
`;
}
function buildFrameContainer(name,url,type, split = null){
let extra = split ? 'right-' : '';
return ``;
}
function buildInternalContainer(name,url,type, split = null){
let extra = split ? 'right-' : '';
return ``;
}
function buildMenuList(name,url,type,icon,ping=null,category_id = null,group_id = 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 && v.access_url){
tabInformation[cleanClass(v.name)] = {"active":false,"loaded":false,"increments":0,"tabInfo":v};
switch(v.timeout){
case 1:
case '1':
tabActionsList['close'].push({"tab":cleanClass(v.name),"action_ms":v.timeout_ms});
break;
case 2:
case '2':
tabActionsList['refresh'].push({"tab":cleanClass(v.name),"action_ms":v.timeout_ms});
break;
default:
//nada
}
if(v.default === 1){
defaultTabName = cleanClass(v.name);
defaultTabType = v.type;
}
var menuList = buildMenuList(v.name,v.access_url,v.type,v.image,v.ping_url, v.category_id, v.group_id);
if(v.category_id === 0){
if(activeInfo.settings.misc.unsortedTabs === 'top'){
$(menuList).prependTo($('#side-menu'));
}else if(activeInfo.settings.misc.unsortedTabs === 'bottom') {
$(menuList).appendTo($('#side-menu'));
}
}else{
if(activeInfo.settings.misc.unsortedTabs === 'top'){
$(menuList).prependTo($('.category-'+v.category_id));
}else if(activeInfo.settings.misc.unsortedTabs === 'bottom') {
$(menuList).appendTo($('.category-'+v.category_id));
}
}
switch (v.type) {
case 0:
case '0':
case 'internal':
internalList = buildInternalContainer(v.name,v.access_url,v.type);
$(internalList).appendTo($('.internal-listing'));
internalList = buildInternalContainer(v.name,v.access_url,v.type, true);
$(internalList).appendTo($('.internal-listing-right'));
if(v.preload){
var newTab = $('#internal-'+cleanClass(v.name));
organizrConsole('Tab Function','Preloading new tab for: '+cleanClass(v.name));
$('#menu-'+cleanClass(v.name)+' a').children().addClass('tabLoaded');
newTab.addClass("loaded");
loadInternal(v.access_url,cleanClass(v.name));
}
break;
case 1:
case '1':
case 'iframe':
iFrameList = buildFrameContainer(v.name,v.access_url,v.type);
$(iFrameList).appendTo($('.iFrame-listing'));
iFrameList = buildFrameContainer(v.name,v.access_url,v.type, true);
$(iFrameList).appendTo($('.iFrame-listing-right'));
if(v.preload){
var newTab = $('#container-'+cleanClass(v.name));
var tabURL = newTab.attr('data-url');
organizrConsole('Tab Function','Preloading new tab for: '+cleanClass(v.name));
$('#menu-'+cleanClass(v.name)+' a').children().addClass('tabLoaded');
newTab.addClass("loaded");
$(buildFrame(cleanClass(v.name),tabURL)).appendTo(newTab);
}
break;
case 2:
case 3:
case '2':
case '3':
case '_blank':
case 'popout':
break;
default:
organizrConsole('Tab Function','Action not set', 'error');
}
}
});
$('#side-menu').metisMenu({ toggle: activeInfo.settings.misc.autoCollapseCategories });
getDefault(defaultTabName,defaultTabType);
}else{
noTabs(arrayItems);
}
$(menuExtras(arrayItems.data.user.loggedin)).appendTo($('#side-menu'));
}
function buildLogin(){
swapDisplay('login');
closeSideMenu();
removeMenuActive();
$('#menu-login a').addClass('active');
organizrAPI2('GET', 'api/v2/page/login').success(function(data) {
try {
var response = data.response;
organizrConsole('Organizr Function','Opening Login Page');
$('.login-area').html(response.data);
}catch(e) {
organizrCatchError(e,data);
}
}).fail(function(xhr) {
OrganizrApiError(xhr, 'Login Error');
});
$("#preloader").fadeOut();
}
function buildLockscreen(){
$("#preloader").fadeIn();
closeSideMenu();
organizrAPI2('GET', 'api/v2/page/lockscreen').success(function(data) {
try {
var response = data.response;
organizrConsole('Organizr Function','Adding Lockscreen');
$(response.data).appendTo($('body'));
}catch(e) {
organizrCatchError(e,data);
}
}).fail(function(xhr) {
OrganizrApiError(xhr);
});
$("#preloader").fadeOut();
}
function buildSplashScreenItem(arrayItems){
var splashList = '';
if (Array.isArray(arrayItems['data']['tabs']) && arrayItems['data']['tabs'].length > 0) {
arrayItems['data']['tabs'].sort((a, b) => parseFloat(a.order) - parseFloat(b.order));
$.each(arrayItems['data']['tabs'], function(i,v) {
if(v.enabled === 1 && v.splash === 1 && v.access_url){
var image = iconPrefixSplash(v.image);
if(image.indexOf('.') !== -1){
var dataSrc = 'data-src="'+iconPrefixSplash(v.image)+'"';
var nonImage = '';
}else{
var dataSrc = '';
var nonImage = '
'+image+' ';
}
splashList += `
`;
}
});
}
return (splashList !== '') ? splashList : false;
}
function buildSplashScreen(json){
let hiddenSplash = (directToHash) ? 'hidden' : 'in';
var items = buildSplashScreenItem(json);
var menu = '
Splash Page ';
if(items){
closeSideMenu();
organizrConsole('Organizr Function','Adding Splash Screen');
var splash = `
`;
$(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 += '
'+v.group+' ';
});
return '
'+groupSelect+' ';
}
function buildTabGroupSelect(array, tabID, groupID){
var groupSelect = '';
var selected = '';
$.each(array, function(i,v) {
selected = '';
if(v.group_id == groupID){
selected = 'selected';
}
groupSelect += '
'+v.group+' ';
});
return '
'+groupSelect+' ';
}
function buildTabTypeSelect(tabID, typeID, disabled){
var array = [
{
'type_id':0,
'type':'Organizr'
},
{
'type_id':1,
'type':'iFrame'
},
{
'type_id':2,
'type':'New Window'
}
];
var typeSelect = '';
var selected = '';
disabled = (disabled == 'disabled' && typeID !== 0) ? null : disabled;
$.each(array, function(i,v) {
selected = '';
if(v.type_id == typeID){
selected = 'selected';
}
var disabledAttr = (disabled === 'disabled' && v.type !== 'Internal') ? 'disabled' : '';
typeSelect += '
'+v.type+' ';
});
return '
'+typeSelect+' ';
}
function buildTabCategorySelect(array,tabID, categoryID){
var categorySelect = '';
var selected = '';
$.each(array, function(i,v) {
selected = '';
if(v.category_id == categoryID){
selected = 'selected';
}
categorySelect += '
'+v.category+' ';
});
return '
'+categorySelect+' ';
}
function buildUserManagementItem(array){
var userList = '';
$.each(array.users, function(i,v) {
var disabledDelete = (v.group_id == 999 || v.group_id == 0) ? 'disabled' : 'deleteUser';
userList += `
`+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 += `
`+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 += `
`+v.category+`
`+tabCount+`
`;
});
return categoryList;
}
function buildTabEditorItem(array){
var tabList = '';
$.each(array.tabs, function(i,v) {
var deleteDisabled = v.url.indexOf('/page/settings') > 0 ? 'disabled' : 'deleteTab';
var buttonDisabled = v.url.indexOf('/page/settings') > 0 ? 'disabled' : '';
var typeDisabled = v.url.indexOf('/v2/page/') > 0 ? 'disabled' : '';
tabList += `
`+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 editTabForm(id){
organizrAPI2('GET','api/v2/tabs/' + id,true).success(function(data) {
try {
let response = data.response;
console.log(response);
$('#edit-tab-form [name=name]').val(response.data.name);
$('#originalTabName').html(response.data.name);
$('#edit-tab-form [name=url]').val(response.data.url);
$('#edit-tab-form [name=url_local]').val(response.data.url_local);
$('#edit-tab-form [name=ping_url]').val(response.data.ping_url);
$('#edit-tab-form [name=image]').val(response.data.image);
$('#edit-tab-form [name=id]').val(response.data.id);
$('#edit-tab-form [name=timeout_ms]').val(convertMsToMinutes(response.data.timeout_ms));
$('#edit-tab-form [name=timeout]').val(response.data.timeout);
if( response.data.url.indexOf('/?v') > 0){
$('#edit-tab-form [name=url]').prop('disabled', 'true');
}else{
$('#edit-tab-form [name=url]').prop('disabled', null);
}
}catch(e) {
organizrCatchError(e,data);
}
}).fail(function(xhr) {
OrganizrApiError(xhr, 'Tab Error');
});
}
function getSubmitSettingsFormValueSingle(form, index, value){
var values = {};
if(value !== '#987654' && index.includes('disable-pwd-mgr') == false) {
var input = $("#" + form + " [name='" + index + "']");
var dataType = input.attr('data-type');
switch (dataType) {
case 'switch':
case 'checkbox':
var value = input.prop("checked") ? true : false;
break;
case 'select2':
var value = (input.val() !== null) ? input.val().toString() : '';
break;
default:
var value = input.val();
}
values = {name: index, value: value, type: dataType};
return values;
}
return false;
}
function getSubmitSettingsFormValueObject(form, index, value){
var values = [];
$.each(value, function(i,v) {
var objectList = [];
var object = [];
$.each(v, function(key,val) {
if(val !== '#987654' && key.includes('disable-pwd-mgr') == false) {
var input = $("#" + form + " [name='" + index + "["+i+"]."+key+"']");
var dataType = input.attr('data-type');
var dataLabel = input.attr('data-label');
switch (dataType) {
case 'switch':
case 'checkbox':
var value = input.prop("checked") ? true : false;
break;
case 'select2':
var value = (input.val() !== null) ? input.val().toString() : '';
break;
default:
var value = input.val();
}
var newKey = index + '[' + i + '].' + key;
object.push({type: dataType, name: newKey, label: dataLabel, value: value});
}
})
values.push(object);
});
values = {name: index, value: values, type: 'array'};
return values;
}
function submitSettingsForm(form, homepageItem = false){
var list = $( "#"+form ).serializeToJSON();
var size = 0;
var submit = {};
$.each(list, function(i,v) {
var values = false;
if(typeof v === 'object' && typeof v.length === 'undefined'){
values = getSubmitSettingsFormValueObject(form, i, v)
}else{
values = getSubmitSettingsFormValueSingle(form, i, v)
}
size++;
if(values){
submit[i] = values.value;
}
});
var callbacks = $.Callbacks();
// Custom Callbacks
switch(form){
case 'customize-appearance-form':
break;
default:
}
if(size > 0){
organizrAPI2('PUT','api/v2/config', submit,true).success(function(data) {
try {
var response = data.response;
}catch(e) {
organizrCatchError(e,data);
}
if(callbacks){ callbacks.fire(); }
if(homepageItem) {
let html = `
${response.message}
Close Homepage Settings?
Yes
No
`;
swal({
content: createElementFromHTML(html),
buttons: false,
className: 'bg-org'
})
}else{
message('Updated Items',response.message,activeInfo.settings.notifications.position,"#FFF","success","5000");
}
}).fail(function(xhr) {
OrganizrApiError(xhr, 'Update Error');
});
$("#"+form+" :input").each(function(){
var input = $(this);
input.closest('.form-group').removeClass('has-success').removeClass('has-error');
});
$('#'+form+'-save').addClass('hidden');
}else{
$("#"+form+" :input").each(function(){
var input = $(this);
input.closest('.form-group').removeClass('has-success').addClass('has-error');
});
}
}
function submitHomepageOrder(){
var list = $( "#homepage-values" ).serializeToJSON();
var size = 0;
var submit = {};
$.each(list, function(i,v) {
if(v !== ''){
size++;
submit[i] = v;
}
});
var callbacks = $.Callbacks();
if(size > 0){
organizrAPI2('PUT','api/v2/config', submit,true).success(function(data) {
try {
var response = data.response;
$('#submitHomepageOrder-save').addClass('hidden');
}catch(e) {
organizrCatchError(e,data);
}
message('Updated Homepage Order',response.message,activeInfo.settings.notifications.position,"#FFF","success","5000");
if(callbacks){ callbacks.fire(); }
}).fail(function(xhr) {
OrganizrApiError(xhr, 'Update Error');
});
}else{
console.log('add error');
}
}
function submitTabOrder(newTabs){
var data = [];
var process = false;
$.each(newTabs.tab, function(i,v) {
if(v.originalOrder == v.order){
delete newTabs.tab[i];
}else{
let temp = {
"order":v.order,
"id":v.id
}
data.push(temp);
process = true;
}
})
if(!process){
message('Tab Order Warning','Order was not changed - Submission not needed',activeInfo.settings.notifications.position,"#FFF","warning","5000");
$('.saveTabOrderButton').addClass('hidden');
return false;
}
var callbacks = $.Callbacks();
callbacks.add( buildTabEditor );
organizrAPI2('PUT','api/v2/tabs',data,true).success(function(data) {
try {
var response = data.response;
}catch(e) {
organizrCatchError(e,data);
}
message('Tab Order Updated',response.message,activeInfo.settings.notifications.position,"#FFF","success","5000");
if(callbacks){ callbacks.fire(); }
$('.saveTabOrderButton').addClass('hidden');
}).fail(function(xhr) {
OrganizrApiError(xhr, 'Update Error');
});
}
function submitCategoryOrder(){
var data = [];
var categories = $( "#submit-categories-form" ).serializeToJSON();
var callbacks = $.Callbacks();
callbacks.add( buildCategoryEditor );
$.each(categories.category, function(i,v) {
if(v.originalOrder == v.order){
delete categories.category[i];
}else{
let temp = {
"order":v.order,
"id":v.id
}
data.push(temp);
}
})
organizrAPI2('PUT','api/v2/categories',data,true).success(function(data) {
try {
var response = data.response;
}catch(e) {
organizrCatchError(e,data);
}
message('Category Order Updated',response.message,activeInfo.settings.notifications.position,"#FFF","success","5000");
if(callbacks){ callbacks.fire(); }
$('.saveTabOrderButton').addClass('hidden');
}).fail(function(xhr) {
OrganizrApiError(xhr, 'Update Error');
});
}
function buildTR(array,type,badge){
var listing = '';
var arrayItems = array.split("|");
if(hasValue(arrayItems) === true){
$.each(arrayItems, function(i,v) {
listing += `
`+type+`
`+updateIssueLink(v)+`
`;
});
return listing;
}
return ' ';
}
function buildVersion(array){
var x = 0;
var versions = '
Check For Updates
';
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 = '
Installed ';
}else if (x === 0){
button = '
Install Update ';
}
let tableClass = x == 0 ? '' : 'hidden';
let divClassPadding = x == 0 ? '' : 'p-b-0';
let divClassMargin = x == 0 ? '' : 'm-b-0';
let toggleButtonText = x == 0 ? 'Less' : 'More';
let toggleButtonIcon = x == 0 ? 'up' : 'down';
let divStatus = x == 0 ? 'opened' : 'closed';
versions += `
`+button+`
`+i+`
`+moment.utc(v.date, "YYYY-MM-DD hh:mm[Z]").local().fromNow()+`
`+v.title+`
${toggleButtonText}
`;
listing = '';
button = '';
x++;
});
return versions;
}
function toggleGithubVersion(id){
let status = $('.update-main-div-' + id).attr('data-status');
if(status == 'opened'){
$('.update-main-div-' + id).attr('data-status', 'closed');
$('.update-main-div-' + id).addClass('p-b-0');
$('.update-box-title-' + id).addClass('m-b-0');
$('.update-table-' + id).addClass('hidden');
$('.toggleButton-' + id).text('More');
$('.toggleButtonIcon-' + id).removeClass('fa-long-arrow-up').addClass('fa-long-arrow-down');
}else{
$('.update-main-div-' + id).attr('data-status', 'opened');
$('.update-main-div-' + id).removeClass('p-b-0');
$('.update-box-title-' + id).removeClass('m-b-0');
$('.update-table-' + id).removeClass('hidden');
$('.toggleButton-' + id).text('Less');
$('.toggleButtonIcon-' + id).addClass('fa-long-arrow-up').removeClass('fa-long-arrow-down');
}
}
function manualUpdateCheck(){
$('.buttonManualUpdateCheck').addClass('disabled');
$('.buttonManualUpdateCheck i').removeClass('fa-globe').addClass('fa-refresh fa-spin');
setTimeout(function(){ updateCheck(); checkCommitLoad(); }, 1000);
setTimeout(function(){
$('.buttonManualUpdateCheck').removeClass('disabled');
$('.buttonManualUpdateCheck i').removeClass('fa-refresh fa-spin fa-globe').addClass('fa-check');
}, 1500);
return true;
}
function updateCheck(){
githubVersions().success(function(data) {
try {
var response = JSON.parse(data);
}catch(e) {
organizrCatchError(e,data);
}
for (var a in reverseObject(response)){
var latest = a;
break;
}
if(latest !== currentVersion) {
organizrConsole('Update Function','Update to ' + latest + ' is available', 'warning');
if (activeInfo.settings.misc.docker === false) {
messageSingle(window.lang.translate('Update Available'), latest + ' ' + window.lang.translate('is available, goto') + '
Update Tab ', activeInfo.settings.notifications.position, '#FFF', 'update', '60000');
}
}else{
organizrConsole('Update Function','Already running latest version: ' + latest, 'info');
}
$('#githubVersions').html(buildVersion(reverseObject(response)));
}).fail(function(xhr) {
OrganizrApiError(xhr);
});
}
function ignoreNewsId(id){
organizrAPI2('POST','api/v2/news/' + id,{}).success(function(data) {
try {
let response = data.response;
message('News Item','Item now ignored',activeInfo.settings.notifications.position,"#FFF","success","5000");
$('.newsItem-' + id).remove();
$('.newsHeart-' + id).remove();
}catch(e) {
organizrCatchError(e,data);
}
}).fail(function(xhr) {
OrganizrApiError(xhr, 'News');
});
}
function newsLoad(){
newsJSON().success(function(data) {
try {
var response = JSON.parse(data);
var items = [];
var limit = 5;
var count = 0;
organizrAPI2('get','api/v2/news').success(function(data) {
try {
let ignoredIds = data.response.data;
ignoredIds = ignoredIds == null ? [] : ignoredIds;
$.each(response, function(i,v) {
count++;
let ignore = ignoredIds.includes(v.id);
let alertDefined = (typeof v.important !== 'undefined' || v.important === false);
let alert = (alertDefined && ignore == false) ? `
Important Message - Click me to Ignore ` : '';
let heartBeat = (alertDefined && ignore == false) ? `
` : '';
let newBody = `
`+moment(v.date).format('LLL')+ alert +`
`+v.author+`
`+((v.subTitle) ? '
' + v.subTitle +' ' : '' )+`
`+v.body+`
`;
if(count <= limit){
items[i] = {
title:v.title + heartBeat,
body:newBody
}
}
});
var body = buildAccordion(items, true);
$('#organizrNewsPanel').html(body);
}catch(e) {
organizrCatchError(e,data);
}
}).fail(function(xhr) {
OrganizrApiError(xhr, 'News');
});
}catch(e) {
organizrCatchError(e,data);
}
}).fail(function(xhr) {
OrganizrApiError(xhr);
});
}
function checkCommitLoad(){
if(activeInfo.settings.misc.docker && activeInfo.settings.misc.githubCommit !== 'n/a' && activeInfo.settings.misc.githubCommit !== null) {
if(checkCommitLoadStatus == false) {
checkCommitLoadStatus = true;
getLatestCommitJSON().success(function (data) {
try {
var latest = data.sha.toString().trim();
var current = activeInfo.settings.misc.githubCommit.toString().trim();
var link = 'https://github.com/causefx/Organizr/compare/' + current + '...' + latest;
if (latest !== current) {
messageSingle(window.lang.translate('Update Available'), '
Compare Difference or Update Now ', activeInfo.settings.notifications.position, '#FFF', 'update', '600000');
} else {
organizrConsole('Update Function', 'Organizr Docker - Up to date');
}
} catch (e) {
organizrCatchError(e, data);
}
checkCommitLoadStatus = false;
}).fail(function (xhr) {
console.error("Organizr Function: Github Connection Failed");
checkCommitLoadStatus = false;
});
}
}
}
function sponsorLoad(){
sponsorsJSON().success(function(data) {
try {
var response = JSON.parse(data);
}catch(e) {
organizrCatchError(e,data);
}
$('#sponsorList').html(buildSponsor(response));
$('#sponsorListModals').html(buildSponsorModal(response));
$('.sponsor-items').owlCarousel({
nav:false,
autoplay:true,
dots:false,
margin:10,
autoWidth:true,
items:4
});
}).fail(function(xhr) {
OrganizrApiError(xhr);
});
}
function backersLoad(){
organizrAPI2('GET','api/v2/sponsors/all').success(function(data) {
try {
let json = data.response;
$('#backersList').html(buildBackers(json.data));
$('.backers-items').owlCarousel({
nav:false,
autoplay:true,
dots:false,
margin:10,
autoWidth:true,
items:4
});
}catch(e) {
organizrCatchError(e,data);
}
}).fail(function(xhr) {
OrganizrApiError(xhr);
});
}
function buildBackers(array){
let backers = '';
$.each(array, function(i,v) {
if(v.type == 'USER' && v.role == 'BACKER' && v.isActive){
v.name = v.name ? v.name : 'User';
v.image = v.image ? v.image : 'plugins/images/default_user.png';
backers += `
`;
}
});
backers += `
`;
return backers;
}
function sponsorDetails(id){
sponsorsJSON().success(function(data) {
try {
let response = JSON.parse(data);
let coupon = (response[id].coupon == null) ? false : true;
let couponAbout = (response[id].coupon_about == null) ? false : true;
let extraInfo = (coupon && couponAbout) ? `
Coupon Code:
${response[id].coupon}
${response[id].coupon_about}
` : '';
let html = `
${response[id].company_name}
${response[id].company_name}
${response[id].about} ${extraInfo}
`;
swal({
content: createElementFromHTML(html),
buttons: false,
className: 'bg-org'
})
}catch(e) {
organizrCatchError(e,data);
}
}).fail(function(xhr) {
OrganizrApiError(xhr);
});
}
function sponsorAbout(id,array){
var coupon = (array.coupon == null) ? false : true;
var couponAbout = (array.coupon_about == null) ? false : true;
var extraInfo = (coupon && couponAbout) ? `
Coupon Code:
`+array.coupon+`
`+array.coupon_about+`
` : '';
return `
`;
}
function buildSponsor(array){
var sponsors = '';
$.each(array, function(i,v) {
var hasCoupon = '';
if(v.about){
if(v.coupon){
hasCoupon = `
Has Coupon
`;
}
}
var sponsorAboutModal = (v.about) ? 'onclick="sponsorDetails(\''+i+'\');sponsorAnalytics(\''+v.company_name+'\');"' : 'onclick="window.open(\''+ v.website +'\', \'_blank\');sponsorAnalytics(\''+v.company_name+'\');"';
sponsors += `
`;
});
sponsors += `
`;
return sponsors;
}
function buildSponsorModal(array){
var sponsors = '';
$.each(array, function(i,v) {
var sponsorAboutModal = (v.about) ? sponsorAbout(i,v) : '';
sponsors += sponsorAboutModal;
});
return sponsors;
}
function sponsorAnalytics(sponsor_name){
var uuid = activeInfo.settings.misc.uuid;
$.ajax({
type: 'POST',
url: 'https://api.organizr.app/',
data: {
'sponsor_name': sponsor_name,
'user_uuid': uuid,
'cmd': 'sponsor'
},
cache: false,
async: true,
complete: function(xhr, status) {
if (xhr.status === 200) {
let result = $.parseJSON(xhr.responseText);
}
}
});
}
function themeAnalytics(theme_name){
var uuid = activeInfo.settings.misc.uuid;
$.ajax({
type: 'POST',
url: 'https://api.organizr.app/',
data: {
'theme_name': theme_name,
'user_uuid': uuid,
'cmd': 'theme'
},
cache: false,
async: true,
complete: function(xhr, status) {
if (xhr.status === 200) {
let result = $.parseJSON(xhr.responseText);
}
}
});
}
function getOrganizrBackups(){
organizrAPI2('GET','api/v2/backup').success(function(data) {
try {
let json = data.response;
$('#backup-file-list').html(buildOrganizrBackups(json.data));
}catch(e) {
organizrCatchError(e,data);
}
}).fail(function(xhr) {
OrganizrApiError(xhr);
});
}
function createOrganizrBackup(){
$('#settings-settings-backup').block({
message: '
Backing up...
',
css: {
color: '#fff',
border: '1px solid #5761a9',
backgroundColor: '#707cd2'
}
});
organizrAPI2('POST','api/v2/backup',{}).success(function(data) {
try {
let response = data.response;
if(response){
getOrganizrBackups();
}
}catch(e) {
organizrCatchError(e,data);
}
$('#settings-settings-backup').unblock();
}).fail(function(xhr) {
$('#settings-settings-backup').unblock();
OrganizrApiError(xhr, 'Backup Error');
});
}
function buildOrganizrBackups(array){
let list = '';
if(array.total_files > 0) {
$.each(array.files, function (i, v) {
i++;
let pattern = /\[[^\]]*\]/mg;
let version = (typeof v.name.match(pattern)[1] !== 'undefined') ? v.name.match(pattern)[1] : 'N/A';
list += `
${i}
${v.name}
${version}
${v.size}
${moment.utc(v.date, "YYYY-MM-DD hh:mm[Z]").local().fromNow()}
|
`;
});
}else{
list = '
No Backups made yet ';
}
$('#backup-total-files').html(array.total_files);
$('#backup-total-size').html(array.total_size);
return list;
}
function updateBar(){
return `
If error occurs - Use Esc key to close modal
`;
}
function showUpdateBar(){
swal({
content: createElementFromHTML(updateBar()),
buttons: false,
className: 'bg-org',
closeOnClickOutside: false,
})
}
function updateUpdateBar(title,percent,update=false){
$('#update-title').text(title);
$('#update-bar').text(percent);
$('#update-bar').css('width',percent);
if(update){
$('#update-time').removeClass('hidden');
countdown(10);
}
}
function countdown(remaining) {
if(remaining === 0){
local('set','message','Organizr Update|Update Successful|update');
location.reload(true);
}
$('#update-seconds').text(remaining);
setTimeout(function(){ countdown(remaining - 1); }, 1000);
}
function dockerUpdate(){
if(activeInfo.settings.misc.docker){
showUpdateBar();
updateUpdateBar('Starting Download','20%');
messageSingle(window.lang.translate('[DO NOT CLOSE WINDOW]'),window.lang.translate('Starting Update Process'),activeInfo.settings.notifications.position,'#FFF','success','60000');
organizrAPI2('GET','api/v2/update/docker').success(function(data) {
updateUpdateBar('Restarting Organizr in', '100%', true);
messageSingle(window.lang.translate('[DO NOT CLOSE WINDOW]'),'Update complete',activeInfo.settings.notifications.position,'#FFF','success','60000');
}).fail(function(xhr) {
OrganizrApiError(xhr, 'Update Error');
});
}
}
function windowsUpdate(){
if(activeInfo.serverOS == 'win'){
showUpdateBar();
updateUpdateBar('Starting Download','20%');
messageSingle(window.lang.translate('[DO NOT CLOSE WINDOW]'),window.lang.translate('Starting Update Process'),activeInfo.settings.notifications.position,'#FFF','success','60000');
organizrAPI2('GET','api/v2/update/windows').success(function(data) {
updateUpdateBar('Restarting Organizr in', '100%', true);
messageSingle(window.lang.translate('[DO NOT CLOSE WINDOW]'),'Update complete',activeInfo.settings.notifications.position,'#FFF','success','60000');
}).fail(function(xhr) {
OrganizrApiError(xhr, 'Update Error');
});
}
}
function updateNow(){
clearAJAX();
if(activeInfo.settings.misc.docker){
dockerUpdate();
return false;
}
if(activeInfo.serverOS === 'win'){
windowsUpdate();
return false;
}
organizrConsole('Update Function','Starting Update Process');
showUpdateBar();
updateUpdateBar('Starting Download','5%');
messageSingle(window.lang.translate('[DO NOT CLOSE WINDOW]'),window.lang.translate('Starting Update Process'),activeInfo.settings.notifications.position,'#FFF','success','60000');
organizrAPI2('GET','api/v2/update/download/'+ activeInfo.branch).success(function(data) {
updateUpdateBar('Starting Unzip', '50%');
messageSingle(window.lang.translate('[DO NOT CLOSE WINDOW]'), window.lang.translate('Update File Downloaded'), activeInfo.settings.notifications.position, '#FFF', 'success', '60000');
organizrAPI2('GET','api/v2/update/unzip/'+ activeInfo.branch).success(function(data) {
updateUpdateBar('Starting Copy', '70%');
messageSingle(window.lang.translate('[DO NOT CLOSE WINDOW]'), window.lang.translate('Update File Unzipped'), activeInfo.settings.notifications.position, '#FFF', 'success', '60000');
organizrAPI2('GET','api/v2/update/move/'+ activeInfo.branch).success(function(data) {
updateUpdateBar('Starting Cleanup', '90%');
messageSingle(window.lang.translate('[DO NOT CLOSE WINDOW]'), window.lang.translate('Update Files Copied'), activeInfo.settings.notifications.position, '#FFF', 'success', '60000');
organizrAPI2('GET','api/v2/update/cleanup/'+ activeInfo.branch).success(function(data) {
updateUpdateBar('Restarting Organizr in', '100%', true);
messageSingle(window.lang.translate('[DO NOT CLOSE WINDOW]'), window.lang.translate('Update Cleanup Finished'), activeInfo.settings.notifications.position, '#FFF', 'success', '60000');
}).fail(function (xhr) {
OrganizrApiError(xhr, 'Update Error');
});
}).fail(function (xhr) {
OrganizrApiError(xhr, 'Update Error');
});
}).fail(function (xhr) {
OrganizrApiError(xhr, 'Update Error');
});
}).fail(function(xhr) {
OrganizrApiError(xhr, 'Update Error');
});
}
function settingsAPI2(post, callbacks=null, asyncValue=true){
organizrAPI2('POST',post.api,post.data,asyncValue).success(function(data) {
try {
var response = JSON.parse(data);
}catch(e) {
organizrCatchError(e,data);
}
message(post.messageTitle,post.messageBody,activeInfo.settings.notifications.position,"#FFF","success","5000");
if(callbacks){ callbacks.fire(); }
}).fail(function(xhr) {
console.error(post.error);
});
}
$.xhrPool.abortAll = function(url) {
$(this).each(function(i, jqXHR) { // cycle through list of recorded connection
if (!url || url === jqXHR.requestURL) {
organizrConsole('Organizr API Abort',jqXHR.requestURL,'info');
jqXHR.abort(); // aborts connection
$.xhrPool.splice(i, 1); // removes from list by index
}
});
};
$.ajaxPrefilter(function(options, originalOptions, jqXHR) {
//organizrConsole('Organizr API Function',options.url,'info');
jqXHR.requestURL = options.url;
});
function organizrAPI2(type,path,data=null,asyncValue=true){
$.xhrPool.abortAll(path);
var timeout = 10000;
switch(path){
case 'api/v2/windows/update':
case 'api/v2/docker/update':
timeout = 240000;
break;
default:
timeout = 60000;
}
switch (type) {
case 'get':
case 'GET':
case 'g':
return $.ajax({
url:path,
method:"GET",
beforeSend: function(request) {
request.setRequestHeader("Token", activeInfo.token);
request.setRequestHeader("formKey", local('g','formKey'));
$.xhrPool.push(request);
},
complete: function(jqXHR) {
var i = $.xhrPool.indexOf(jqXHR); // get index for current connection completed
if (i > -1) $.xhrPool.splice(i, 1); // removes from list by index
},
timeout: timeout,
});
case 'delete':
case 'DELETE':
case 'd':
return $.ajax({
url:path,
method:"DELETE",
beforeSend: function(request) {
request.setRequestHeader("Token", activeInfo.token);
request.setRequestHeader("formKey", local('g','formKey'));
$.xhrPool.push(request);
},
complete: function(jqXHR) {
var i = $.xhrPool.indexOf(jqXHR); // get index for current connection completed
if (i > -1) $.xhrPool.splice(i, 1); // removes from list by index
},
timeout: timeout,
});
case 'post':
case 'POST':
case 'p':
data.formKey = local('g','formKey');
return $.ajax({
url:path,
method:"POST",
async: asyncValue,
beforeSend: function(request) {
request.setRequestHeader("Token", activeInfo.token);
request.setRequestHeader("formKey", local('g','formKey'));
$.xhrPool.push(request);
},
complete: function(jqXHR) {
var i = $.xhrPool.indexOf(jqXHR); // get index for current connection completed
if (i > -1) $.xhrPool.splice(i, 1); // removes from list by index
},
data:data
});
case 'put':
case 'PUT':
data.formKey = local('g','formKey');
return $.ajax({
url:path,
method:"PUT",
async: asyncValue,
beforeSend: function(request) {
request.setRequestHeader("Token", activeInfo.token);
request.setRequestHeader("formKey", local('g','formKey'));
$.xhrPool.push(request);
},
complete: function(jqXHR) {
var i = $.xhrPool.indexOf(jqXHR); // get index for current connection completed
if (i > -1) $.xhrPool.splice(i, 1); // removes from list by index
},
data:JSON.stringify(data),
contentType: "application/json"
});
default:
console.warn('Organizr API: Method Not Supported');
}
}
function loadSettingsPage2(api,element,organizrFn){
organizrAPI2('get',api).success(function(data) {
try {
var response = data.response;
}catch(e) {
organizrCatchError(e,data);
}
organizrConsole('Organizr Function','Loading '+organizrFn);
$(element).html(response.data);
}).fail(function(xhr) {
OrganizrApiError(xhr);
});
}
function loadInternal(url,tabName, split = null){
let extra = split ? 'right-' : '';
organizrAPI2('get',url).success(function(data) {
try {
var html = data.response;
$('#internal-'+extra+tabName).html(html.data);
}catch(e) {
organizrCatchError(e,data);
}
}).fail(function(xhr) {
OrganizrApiError(xhr);
});
}
function loadInternalOriginal(url,tabName){
organizrAPI('get',url).success(function(data) {
try {
var html = JSON.parse(data);
}catch(e) {
organizrCatchError(e,data);
}
$('#internal-'+tabName).html(html.data);
}).fail(function(xhr) {
OrganizrApiError(xhr);
});
}
function loadSettingsPage(api,element,organizrFn){
organizrAPI('get',api).success(function(data) {
try {
var response = JSON.parse(data);
}catch(e) {
organizrCatchError(e,data);
}
organizrConsole('Organizr Function','Loading '+organizrFn);
$(element).html(response.data);
}).fail(function(xhr) {
OrganizrApiError(xhr);
});
}
function settingsAPI(post, callbacks=null, asyncValue=true){
organizrAPI('POST',post.api,post,asyncValue).success(function(data) {
try {
var response = JSON.parse(data);
}catch(e) {
organizrCatchError(e,data);
}
message(post.messageTitle,post.messageBody,activeInfo.settings.notifications.position,"#FFF","success","5000");
if(callbacks){ callbacks.fire(); }
}).fail(function(xhr) {
console.error(post.error);
});
}
function organizrAPI(type,path,data=null,asyncValue=true){
var timeout = 10000;
switch(path){
case 'api/?v1/windows/update':
case 'api/?v1/docker/update':
timeout = 120000;
break;
default:
timeout = 60000;
}
switch (type) {
case 'get':
case 'GET':
case 'g':
return $.ajax({
url:path,
method:"GET",
beforeSend: function(request) {
request.setRequestHeader("Token", activeInfo.token);
request.setRequestHeader("formKey", local('g','formKey'));
},
timeout: timeout,
});
break;
case 'post':
case 'POST':
case 'p':
data.formKey = local('g','formKey');
return $.ajax({
url:path,
method:"POST",
async: asyncValue,
beforeSend: function(request) {
request.setRequestHeader("Token", activeInfo.token);
request.setRequestHeader("formKey", local('g','formKey'));
},
data:{
data: data,
}
});
default:
console.warn('Organizr API: Method Not Supported');
}
}
function githubVersions() {
return $.ajax({
url: "https://raw.githubusercontent.com/causefx/Organizr/"+activeInfo.branch+"/js/version.json",
});
}
function sponsorsJSON() {
return $.ajax({
url: "https://raw.githubusercontent.com/causefx/Organizr/v2-develop/js/sponsors.json",
});
}
function newsJSON() {
return $.ajax({
url: "https://raw.githubusercontent.com/causefx/Organizr/v2-develop/js/news.json",
});
}
function getLatestCommitJSON() {
return $.ajax({
url: "https://api.github.com/repos/causefx/Organizr/commits/"+activeInfo.branch,
});
}
function marketplaceJSON(type) {
return $.ajax({
url: "https://raw.githubusercontent.com/causefx/Organizr/v2-"+type+"/"+type+".json",
});
}
function allIcons() {
return $.ajax({
url: "js/icons.json",
});
}
function organizrConnect(path){
return $.ajax({
url: path,
});
}
function changeSettingsMenu(path){
var menuItems = path.split("::");
var menu = '';
if(Array.isArray(menuItems)){
$.each(menuItems, function(i,v) {
menu += '
'+v+' ';
});
}
$('#settingsBreadcrumb').html(menu);
}
function buildWizard(){
organizrAPI2('GET','api/v2/page/wizard').success(function(data) {
try {
var json = data.response;
}catch(e) {
organizrCatchError(e,data);
}
organizrConsole('Organizr Function','Starting Install Wizard');
$(json.data).appendTo($('.organizr-area'));
$('.organizr-area').removeClass('hidden');
}).fail(function(xhr) {
OrganizrApiError(xhr, 'Wiizard Error');
});
$("#preloader").fadeOut();
}
function buildDependencyCheck(orgdata){
organizrAPI2('GET', 'api/v2/page/dependencies').success(function(data) {
try {
var json = data.response;
}catch(e) {
organizrCatchError(e,data);
}
organizrConsole('Organizr Function','Starting Dependencies Check');
$(json.data).appendTo($('.organizr-area'));
$('.organizr-area').removeClass('hidden');
$(buildBrowserInfo()).appendTo($('#browser-info'));
$('#web-folder').html(buildWebFolder(orgdata));
$('#php-version-check').html(buildPHPCheck(orgdata));
$(buildDependencyInfo(orgdata)).appendTo($('#depenency-info'));
}).fail(function(xhr) {
OrganizrApiError(xhr, 'Dependency Error');
});
$("#preloader").fadeOut();
}
function buildDependencyInfo(arrayItems){
let listing = '';
$.each(arrayItems.data.status.dependenciesActive, function(i,v) {
listing += '
'+v+'';
});
$.each(arrayItems.data.status.dependenciesInactive, function(i,v) {
listing += '
'+v+'';
});
let className = (arrayItems.data.status.dependenciesInactive.length !== 0) ? 'bg-danger text-warning' : 'bg-primary';
let icon = (arrayItems.data.status.dependenciesInactive.length !== 0) ? 'fa fa-exclamation-triangle' : 'fa fa-check-circle';//dependency-dependencies-check-listing-header
let header = (arrayItems.data.status.dependenciesInactive.length !== 0) ? 'panel-danger' : 'panel-info';
let listingIcon = (arrayItems.data.status.dependenciesInactive.length !== 0) ? 'ti-alert' : 'ti-check-box';
let listingText = (arrayItems.data.status.dependenciesInactive.length !== 0) ? 'Dependencies Missing' : 'Dependencies OK';
$('.dependency-dependencies-check-listing-header').removeClass('panel-danger').addClass(header);
$('.dependency-dependencies-check-listing i').first().removeClass('ti-alert').addClass(listingIcon);
$('.dependency-dependencies-check-listing span').text(listingText);
$('.dependency-dependencies-check').removeClass('bg-warning').addClass(className);
$('.dependency-dependencies-check i').removeClass('fa fa-spin fa-spinner').addClass(icon);
return listing;
}
function buildWebFolder(arrayItems){
let writable = 'Not Writable - Please fix permissions';
let className = 'bg-danger text-warning';
let icon = 'fa fa-exclamation-triangle';
if(arrayItems.data.status.writable == 'yes'){
writable = 'Writable - All Good';
className = 'bg-primary';
icon = 'fa fa-check-circle';
}
$('.dependency-permissions-check').removeClass('bg-warning').addClass(className);
$('.dependency-permissions-check i').removeClass('fa fa-spin fa-spinner').addClass(icon);
$('#web-folder').addClass(className);
return writable;
}
function buildPHPCheck(arrayItems){
let phpTest = 'Upgrade PHP Version to 7.2+';
let className = 'bg-danger text-warning';
let icon = 'fa fa-exclamation-triangle';
if(arrayItems.data.status.minVersion == 'yes'){
phpTest = 'PHP Version Approved';
className = 'bg-primary';
icon = 'fa fa-check-circle';
}
$('.dependency-phpversion-check').removeClass('bg-warning').addClass(className);
$('.dependency-phpversion-check i').removeClass('fa fa-spin fa-spinner').addClass(icon);
$('#php-version-check').addClass(className);
$('#php-version-check-user').html('
Webserver User : ' + arrayItems.data.status.php_user)
return phpTest;
}
function buildBrowserInfo(){
var listing = '';
$.each(activeInfo, function(i,v) {
listing += `
`+i+`
`+tof(v)+`
`;
});
return `
`;
}
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
Success ';
break;
case "info":
return 'Info ';
break;
case "debug":
return 'Debug ';
break;
case "warning":
return 'Warning ';
break;
case "error":
return 'Error ';
break;
default:
return 'Warning ';
}
}
function radioLoop(element){
$('[type=radio][id!="'+element.id+'"]').each(function() { this.checked=false });
}
function loadAppearance(appearance){
var cssSettings = '';
document.title = appearance.title;
if(appearance.useLogo === false){
$('#main-logo').html(appearance.title);
$('#side-logo').html(appearance.title);
}else{
$('#main-logo').html(' ');
$('#side-logo').html(' ');
}
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(`+randomCSV(appearance.loginWallpaper)+`) center center/cover no-repeat!important;
height: 100%;
position: fixed;
}
.lock-screen {
background: url(`+randomCSV(appearance.loginWallpaper)+`) center center/cover no-repeat!important;
height: 100%;
position: fixed;
z-index: 1001;
top: 0;
width: 100%;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
-o-user-select: none;
user-select: none;
}
`;
}
if(activeInfo['settings']['misc']['autoExpandNavBar'] == false){
cssSettings += `
@media only screen and (min-width: 768px) {
.sidebar:hover .hide-menu {
display: none;
}
.sidebar:hover .sidebar-head,
.sidebar:hover {
width: 60px;
}
.sidebar:hover .nav-second-level li a {
padding-left: 15px;
}
}
`;
}
if(cssSettings !== ''){
$('#user-appearance').html(cssSettings);
}
if(appearance.customThemeCss !== ''){
$('#custom-theme-css').html(appearance.customThemeCss);
}
if(appearance.customCss !== ''){
$('#custom-css').html(appearance.customCss);
}
}
function randomCSV(values){
if(typeof values == 'string'){
if(values.includes(',')){
var csv = values.split(',');
var luckyNumber = Math.floor(Math.random() * csv.length);
return csv[luckyNumber];
}else{
return values;
}
}
return false;
}
function loadCustomJava(appearance){
if(appearance.customThemeJava !== ''){
$('#custom-theme-javascript').html(appearance.customThemeJava);
}
if(appearance.customJava !== ''){
$('#custom-javascript').html(appearance.customJava);
}
}
function clearForm(form){
$(form+" input[type=text]").each(function() {
$(this).val('');
});
$(form+" input[type=password]").each(function() {
$(this).val('');
});
}
function checkMessage(){
var check = (local('get','message')) ? local('get','message') : false;
if(check){
local('remove', 'message');
var message = check.split('|');
messageSingle(window.lang.translate(message[0]),window.lang.translate(message[1]),activeInfo.settings.notifications.position,'#FFF',message[2],'10000');
}
}
function setError(error){
local('set','error',error);
var url = window.location.href.split('?')[0];
url = url.split('#')[0];
window.location.href = url+'?error';
}
function buildErrorPage(error){
var description = '';
var message = '';
var color = '';
switch (error) {
case '401':
description = 'Unauthorized';
message = 'Look, you dont belong here';
color = 'danger';
break;
case '404':
description = 'Not Found';
message = 'I think I lost it...';
color = 'primary';
break;
default:
description = 'Something happened';
message = 'But I dont know what';
color = 'muted';
}
return `
`+error+`
`+description+`
`+message+`
OK
`;
}
$.urlParam = function(name){
var results = new RegExp('[\?&]' + name + '=([^]*)').exec(window.location.href);
if (results==null){
return null;
}
else{
return decodeURI(results[1]) || 0;
}
};
function errorPage(error=null,uri=null){
if(error){
local('set','error',error);
}
if(uri){
local('set','uri',uri);
}
//var urlParams = new URLSearchParams(window.location.search);
if($.urlParam('error') !== null && !isNaN(Number($.urlParam('error')))){
local('set','error',$.urlParam('error'));
}
if($.urlParam('return') !== null && activeInfo.user.loggedin !== true){
local('set','uri',$.urlParam('return'));
}
if ( window.location !== window.parent.location ) {
var count = 0;
for (var k in window.parent.location) {
if (window.parent.location.hasOwnProperty(k)) {
++count;
}
}
if(count == 0 || count == 'undefined'){
return false;
}
var iframeError = local('get', 'error');
parent.errorPage(iframeError);
local('remove', 'uri');
$('html').html('');
return false;
}
if(local('get', 'error')){
//show error page
$('.error-page').html(buildErrorPage(local('get', 'error')));
$('.error-page').fadeIn();
local('remove', 'error');
window.history.pushState({}, document.title, "./" );
}
}
function uriRedirect(uri=null){
if(uri){
local('set','uri',uri);
}
if(activeInfo.user.loggedin === true && activeInfo.user.locked !== 1){
var redirect = local('get', 'uri');
local('remove', 'uri');
if(redirect !== null){
window.location.href = decodeURIComponent(decodeURI(redirect));
}
}
}
function changeTheme(theme){
//$("#preloader").fadeIn();
$('#theme').attr({
href: 'css/themes/' + theme + '.css?v='+activeInfo.version
});
//$("#preloader").fadeOut();
console.info("%c Theme %c ".concat(theme, " "), "color: white; background: #AD80FD; font-weight: 700;", "color: #AD80FD; background: white; font-weight: 700;");
}
function changeStyle(style){
//$("#preloader").fadeIn();
$('#style').attr({
href: 'css/' + style + '.min.css?v='+activeInfo.version
});
//$("#preloader").fadeOut();
console.info("%c Style %c ".concat(style, " "), "color: white; background: #AD80FD; font-weight: 700;", "color: #AD80FD; background: white; font-weight: 700;");
}
function setSSO(){
$.each(activeInfo.sso, function(i,v) {
if(v !== false){
local('set', i, v);
}else{
local('r', i);
}
});
// other items to remove
$.each(localStorage, function(i,v) {
if(typeof v == 'string'){
if(i.startsWith('user-')){
if(typeof activeInfo.sso[i] == 'undefined'){
local('r', i);
}
}
}
});
}
function buildStreamItem(array,source){
var cards = '';
var count = 0;
var total = array.length;
var sourceIcon = (source === 'jellyfin') ? 'fish' : source;
var streamDetails = {
direct: 0,
transcode: 0
};
var bandwidthDetails = {
wan: 0,
lan: 0
};
cards += '';
$.each(array, function(i,v) {
var icon = '';
var width = 100;
var bg = '';
count++;
v.nowPlayingImageURL = (v.useImage) ? v.useImage : v.nowPlayingImageURL;
switch (v.type) {
case 'music':
icon = 'icon-music-tone-alt';
width = (v.nowPlayingImageURL !== 'plugins/images/cache/no-np.png') ? 56 : 100;
bg = (v.nowPlayingImageURL !== 'plugins/images/cache/no-np.png') ? `
` : '';
break;
case 'movie':
icon = 'icon-film';
break;
case 'tv':
icon = 'icon-screen-desktop';
break;
case 'video':
icon = 'icon-screen-film';
break;
default:
}
var userThumb = (v.userThumb) ? '
' : '';
if(v.sessionType == 'Direct Playing'){
var userStream = 'Direct Play';
var userVideo = 'Direct Play';
var userAudio = 'Direct Play';
streamDetails['direct'] = streamDetails['direct'] + 1;
}else{
var userStream = v.userStream.stream;
var userVideo = v.userStream.videoDecision+' ('+v.userStream.sourceVideoCodec+'
'+v.userStream.videoCodec+' '+v.userStream.videoResolution+')';
var userAudio = v.userStream.audioDecision+' ('+v.userStream.sourceAudioCodec+'
'+v.userStream.audioCodec+')';
streamDetails['transcode'] = streamDetails['transcode'] + 1;
}
var streamInfo = '';
streamInfo += `
Stream: `+userStream+`
`;
streamInfo += (v.userStream.videoResolution) ? `
Video: `+userVideo+`
` : '';
streamInfo += `
Audio: `+userAudio+`
`;
v.session = v.session.replace(/[\W_]+/g,"-");
bandwidthDetails[v.bandwidthType] = bandwidthDetails[v.bandwidthType] + parseFloat(v.bandwidth);
cards += `
`+bg+`
`+v.nowPlayingTitle+`
`+v.nowPlayingBottom+`
`+v.user+`
`;
});
cards += '
';
cards += buildStreamTooltip(bandwidthDetails, streamDetails, source);
return cards;
}
function buildStreamTooltip(bandwidth, streams, type){
var html = '';
var streamText = 'Streams: ';
var bandwidthText = ' | Bandwidth: ';
var bandwidthTotal = parseFloat(bandwidth['wan']) + parseFloat(bandwidth['lan']);
if(type !== 'plex'){
bandwidthText += (parseFloat(bandwidth['wan']) / 1000).toFixed(1) + ' Mbps';
}else{
bandwidthText += (parseFloat(bandwidthTotal) / 1000).toFixed(1) + ' Mbps';
if(bandwidth['wan'] !== 0){
bandwidthText += ' | WAN: ' + (parseFloat(bandwidth['wan']) / 1000).toFixed(1) + ' Mbps';
}
if(bandwidth['lan'] !== 0){
bandwidthText += ' | LAN: ' + (parseFloat(bandwidth['lan']) / 1000).toFixed(1) + ' Mbps';
}
}
var spacer = '';
if(streams['direct'] !== 0){
streamText += streams['direct'] + ' Direct Play(s)';
spacer = ' & '
}
if(streams['transcode'] !== 0){
streamText += spacer + streams['transcode'] + ' Transcode(s)';
}
html += ' ';
return `
`;
}
function buildRecentItem(array, type, extra=null){
var items = '';
$.each(array, function(i,v) {
if(extra == null){
var className = '';
var extraImg = '';
switch (v.type) {
case 'music':
className = 'recent-cover recent-item recent-music';
extraImg = ' ';
break;
case 'movie':
className = 'recent-poster recent-item recent-movie';
break;
case 'tv':
className = 'recent-poster recent-item recent-tv';
break;
case 'video':
className = 'recent-poster recent-item recent-video';
break;
default:
}
items += `
`;
}else{
items += `
`;
}
});
return items;
}
function buildPlaylistItem(array, type, extra=null){
var items = '';
$.each(array, function(i,v) {
if(i !== 'title'){
if(extra == null){
items += `
`;
}else{
items += `
`;
}
}
});
return items;
}
function buildRequestAdminMenuItem(value,category,id,type){
var action = '';
var text = '';
var extra = '';
switch (category) {
case 'approved':
if(value){
//nada
}else{
action = 'approve';
text = 'Approve';
extra = `Deny `;
}
break;
case 'available':
if(value){
action = 'unavailable';
text = 'Mark as Unavailable';
}else{
action = 'available';
text = 'Mark as Available';
}
break;
default:
}
return (action) ? ``+text+` `+extra : '';
}
function buildRequestItem(array, extra=null){
var items = '';
$.each(array, function(i,v) {
if(extra == null){
var approveID = (v.type == 'tv') ? v.id : v.request_id;
var iconType = (v.type == 'tv') ? 'fa-tv ' : 'fa-film';
var badge = '';
var badge2 = '';
var bg = (v.background.includes('.')) ? v.background : 'plugins/images/cache/no-np.png';
v.user = (activeInfo.settings.homepage.ombi.alias) ? v.userAlias : v.user;
//Set Status
var status = (v.approved) ? 'Approved ' : 'Unapproved ';
status += (v.available) ? 'Available ' : 'Unavailable ';
status += (v.denied) ? 'Denied ' : '';
//Set Class
var className = (v.approved) ? 'request-approved' : 'request-unapproved';
className += (v.available) ? ' request-available' : ' request-unavailable';
className += (v.denied) ? ' request-denied' : ' request-notdenied';
//Set badge
badge = (v.approved) ? 'bg-info' : 'bg-warning';
badge = (v.denied) ? 'bg-danger' : badge;
badge2 = (v.available) ? 'bg-success' : 'bg-danger';
//Is Admin?
var adminFunctions = `
`;
adminFunctions = (activeInfo.user.groupID <= 1) ? adminFunctions : '';
var user = (activeInfo.user.groupID <= 1) ? 'Requested By: '+v.user : '';
var user2 = (activeInfo.user.groupID <= 1) ? ' '+v.user : '';
var divId = (v.type == 'movie') ? v.request_id : v.id;
items += `
`;
}else{
items += `
`;
}
});
return ((items !== '') || extra == null) ? items : 'No items ';
}
function buildStream(array, type){
var streams = (typeof array.content !== 'undefined') ? array.content.length : false;
var originalType = type;
//type = (type === 'emby' && activeInfo.settings.homepage.media.jellyfin) ? 'jellyfin' : type;
return (streams) ? `
Active `+toUpper(type)+` Streams : `+streams+`
`+buildStreamItem(array.content, type)+`
` : '';
}
function buildRecent(array, type){
var recent = (typeof array.content !== 'undefined') ? true : false;
array.content = (recent) ? Object.values(array.content) : false;
var movie = (recent) ? (array.content.filter(p => p.type == "movie").length > 0 ? true : false) : false;
var tv = (recent) ? (array.content.filter(p => p.type == "tv").length > 0 ? true : false) : false;
var video = (recent) ? (array.content.filter(p => p.type == "video").length > 0 ? true : false) : false;
var music = (recent) ? (array.content.filter(p => p.type == "music").length > 0 ? true : false) : false;
var dropdown = '';
var header = '';
var headerAlt = '';
var refreshType = type;
//type = (type === 'emby' && activeInfo.settings.homepage.media.jellyfin) ? 'jellyfin' : type;
dropdown += (recent && movie) ? `Movies ` : '';
dropdown += (recent && tv) ? `Shows ` : '';
dropdown += (recent && video) ? `Videos ` : '';
dropdown += (recent && music) ? `Music ` : '';
var dropdownMenu = `
`;
if(activeInfo.settings.homepage.options.alternateHomepageHeaders){
var headerAlt = `
Recently Added :
`+dropdownMenu+`
`;
}else{
var header = `
Recently Added
`+dropdownMenu+`
`;
}
return (recent) ? `
`+headerAlt+`
`+header+`
`+buildRecentItem(array.content, type)+`
`+buildRecentItem(array.content, type, true)+`
` : '';
}
function owlChange(elm,action){
switch (action){
case 'next':
$('.'+elm).trigger('next.owl');
break;
case 'previous':
$('.'+elm).trigger('prev.owl');
break;
default:
return false;
}
return false;
}
function cleanPlaylistTitle(string){
var test = string.split('.');
if(test.length > 1){
if(!isNaN(test[0])){
return test[1];
}
}
return string;
}
function buildPlaylist(array, type){
var playlist = (typeof array.content !== 'undefined') ? Object.keys(array.content).length : false;
var dropdown = '';
var first = '';
var firstButton = '';
var hidden = '';
var count = 0;
var items = '';
var header = '';
var headerAlt = '';
if(playlist){
$.each(array.content, function(i,v) {
v.title = cleanPlaylistTitle(v.title);
count ++;
first = (count == 1) ? v.title : first;
firstButton = (count == 1) ? i+'-playlist' : firstButton;
hidden = (count == 1) ? '' : ' owl-hidden hidden';
dropdown += ``+v.title+` `;
items += `
`+buildPlaylistItem(v, type)+`
`+buildPlaylistItem(v, type, true)+`
`;
});
var builtDropdown = `
`;
}
if(activeInfo.settings.homepage.options.alternateHomepageHeaders){
var headerAlt = `
`+first+` :
`+builtDropdown+`
`;
}else{
var header = `
`+first+`
`+builtDropdown+`
`;
}
return (playlist) ? `
` : '';
}
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 = `
Requests :
`+builtDropdown+`
`;
}else{
var header = `
Requests
`+builtDropdown+`
`;
}
return (requests) ? `
`+headerAlt+`
`+header+`
`+buildRequestItem(array.content)+`
`+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 = '';
});
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 = `
`;
}
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 = `
`;
}
var buttons = `
`+total+`
`+movie+`
`+tv+`
`;
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");
});*/
ombiActions(id,'add',type);
}else{
ombiActions(id,'add',type);
}
}
//Ombi actions
function ombiActions(id,action,type){
var msg = (activeInfo.user.groupID <= 1) ? 'Not Org Fault - Ask Ombi ' : 'Connection Error to Request Server';
ajaxloader('.request-' + id + '-div', 'in');
ajaxloader('.preloader-' + id, 'in');
//$.magnificPopup.close();
messageSingle(window.lang.translate('Submitting Action to Ombi'),'',activeInfo.settings.notifications.position,"#FFF",'success',"10000");
var callbacks = $.Callbacks();
switch (action){
case 'add':
var method = 'POST';
var apiUrl = 'api/v2/homepage/ombi/requests/'+type+'/' + id;
var data = {};
callbacks.add( homepageRequests );
break;
case 'available':
case 'unavailable':
case 'approve':
var method = 'POST';
var apiUrl = 'api/v2/homepage/ombi/requests/'+type+'/' + id + '/' + action;
var data = {};
callbacks.add( homepageRequests );
break;
case 'deny':
var method = 'PUT';
var apiUrl = 'api/v2/homepage/ombi/requests/'+type+'/' + id + '/' + action;
var data = {};
callbacks.add( homepageRequests );
break;
case 'delete':
var method = 'DELETE';
var apiUrl = 'api/v2/homepage/ombi/requests/'+type+'/' + id;
var data = {};
callbacks.add( homepageRequests );
break;
default:
console.log(id,action,type);
return false;
}
organizrAPI2(method,apiUrl,data).success(function(data) {
try {
let response = data.response;
messageSingle(response.message,'',activeInfo.settings.notifications.position,"#FFF","success","5000");
if(callbacks){ callbacks.fire(); }
ajaxloader();
}catch(e) {
organizrCatchError(e,data);
}
}).fail(function(xhr) {
ajaxloader();
OrganizrApiError(xhr, 'Ombi Error');
});
}
function doneTyping () {
let title = $('#request-input').val();
if(title == ''){
return false;
}
var page = ($('#request-page').val()) ? $('#request-page').val() : 1;
if(typeof searchTerm !== 'undefined'){
if(searchTerm !== $('#request-input').val()){
page = 1;
}
}
ajaxloader('.search-div', 'in');
searchTerm = title;
$('#request-page').val(page);
requestSearch(title, page).success(function(data) {
$('#request-results').html(buildRequestResult(data,'',title,page,true));
if(bowser.mobile !== true){
$('.resultBox-inside').slimScroll({
height: '100%',
position: 'right',
size: "5px",
color: '#dcdcdc'
});
}
$('.mfp-wrap').animate({
scrollTop: '0'
}, 500);
ajaxloader();
}).fail(function(xhr) {
OrganizrApiError(xhr, 'TMDB Error');
ajaxloader();
});
}
function requestList (list, type, page=1) {
ajaxloader('.search-div', 'in');
requestSearchList(list,page).success(function(data) {
if(typeof data.results !== 'undefined'){
var results = data.results;
}else if(typeof data.items !== 'undefined'){
var results = data.items;
}
$('#request-results').html(buildRequestResult(data, type, list, page));
if(bowser.mobile !== true){
$('.resultBox-inside').slimScroll({
height: '100%',
position: 'right',
size: "5px",
color: '#dcdcdc'
});
}
$('.mfp-wrap').animate({
scrollTop: '0'
}, 500);
ajaxloader();
}).fail(function(xhr) {
OrganizrApiError(xhr, 'TMDB Error');
ajaxloader();
});
}
function buildDownloaderItem(array, source, type='none'){
var queue = '';
var count = 0;
var history = '';
switch (source) {
case 'jdownloader':
if(array.content === false){
queue = 'Connection Error to ' + source + ' ';
break;
}
if(array.content.queueItems.length == 0 && array.content.grabberItems.length == 0 && array.content.encryptedItems.length == 0 && array.content.offlineItems.length == 0){
queue = 'Nothing in queue ';
}else{
if(array.content.$status[0] == 'RUNNING') {
queue += `
`;
}else if(array.content.$status[0] == 'PAUSE'){
queue += ` `;
}else{
queue += ` `;
}
if(array.content.$status[1]) {
queue += ` `;
}
}
$.each(array.content.queueItems, function(i,v) {
count = count + 1;
if(v.speed == null){
v.speed = 'Stopped';
}
if(v.eta == null){
if(v.percentage == '100'){
v.speed = 'Completed';
v.eta = '--';
}else{
v.eta = '--';
}
}
if(v.enabled == null){
v.speed = 'Disabled';
}
queue += `
`+v.name+`
`+v.speed+`
`+v.size+`
`+v.eta+`
`;
});
$.each(array.content.grabberItems, function(i,v) {
count = count + 1;
queue += `
`+v.name+`
Online
--
--
`;
});
$.each(array.content.encryptedItems, function(i,v) {
count = count + 1;
queue += `
`+v.name+`
Encrypted
--
--
`;
});
$.each(array.content.offlineItems, function(i,v) {
count = count + 1;
queue += `
`+v.name+`
Offline
--
--
`;
});
break;
case 'sabnzbd':
if(array.content === false){
queue = 'Connection Error to ' + source + ' ';
break;
}
if(array.content.queueItems.queue.paused){
var state = ` `;
var active = 'grayscale';
}else{
var state = ` `;
var active = '';
}
$('.sabnzbd-downloader-action').html(state);
if(array.content.queueItems.queue.slots.length == 0){
queue = 'Nothing in queue ';
}
$.each(array.content.queueItems.queue.slots, function(i,v) {
count = count + 1;
var action = (v.status == "Downloading") ? 'pause' : 'resume';
var actionIcon = (v.status == "Downloading") ? 'pause' : 'play';
queue += `
`+v.filename+`
`+v.status+`
`+v.cat+`
`+v.size+`
`+v.timeleft+`
`;
});
if(array.content.historyItems.history.slots.length == 0){
history = 'Nothing in history ';
}
$.each(array.content.historyItems.history.slots, function(i,v) {
history += `
`+v.name+`
`+v.status+`
`+v.category+`
`+v.size+`
`;
});
break;
case 'nzbget':
if(array.content === false){
queue = 'Connection Error to ' + source + ' ';
break;
}
if(array.content.queueItems.result.length == 0){
queue = 'Nothing in queue ';
}
$.each(array.content.queueItems.result, function(i,v) {
count = count + 1;
var action = (v.Status == "Downloading") ? 'pause' : 'resume';
var actionIcon = (v.Status == "Downloading") ? 'pause' : 'play';
var percent = Math.floor((v.FileSizeMB - v.RemainingSizeMB) * 100 / v.FileSizeMB);
var size = v.FileSizeMB * 1000000;
v.Category = (v.Category !== '') ? v.Category : 'Not Set';
queue += `
`+v.NZBName+`
`+v.Status+`
`+v.Category+`
`+humanFileSize(size,true)+`
`;
});
if(array.content.historyItems.result.length == 0){
history = 'Nothing in history ';
}
$.each(array.content.historyItems.result, function(i,v) {
v.Category = (v.Category !== '') ? v.Category : 'Not Set';
var size = v.FileSizeMB * 1000000;
history += `
`+v.NZBName+`
`+v.Status+`
`+v.Category+`
`+humanFileSize(size,true)+`
`;
});
break;
case 'transmission':
if(array.content === false){
queue = 'Connection Error to ' + source + ' ';
break;
}
if(array.content.queueItems == 0){
queue = 'Nothing in queue ';
}
$.each(array.content.queueItems, function(i,v) {
count = count + 1;
switch (v.status) {
case 7:
case '7':
var status = 'No Peers';
break;
case 6:
case '6':
var status = 'Seeding';
break;
case 5:
case '5':
var status = 'Seeding Queued';
break;
case 4:
case '4':
var status = 'Downloading';
break;
case 3:
case '3':
var status = 'Queued';
break;
case 2:
case '2':
var status = 'Checking Files';
break;
case 1:
case '1':
var status = 'File Check Queued';
break;
case 0:
case '0':
var status = 'Complete';
break;
default:
var status = 'Complete';
}
var percent = Math.floor(v.percentDone * 100);
v.Category = (v.Category !== '') ? v.Category : 'Not Set';
queue += `
`+v.name+`
`+status+`
`+v.downloadDir+`
`+humanFileSize(v.totalSize,true)+`
`;
});
break;
case 'rTorrent':
if(array.content === false){
queue = 'Connection Error to ' + source + ' ';
break;
}
if(array.content.queueItems == 0){
queue = 'Nothing in queue ';
}
$.each(array.content.queueItems, function(i,v) {
count = count + 1;
var percent = Math.floor((v.downloaded / v.size) * 100);
var size = v.size != -1 ? humanFileSize(v.size,false) : "?";
var upload = v.seed !== '' ? humanFileSize(v.seed,true) : "0 B";
var download = v.leech !== '' ? humanFileSize(v.leech,true) : "0 B";
var upTotal = v.upTotal !== '' ? humanFileSize(v.upTotal,false) : "0 B";
var downTotal = v.downTotal !== '' ? humanFileSize(v.downTotal,false) : "0 B";
var date = new Date(0);
date.setUTCSeconds(v.date);
date = moment(date).format('LLL');
queue += `
`+v.name+`
`+v.status+`
`+download+`
`+upload+`
`+size+`
`+v.label+`
`;
});
break;
case 'utorrent':
if(array.content === false){
queue = 'Connection Error to ' + source + ' ';
break;
}
if(array.content.queueItems == 0){
queue = 'Nothing in queue ';
}
$.each(array.content.queueItems, function(i,v) {
console.log(v);
count = count + 1;
var upload = v.upSpeed !== '' ? humanFileSize(v.upSpeed,false) : "0 B";
var download = v.downSpeed !== '' ? humanFileSize(v.downSpeed,false) : "0 B";
var size = v.Size !== '' ? humanFileSize(v.Size,false) : "0 B";
queue += `
`+v.Name+`
`+v.Status+`
`+v.Labels+`
`+download+`
`+upload+`
`+size+`
`;
});
break;
case 'sonarr':
if(array.content === false){
queue = 'Connection Error to ' + source + ' ';
break;
}
if(array.content.queueItems == 0){
queue = 'Nothing in queue ';
break;
}
if(array.content.queueItems.records == 0){
queue = 'Nothing in queue ';
break;
}
$.each(array.content.queueItems, function(i,v) {
count = count + 1;
var percent = Math.floor(((v.size - v.sizeleft) / v.size) * 100);
percent = (isNaN(percent)) ? '0' : percent;
var size = v.size != -1 ? humanFileSize(v.size,false) : "?";
v.name = v.series.title;
queue += `
`+v.name+`
S`+pad(v.episode.seasonNumber,2)+`E`+pad(v.episode.episodeNumber,2)+`
`+v.episode.title+`
`+v.status+`
`+size+`
`+v.protocol+`
`;
});
break;
case 'radarr':
if(array.content === false){
queue = 'Connection Error to ' + source + ' ';
break;
}
if(array.content.queueItems == 0){
queue = 'Nothing in queue ';
break;
}
if(array.content.queueItems.records == 0){
queue = 'Nothing in queue ';
break;
}
let queueSet = (typeof array.content.queueItems.records == 'undefined') ? array.content.queueItems : array.content.queueItems.records;
$.each(queueSet, function(i,v) {
count = count + 1;
var percent = Math.floor(((v.size - v.sizeleft) / v.size) * 100);
percent = (isNaN(percent)) ? '0' : percent;
var size = v.size != -1 ? humanFileSize(v.size, false) : "?";
v.name = (typeof v.movie == 'undefined') ? v.title : v.movie.title;
queue += `
${v.name}
${v.status}
${size}
${v.protocol}
`;
});
if(queue == ''){
queue = 'Nothing in queue ';
}
break;
case 'qBittorrent':
if(array.content === false){
queue = 'Connection Error to ' + source + ' ';
break;
}
if(array.content.queueItems == 0){
queue = 'Nothing in queue ';
}
$.each(array.content.queueItems, function(i,v) {
count = count + 1;
switch (v.state) {
case 'stalledDL':
var status = 'No Peers';
break;
case 'metaDL':
var status = 'Getting Metadata';
break;
case 'uploading':
var status = 'Seeding';
break;
case 'queuedUP':
var status = 'Seeding Queued';
break;
case 'downloading':
var status = 'Downloading';
break;
case 'queuedDL':
var status = 'Queued';
break;
case 'checkingDL':
case 'checkingUP':
var status = 'Checking Files';
break;
case 'pausedDL':
var status = 'Paused';
break;
case 'pausedUP':
var status = 'Complete';
break;
default:
var status = 'Complete';
}
var percent = Math.floor(v.progress * 100);
var size = v.total_size != -1 ? humanFileSize(v.total_size,true) : "?";
queue += `
`+v.name+`
`+status+`
`+v.save_path+`
`+size+`
`;
});
break;
case 'deluge':
if(array.content === false){
queue = 'Connection Error to ' + source + ' ';
break;
}
if(array.content.queueItems.length == 0){
queue = 'Nothing in queue ';
}
$.each(array.content.queueItems, function(i,v) {
count = count + 1;
var percent = Math.floor(v.progress);
var size = v.total_size != -1 ? humanFileSize(v.total_size,true) : "?";
var upload = v.upload_payload_rate != -1 ? humanFileSize(v.upload_payload_rate,true) : "?";
var download = v.download_payload_rate != -1 ? humanFileSize(v.download_payload_rate,true) : "?";
var action = (v.Status == "Downloading") ? 'pause' : 'resume';
var actionIcon = (v.Status == "Downloading") ? 'pause' : 'play';
queue += `
`+v.name+`
`+v.state+`
`+size+`
`+download+`
`+upload+`
`;
});
break;
default:
return false;
}
if(queue !== ''){
$('.'+source+'-queue').html(queue);
}
if(history !== ''){
$('.'+source+'-history').html(history);
}
$('#count-'+source).html(count);
}
function buildDownloader(source){
var queueButton = 'QUEUE';
var historyButton = 'HISTORY';
switch (source) {
case 'jdownloader':
var queue = true;
var history = false;
queueButton = 'REFRESH';
break;
case 'sabnzbd':
case 'nzbget':
var queue = true;
var history = true;
break;
case 'transmission':
case 'qBittorrent':
case 'deluge':
case 'utorrent':
var queue = true;
break;
case 'rTorrent':
case 'sonarr':
case 'radarr':
var queue = true;
var history = false;
queueButton = 'REFRESH';
break;
default:
var queue = false;
var history = false;
}
var menu = ``;
var listing = '';
var state = '';
var active = '';
var headerAlt = '';
var header = '';
//console.log(array);
//console.log(queueItems);
//console.log(historyItems);
//console.log(downloader);
if(queue){
menu += `
`+queueButton+`
`;
listing += `
`;
}
if(history){
menu += `
`+historyButton+`
`;
listing += `
`;
}
menu += ' ';
if(activeInfo.settings.homepage.options.alternateHomepageHeaders){
var headerAlt = `
`+state+`
`+menu+`
`;
}else{
var header = `
`;
}
return `
`;
}
function buildDownloaderCombined(source){
var first = ($('.combinedDownloadRow').length == 0) ? true : false;
var active = (first) ? 'active' : '';
var queueButton = 'QUEUE';
var historyButton = 'HISTORY';
switch (source) {
case 'jdownloader':
var queue = true;
var history = false;
queueButton = 'REFRESH';
break;
case 'sabnzbd':
case 'nzbget':
var queue = true;
var history = true;
break;
case 'utorrent':
var queue = true;
break;
case 'transmission':
case 'qBittorrent':
case 'deluge':
case 'rTorrent':
case 'sonarr':
case 'radarr':
var queue = true;
var history = false;
queueButton = 'REFRESH';
break;
default:
var queue = false;
var history = false;
}
var mainMenu = `' : '';
if(first){
if(activeInfo.settings.homepage.options.alternateHomepageHeaders){
var headerAlt = `
`;
}else{
var header = `
`;
}
var built = `
`;
$('#homepageOrderdownloader').html(built);
}else{
$(addToMainMenu).appendTo('.combinedMenuList');
$(listingMain).appendTo('.listingMain');
}
}
function buildMetadata(array, source){
var metadata = '';
var genres = '';
var actors = '';
var rating = '
';
var sourceIcon = (source === 'jellyfin') ? 'fish' : source;
$.each(array.content, function(i,v) {
var hasActor = (typeof v.metadata.actors !== 'string') ? true : false;
var hasGenre = (typeof v.metadata.genres !== 'string') ? true : false;
if(hasActor){
$.each(v.metadata.actors, function(i,v) {
actors += ''+v.name+''+v.role+'
';
});
}
if(hasGenre){
$.each(v.metadata.genres, function(i,v) {
genres += ''+v+' ';
});
}
if(v.metadata.rating){
var ratingRound = Math.ceil(v.metadata.rating)*10;
rating = ``;
}
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+`
`;
});
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 = ``;
}
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+`
`;
return metadata;
}
function buildHealthChecks(array){
if(array === false){ return ''; }
var checks = (typeof array.content.checks !== 'undefined') ? array.content.checks.length : false;
return (checks) ? `
Health Checks : `+checks+`
`+buildHealthChecksItem(array)+`
` : '';
}
function buildPihole(array){
if(array === false){ return ''; }
var html = `
`;
if(array['options']['title']) {
html += `
Pi-hole :
`;
}
html += `
`+buildPiholeItem(array)+`
`;
return (array) ? html : '';
}
function buildUnifi(array){
if(array === false){ return ''; }
var items = (typeof array.content.unifi.data !== 'undefined') ? array.content.unifi.data.length : false;
return (items) ? `
UniFi :
`+buildUnifiItem(array.content.unifi.data)+`
` : '';
}
function buildUnifiItem(array){
var items = '';
$.each(array, function(i,v) {
var name = (typeof v.subsystem !== 'undefined') ? v.subsystem : '';
var stats = {};
var panelColor = '';
var proceed = (v.status == 'ok');
switch (name) {
case 'wlan':
panelColor = 'info';
stats['clients'] = v.num_user;
stats['tx'] = v['tx_bytes-r'];
stats['rx'] = v['rx_bytes-r'];
break;
case 'wan':
panelColor = 'success';
stats['IP'] = v.wan_ip;
stats['tx'] = v['tx_bytes-r'];
stats['rx'] = v['rx_bytes-r'];
break;
case 'lan':
panelColor = 'primary';
stats['clients'] = v.num_user;
stats['tx'] = v['tx_bytes-r'];
stats['rx'] = v['rx_bytes-r'];
break;
case 'www':
panelColor = 'warning';
stats['drops'] = v.drops;
stats['latency'] = v.latency;
stats['uptime'] = v.uptime;
stats['tx'] = v['tx_bytes-r'];
stats['rx'] = v['rx_bytes-r'];
break;
case 'vpn':
panelColor = 'inverse';
stats['clients'] = v.remote_user_num_active;
stats['tx'] = v.remote_user_tx_bytes;
stats['rx'] = v.remote_user_rx_bytes;
break;
default:
}
var statItems = '';
if(proceed) {
$.each(stats, function (istat, vstat) {
statItems += `
${istat}
${vstat}
`;
});
items += `
`;
}
});
return items;
}
function healthCheckIcon(tags){
var allTags = tags.split(' ');
var useIcon = '';
$.each(allTags, function(i,v) {
//check for image
var file = v.substring(v.lastIndexOf('.')+1, v.length).toLowerCase() || v.toLowerCase();
switch (file) {
case 'png':
case 'jpg':
case 'jpeg':
case 'gif':
useIcon = ' ';
break;
default:
}
});
return useIcon;
}
function buildHealthChecksItem(array){
var checks = '';
$.each(array.content.checks, function(i,v) {
var hasIcon = healthCheckIcon(v.tags);
v.name = (v.name) ? v.name : 'New Item';
v.desc = (array.options.desc && v.desc) ? 'Notes: '+v.desc+' ' : '';
switch(v.status){
case 'up':
var statusColor = 'success';
var statusIcon = 'ti-link text-success';
var nextPing = moment.utc(v.next_ping, "YYYY-MM-DD hh:mm[Z]").local().fromNow();
var lastPing = moment.utc(v.last_ping, "YYYY-MM-DD hh:mm[Z]").local().fromNow();
break;
case 'down':
var statusColor = 'danger animated-3 loop-animation flash';
var statusIcon = 'ti-unlink text-danger';
var nextPing = 'Service Down';
var lastPing = moment.utc(v.last_ping, "YYYY-MM-DD hh:mm[Z]").local().fromNow();
break;
case 'new':
var statusColor = 'info';
var statusIcon = 'ti-time text-info';
var nextPing = 'Waiting...';
var lastPing = 'n/a';
break;
case 'grace':
var statusColor = 'warning';
var statusIcon = 'ti-alert text-warning';
var nextPing = moment.utc(v.next_ping, "YYYY-MM-DD hh:mm[Z]").local().fromNow();
var lastPing = 'Missed';
break;
case 'paused':
var statusColor = 'primary';
var statusIcon = 'ti-control-pause text-primary';
var nextPing = 'Paused';
var lastPing = moment.utc(v.last_ping, "YYYY-MM-DD hh:mm[Z]").local().fromNow();
break;
default:
var statusColor = 'warning';
var statusIcon = 'ti-timer text-warning';
var nextPing = 'Waiting...';
var lastPing = 'n/a';
}
var tagPrimaryElem = '', tagSecondaryElem = '';
if (array.options.tags && v.tags){
v.tags = v.tags.split(' ');
$.each(v.tags, function(key,value) {
if(isURL(value)){
v.tags = arrayRemove(v.tags , value);
}
});
tagPrimaryElem = ''+v.tags[0]+' ';
tagSecondaryElem = 'Tags: ';
tagSecondaryElem += v.tags.map(t => { return t }).join(', ');
tagSecondaryElem += ' '
}
checks += `
`+tagPrimaryElem+`
`+hasIcon+v.name+`
Last: `+lastPing+` Next: `+nextPing+` `+v.desc+tagSecondaryElem+`
`
});
return checks;
}
function isURL(str) {
const pattern = new RegExp('^(https?:\\/\\/)?'+ // protocol
'((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|'+ // domain name
'((\\d{1,3}\\.){3}\\d{1,3}))'+ // OR ip (v4) address
'(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*'+ // port and path
'(\\?[;&a-z\\d%_.~+=-]*)?'+ // query string
'(\\#[-a-z\\d_]*)?$','i'); // fragment locator
return !!pattern.test(str);
}
function arrayRemove(arr, value) {
return arr.filter(function(ele){
return ele != value;
});
}
function buildPiholeItem(array){
var stats = `
`;
var length = Object.keys(array['data']).length;
var combine = array['options']['combine'];
var totalQueries = function(data) {
var card = `
Total queries
`;
for(var key in data) {
var e = data[key];
if(typeof e['FTLnotrunning'] == 'undefined'){
if(length > 1 && !combine) {
card += `
(`+key+`)
`;
}
card += `
`+e['dns_queries_today'].toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",")+` `;
}
};
card += `
`
return card;
};
var totalBlocked = function(data) {
var card = `
Queries Blocked
`;
for(var key in data) {
var e = data[key];
if(typeof e['FTLnotrunning'] == 'undefined') {
if (length > 1 && !combine) {
card += `
(${key})
`;
}
card += `
${e['ads_blocked_today'].toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",")} `;
}
};
card += `
`
return card;
};
var percentBlocked = function(data) {
var card = `
Percent Blocked
`;
for(var key in data) {
var e = data[key];
if(typeof e['FTLnotrunning'] == 'undefined') {
if (length > 1 && !combine) {
card += `
(${key})
`;
}
card += `
${e['ads_percentage_today'].toFixed(1)}% `
}
};
card += `
`
return card;
};
var domainsBlocked = function(data) {
var card = `
Domains on Blocklist
`;
for(var key in data) {
var e = data[key];
if(typeof e['FTLnotrunning'] == 'undefined') {
if (length > 1 && !combine) {
card += `
(${key})
`;
}
card += `
${e['domains_being_blocked'].toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",")} `;
}
};
card += `
`
return card;
};
if(combine) {
stats += ''
stats += totalQueries(array['data']);
stats += totalBlocked(array['data']);
stats += percentBlocked(array['data']);
stats += domainsBlocked(array['data']);
stats += '
';
} else {
for(var key in array['data']) {
var data = array['data'][key];
obj = {};
obj[key] = data;
stats += ''
stats += totalQueries(obj);
stats += totalBlocked(obj);
stats += percentBlocked(obj);
stats += domainsBlocked(obj);
stats += '
';
};
}
return stats;
}
function homepagePihole(timeout){
var timeout = (typeof timeout !== 'undefined') ? timeout : activeInfo.settings.homepage.refresh.homepagePiholeRefresh;
organizrAPI2('GET','api/v2/homepage/pihole/stats').success(function(data) {
try {
let response = data.response;
document.getElementById('homepageOrderPihole').innerHTML = '';
if(response.data !== null){
buildPihole(response.data)
$('#homepageOrderPihole').html(buildPihole(response.data));
}
}catch(e) {
organizrCatchError(e,data);
}
}).fail(function(xhr) {
OrganizrApiError(xhr);
});
let timeoutTitle = 'PiHole-Homepage';
if(typeof timeouts[timeoutTitle] !== 'undefined'){ clearTimeout(timeouts[timeoutTitle]); }
timeouts[timeoutTitle] = setTimeout(function(){ homepagePihole(timeout); }, timeout);
delete timeout;
}
function homepageHealthChecks(tags, timeout){
tags = (typeof tags !== 'undefined') ? tags : activeInfo.settings.homepage.options.healthChecksTags;
if(tags == ''){
var apiUrl = 'api/v2/homepage/healthchecks';
}else{
var apiUrl = 'api/v2/homepage/healthchecks/' + tags;
}
timeout = (typeof timeout !== 'undefined') ? timeout : activeInfo.settings.homepage.refresh.homepageHealthChecksRefresh;
organizrAPI2('GET',apiUrl).success(function(data) {
try {
var response = data.response;
document.getElementById('homepageOrderhealthchecks').innerHTML = '';
if(response.data !== null){
$('#homepageOrderhealthchecks').html(buildHealthChecks(response.data));
}
}catch(e) {
organizrCatchError(e,data);
}
}).fail(function(xhr) {
OrganizrApiError(xhr);
});
let timeoutTitle = 'HealthChecks-Homepage';
if(typeof timeouts[timeoutTitle] !== 'undefined'){ clearTimeout(timeouts[timeoutTitle]); }
timeouts[timeoutTitle] = setTimeout(function(){ homepageHealthChecks(tags,timeout); }, timeout);
delete timeout;
}
function homepageUnifi(timeout){
var timeout = (typeof timeout !== 'undefined') ? timeout : activeInfo.settings.homepage.refresh.homepageUnifiRefresh;
organizrAPI2('GET','api/v2/homepage/unifi/data').success(function(data) {
try {
let response = data.response;
document.getElementById('homepageOrderunifi').innerHTML = '';
if(response.data !== null){
$('#homepageOrderunifi').html(buildUnifi(response.data));
}
}catch(e) {
organizrCatchError(e,data);
}
}).fail(function(xhr) {
OrganizrApiError(xhr);
});
var timeoutTitle = 'Unifi-Homepage';
if(typeof timeouts[timeoutTitle] !== 'undefined'){ clearTimeout(timeouts[timeoutTitle]); }
timeouts[timeoutTitle] = setTimeout(function(){ homepageUnifi(timeout); }, timeout);
delete timeout;
}
function homepageDownloader(type, timeout){
var timeout = (typeof timeout !== 'undefined') ? timeout : activeInfo.settings.homepage.refresh.homepageDownloadRefresh;
switch (type) {
case 'jdownloader':
var action = 'getJdownloader';
break;
case 'sabnzbd':
var action = 'getSabnzbd';
break;
case 'nzbget':
var action = 'getNzbget';
break;
case 'transmission':
var action = 'getTransmission';
break;
case 'sonarr':
var action = 'getSonarrQueue';
break;
case 'radarr':
var action = 'getRadarrQueue';
break;
case 'qBittorrent':
var action = 'getqBittorrent';
break;
case 'deluge':
var action = 'getDeluge';
break;
case 'rTorrent':
var action = 'getrTorrent';
break;
case 'utorrent':
var action = 'getutorrent';
break;
default:
}
let lowerType = type.toLowerCase();
organizrAPI2('GET','api/v2/homepage/'+lowerType+'/queue').success(function(data) {
try {
let response = data.response;
if(response.data !== null){
buildDownloaderItem(response.data, type);
}
}catch(e) {
organizrCatchError(e,data);
}
}).fail(function(xhr) {
OrganizrApiError(xhr);
});
let timeoutTitle = type+'-Downloader-Homepage';
if(typeof timeouts[timeoutTitle] !== 'undefined'){ clearTimeout(timeouts[timeoutTitle]); }
timeouts[timeoutTitle] = setTimeout(function(){ homepageDownloader(type,timeout); }, timeout);
delete timeout;
}
function homepageStream(type, timeout){
var timeout = (typeof timeout !== 'undefined') ? timeout : activeInfo.settings.homepage.refresh.homepageStreamRefresh;
organizrAPI2('GET','api/v2/homepage/'+type+'/streams').success(function(data) {
try {
let response = data.response;
document.getElementById('homepageOrder'+type+'nowplaying').innerHTML = '';
$('#homepageOrder'+type+'nowplaying').html(buildStream(response.data, type));
}catch(e) {
organizrCatchError(e,data);
}
}).fail(function(xhr) {
OrganizrApiError(xhr);
});
let timeoutTitle = type+'-Stream-Homepage';
if(typeof timeouts[timeoutTitle] !== 'undefined'){ clearTimeout(timeouts[timeoutTitle]); }
timeouts[timeoutTitle] = setTimeout(function(){ homepageStream(type,timeout); }, timeout);
delete timeout;
}
function homepageRecent(type, timeout){
var timeout = (typeof timeout !== 'undefined') ? timeout : activeInfo.settings.homepage.refresh.homepageRecentRefresh;
switch (type) {
case 'plex':
var action = 'getPlexRecent';
break;
case 'emby':
case 'jellyfin':
var action = 'getEmbyRecent';
break;
default:
}
organizrAPI2('GET','api/v2/homepage/'+type+'/recent').success(function(data) {
try {
let response = data.response;
document.getElementById('homepageOrder'+type+'recent').innerHTML = '';
$('#homepageOrder'+type+'recent').html(buildRecent(response.data, type));
$('.recent-items').owlCarousel({
nav:false,
autoplay:false,
dots:false,
margin:10,
autoWidth:true,
items:4
})
}catch(e) {
organizrCatchError(e,data);
}
}).fail(function(xhr) {
OrganizrApiError(xhr);
});
let timeoutTitle = type+'-Recent-Homepage';
if(typeof timeouts[timeoutTitle] !== 'undefined'){ clearTimeout(timeouts[timeoutTitle]); }
timeouts[timeoutTitle] = setTimeout(function(){ homepageRecent(type,timeout); }, timeout);
delete timeout;
}
function homepagePlaylist(type, timeout=30000){
organizrAPI2('GET','api/v2/homepage/'+type+'/playlists').success(function(data) {
try {
let response = data.response;
document.getElementById('homepageOrder'+type+'playlist').innerHTML = '';
$('#homepageOrder'+type+'playlist').html(buildPlaylist(response.data, type));
$('.playlist-items').owlCarousel({
nav:false,
autoplay:false,
dots:false,
margin:10,
autoWidth:true,
items:4
})
}catch(e) {
organizrCatchError(e,data);
}
}).fail(function(xhr) {
OrganizrApiError(xhr);
});
}
function defaultOmbiFilter(){
var defaultFilter = {
"request-filter-approved" : activeInfo.settings.homepage.ombi.ombiDefaultFilterApproved,
"request-filter-unapproved" : activeInfo.settings.homepage.ombi.ombiDefaultFilterUnapproved,
"request-filter-available" : activeInfo.settings.homepage.ombi.ombiDefaultFilterAvailable,
"request-filter-unavailable" : activeInfo.settings.homepage.ombi.ombiDefaultFilterUnavailable,
"request-filter-denied" : activeInfo.settings.homepage.ombi.ombiDefaultFilterDenied
};
$.each(defaultFilter, function(i,v) {
if(v == false){
$('#'+i).click();
}
});
}
function homepageRequests(timeout){
var timeout = (typeof timeout !== 'undefined') ? timeout : activeInfo.settings.homepage.refresh.ombiRefresh;
organizrAPI2('GET','api/v2/homepage/ombi/requests').success(function(data) {
try {
let response = data.response;
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
})
// Default Ombi Filter
defaultOmbiFilter();
}catch(e) {
organizrCatchError(e,data);
}
}).fail(function(xhr) {
OrganizrApiError(xhr);
});
if(typeof timeouts['ombi-Homepage'] !== 'undefined'){ clearTimeout(timeouts['ombi-Homepage']); }
timeouts['ombi-Homepage'] = setTimeout(function(){ homepageRequests(timeout); }, timeout);
delete timeout;
}
function testAPIConnection(service, data = ''){
messageSingle('',' Testing now...',activeInfo.settings.notifications.position,'#FFF','info','10000');
organizrAPI2('POST','api/v2/test/' + service,data).success(function(data) {
try {
let response = data.response;
messageSingle('',' API Connection Success',activeInfo.settings.notifications.position,'#FFF','success','10000');
}catch(e) {
organizrCatchError(e,data);
}
}).fail(function(xhr) {
OrganizrApiError(xhr, 'API Error');
});
}
function getUnifiSite(){
messageSingle('',' Grabbing now...',activeInfo.settings.notifications.position,'#FFF','info','10000');
organizrAPI2('POST','api/v2/test/unifi/site', {}).success(function(data) {
try {
var response = data.response;
if(response.data !== false){
var sites = '';
if(response.data.data){
$.each(response.data.data, function(i,v) {
sites += '';
});
}else{
//console.log('no');
}
var div = `
`;
swal({
content: createElementFromHTML(div),
buttons: false,
className: 'bg-org'
})
}else{
messageSingle('API Connection Failed',response.data,activeInfo.settings.notifications.position,'#FFF','error','10000');
}
}catch(e) {
organizrCatchError(e,data);
}
}).fail(function(xhr) {
OrganizrApiError(xhr, 'API Error');
});
}
function unifiSiteApply(name){
$('#homepage-Unifi-form [name=unifiSiteName]').val(name);
$('#homepage-Unifi-form [name=unifiSiteName]').change();
swal.close();
messageSingle('', ' Grabbed Site - Please Save Now',activeInfo.settings.notifications.position,'#FFF','success','10000');
}
function homepageCalendar(timeout){
var timeout = (typeof timeout !== 'undefined') ? timeout : activeInfo.settings.homepage.refresh.calendarRefresh;
if(activeInfo.settings.homepage.options.alternateHomepageHeaders){
$('.fc-toolbar').addClass('fc-alternate');
}
organizrAPI2('GET','api/v2/homepage/calendar').success(function(data) {
try {
let response = data.response;
$('#calendar').fullCalendar('removeEvents');
$('#calendar').fullCalendar('addEventSource', response.data.events);
$('#calendar').fullCalendar('addEventSource', response.data.ical);
$('#calendar').fullCalendar('today');
}catch(e) {
organizrCatchError(e,data);
}
}).fail(function(xhr) {
OrganizrApiError(xhr);
});
if(typeof timeouts['calendar-Homepage'] !== 'undefined'){ clearTimeout(timeouts['calendar-Homepage']); }
timeouts['calendar-Homepage'] = setTimeout(function(){ homepageCalendar(timeout); }, timeout);
delete timeout;
}
function buildTautulliItem(array){
var cards = ""
var homestats = array.homestats.data;
var libstats = array.libstats;
var options = array.options;
var friendlyName = array.options.friendlyName;
var buildLibraries = function(data){
var libs = data.data;
var movies = [];
var tv = [];
var audio = [];
libs.forEach(e => {
switch(e['section_type']) {
case 'movie':
movies.push(e);
break;
case 'show':
tv.push(e);
break;
case 'artist':
audio.push(e);
break;
default:
break;
}
});
movies = movies.sort((a, b) => (parseInt(a['count']) > parseInt(b['count'])) ? -1 : 1);
tv = tv.sort((a, b) => (parseInt(a['count']) > parseInt(b['count'])) ? -1 : 1);
audio = audio.sort((a, b) => (parseInt(a['count']) > parseInt(b['count'])) ? -1 : 1);
var buildCard = function(type, data) {
var extraField = null;
var section_name = null;
if(type == 'movie'){
extraField = 'Movies';
section_name = 'Movie Libraries';
}else if(type == 'show'){
extraField = 'Shows/Seasons/Episodes';
section_name = 'TV Show Libraries';
}else if(type == 'artist'){
extraField = 'Artists/Albums/Tracks';
section_name = 'Music Libraries';
}
var cardTitle = ''+section_name.toUpperCase()+' '+extraField.toUpperCase()+' ';
var card = `
${cardTitle}
`;
return card;
};
var card = (movies.length > 0) ? buildCard('movie', movies) : '';
card += (tv.length > 0) ? buildCard('show', tv) : '';
card += (audio.length > 0) ? buildCard('artist', audio) : '';
return card;
};
var buildStats = function(data, stat, friendlyName = true){
var card = '';
data.forEach(e => {
let classes = '';
if(e['stat_id'] == stat) {
if(stat === 'top_platforms') {
classes = ' platform-' + e['rows'][0]['platform_name'] + '-rgba';
} else {
classes = ' bg-org-alt';
}
card += `
`;
if(stat !== 'top_users' && stat !== 'top_platforms') {
card += `
`;
}
card += `
`;
if(stat == 'top_users') {
card += ` `;
} else if(stat == 'top_platforms') {
card += ` `;
} else {
card += ` `;
}
var extraField = null;
if(e['stat_title'].includes('Popular')){
extraField = 'users';
}else if(e['stat_title'].includes('Watched')||e['stat_title'].includes('Active')){
extraField = 'plays';
}
var cardTitle = ''+e['stat_title'].toUpperCase()+' '+extraField.toUpperCase()+' ';
card += cardTitle+`
`;
} else {
return '';
}
});
return card;
};
cards += ''
cards += (options['libraries']) ? buildLibraries(libstats) : '';
cards += (options['popularMovies']) ? buildStats(homestats, 'popular_movies') : '';
cards += (options['popularTV']) ? buildStats(homestats, 'popular_tv') : '';
cards += (options['topMovies']) ? buildStats(homestats, 'top_movies') : '';
cards += (options['topTV']) ? buildStats(homestats, 'top_tv') : '';
cards += (options['topUsers']) ? buildStats(homestats, 'top_users', friendlyName) : '';
cards += (options['topPlatforms']) ? buildStats(homestats, 'top_platforms') : '';
cards += '
';
cards += ''
cards += '
';
return cards;
}
function buildTautulli(array){
if(array === false){ return ''; }
var html = `
`
if(array['options']['title']) {
html += `
`+activeInfo.settings.homepage.options.titles.tautulli+` :
`;
}
html += `
`+buildTautulliItem(array)+`
`;
return (array) ? html : '';
}
function homepageTautulli(timeout){
var timeout = (typeof timeout !== 'undefined') ? timeout : activeInfo.settings.homepage.refresh.homepageTautulliRefresh;
organizrAPI2('GET','api/v2/homepage/tautulli/data').success(function(data) {
try {
let response = data.response;
document.getElementById('homepageOrdertautulli').innerHTML = '';
if(response.data !== null){
$('#homepageOrdertautulli').html(buildTautulli(response.data));
}
}catch(e) {
organizrCatchError(e,data);
}
}).fail(function(xhr) {
OrganizrApiError(xhr);
});
let timeoutTitle = 'Tautulli-Homepage';
if(typeof timeouts[timeoutTitle] !== 'undefined'){ clearTimeout(timeouts[timeoutTitle]); }
timeouts[timeoutTitle] = setTimeout(function(){ homepageTautulli(timeout); }, timeout);
delete timeout;
}
function weatherIcon(code, daytime = true){
switch (code) {
case 1:
case 2:
return (daytime) ? 'wi-day-sunny' : 'wi-night-clear';
case 3:
case 4:
case 5:
case 6:
case 22:
return (daytime) ? 'wi-day-sunny-overcast' : 'wi-night-alt-partly-cloudy';
case 7:
case 8:
case 9:
return (daytime) ? 'wi-day-cloudy-high' : 'wi-night-partly-cloudy';
case 10:
case 11:
case 12:
return (daytime) ? 'wi-day-thunderstorm' : 'wi-night-thunderstorm';
case 13:
case 14:
case 15:
return (daytime) ? 'wi-day-haze' : 'wi-night-cloudy-windy';
case 16:
case 17:
case 18:
return (daytime) ? 'wi-day-fog' : 'wi-night-fog';
case 19:
case 20:
case 21:
return (daytime) ? 'wi-day-cloudy-high' : 'wi-night-cloudy-high';
case 23:
case 25:
return (daytime) ? 'wi-day-rain' : 'wi-night-rain';
case 24:
case 26:
return (daytime) ? 'wi-day-snow' : 'wi-night-snow';
case 27:
case 28:
case 30:
case 31:
case 33:
return (daytime) ? 'wi-day-rain-mix' : 'wi-night-alt-rain-mix';
case 29:
case 32:
case 34:
case 35:
return (daytime) ? 'wi-day-snow-thunderstorm' : 'wi-night-alt-snow-thunderstorm';
default:
return (daytime) ? 'wi-day-sunny' : 'wi-night-clear';
}
}
function buildWeatherAndAir(array){
var returnData = '';
if (typeof array.content === 'undefined'){ return ''; }
if(array.content.weather !== false){
if(array.content.weather.error === null){
let dates = {};
$.each(array.content.weather.data, function(i,v) {
let date = moment(v.datetime).format('YYYY-MM-DD')
if( typeof dates[date] === 'undefined'){
dates[date] = v;
dates[date]['temps'] = {
'high': v.temperature.value,
'low': v.temperature.value
}
}else{
if(moment(v.datetime).format('hh:mm a') == '12:00 pm'){
dates[date]['icon_code'] = v.icon_code;
dates[date]['is_day_time'] = v.is_day_time;
}
if(v.temperature.value > dates[date]['temps']['high']){
dates[date]['temps']['high'] = v.temperature.value;
}
if(v.temperature.value < dates[date]['temps']['low']){
dates[date]['temps']['low'] = v.temperature.value;
}
}
})
let weatherItems = '';
let weatherItemsCount = 0;
$.each(dates, function(i,v) {
if(weatherItemsCount === 0){
weatherItems += `
Feels Like `+Math.round(v.feels_like_temperature.value)+`° `+moment(v.datetime).format('dddd')+``+v.weather_text+`
`+Math.round(v.temperature.value)+`°`+v.temperature.units+`
`+Math.round(v.wind.speed.value)+` `+v.wind.speed.units+`
`+Math.round(v.pressure.value)+` `+v.pressure.units+`
`+Math.round(v.relative_humidity)+`
`+Math.round(v.dew_point.value)+`°
`;
}else if(weatherItemsCount !== 5){
weatherItems += `
`+moment(v.datetime).format('dddd')+`
`+Math.round(v.temps.high)+`°`+v.temperature.units+`
`;
}
weatherItemsCount ++;
})
weatherItems += '
';
returnData += weatherItems;
}
}
if(array.content.air !== false){
if(array.content.air.error === null) {
let airItems = '';
let activeClasses = {
'poor': '',
'low': '',
'moderate': '',
'good': '',
'excellent': '',
'text': ''
};
if(array.content.air.data.indexes.baqi.aqi <= 20){
activeClasses['poor'] = 'active';
activeClasses['text'] = 'text-poor-gradient';
}else if(array.content.air.data.indexes.baqi.aqi <= 40){
activeClasses['low'] = 'active';
activeClasses['text'] = 'text-low-gradient';
}else if(array.content.air.data.indexes.baqi.aqi <= 60){
activeClasses['moderate'] = 'active';
activeClasses['text'] = 'text-moderate-gradient';
}else if(array.content.air.data.indexes.baqi.aqi <= 80){
activeClasses['good'] = 'active';
activeClasses['text'] = 'text-good-gradient';
}else if(array.content.air.data.indexes.baqi.aqi <= 100){
activeClasses['excellent'] = 'active';
activeClasses['text'] = 'text-excellent-gradient';
}
airItems += `
${buildPollutant(array.content.air.data.pollutants)}
${buildHealthRecommendation(array.content.air.data.health_recommendations)}
`;
airItems += '
';
returnData += airItems;
}
}
if(array.content.pollen !== false){
if(array.content.pollen.error === null){
}
}
return returnData;
}
function buildHealthRecommendation(array){
var healthHeader = '';
var healthSection = '';
$.each(array, function(i,v) {
var title = i.toString().replace('_', ' ').toLowerCase().split(' ').map(word => word.charAt(0).toUpperCase() + word.substring(1)).join(' ')
switch (i) {
case 'general_population':
var icon = 'fa fa-group';
break;
case 'elderly':
var icon = 'ti ti-wheelchair';
break;
case 'lung_diseases':
var icon = 'mdi mdi-spray';
break;
case 'heart_diseases':
var icon = 'mdi mdi-heart-pulse';
break;
case 'active':
var icon = 'mdi mdi-run-fast';
break;
case 'pregnant_women':
var icon = 'mdi mdi-human-pregnant';
break;
case 'children':
var icon = 'fa fa-child';
break;
default:
var icon = '';
}
healthHeader += ' ';
healthSection += `
`;
});
var html = `
`
return html;
}
function buildPollutant(array){
var pollutantHeader = '';
var pollutantSection = '';
$.each(array, function(i,v) {
pollutantHeader += ''+v.display_name+' '+v.concentration.value+' '+v.concentration.units+' ';
pollutantSection += `
${v.full_name}
Sources
${v.sources_and_effects.sources}
Effects
${v.sources_and_effects.effects}
`;
});
var html = `
`
return html;
}
function homepageWeatherAndAir(timeout){
var timeout = (typeof timeout !== 'undefined') ? timeout : activeInfo.settings.homepage.refresh.homepageWeatherAndAirRefresh;
organizrAPI2('GET','api/v2/homepage/weather/data').success(function(data) {
try {
let response = data.response;
if(response.data !== null){
document.getElementById('homepageOrderWeatherAndAir').innerHTML = '';
$('#homepageOrderWeatherAndAir').html(buildWeatherAndAir(response.data));
}
}catch(e) {
organizrCatchError(e,data);
}
}).fail(function(xhr) {
OrganizrApiError(xhr);
});
let timeoutTitle = 'WeatherAndAir-Homepage';
if(typeof timeouts[timeoutTitle] !== 'undefined'){ clearTimeout(timeouts[timeoutTitle]); }
timeouts[timeoutTitle] = setTimeout(function(){ homepageWeatherAndAir(timeout); }, timeout);
delete timeout;
}
function buildMonitorrItem(array){
var cards = '';
var options = array['options'];
var services = array['services'];
var tabName = '';
var buildCard = function(name, data) {
if(data.status == true) {
var statusColor = 'success'; var imageText = 'fa fa-check-circle text-success'
} else if (data.status == 'unresponsive') {
var statusColor = 'warning animated-3 loop-animation flash'; var imageText = 'fa fa-times-circle text-warning'
} else {
var statusColor = 'danger animated-3 loop-animation flash'; var imageText = 'fa fa-times-circle text-danger'
}
if(typeof data.link !== 'undefined' && data.link.includes('#')) {
tabName = data.link.substring(data.link.indexOf('#')+1);
monitorrLink = '';
} else if(typeof data.link !== 'undefined') {
monitorrLink = ' '
}
if(options['compact']) {
var card = `
`; if (typeof data.link !== 'undefined') { card += monitorrLink; }
card += `
`+name+`
`; if (typeof data.link !== 'undefined') { card +=``; }
card += `
`;
} else {
var card = `
`;
}
return card;
}
for(var key in services) {
cards += buildCard(key, services[key]);
};
return cards;
}
function buildMonitorr(array){
if(array === false){ return ''; }
if(array.error != undefined) {
organizrConsole('Monitorr Function',array.error, 'error');
} else {
var services = (typeof array.services !== 'undefined') ? Object.keys(array.services).length : false;
var html = `
`
if(array['options']['titleToggle']) {
html += `
`+array['options']['title']+` : `+services+`
`;
}
html += `
`+buildMonitorrItem(array)+`
`;
}
return (array) ? html : '';
}
function homepageMonitorr(timeout){
var timeout = (typeof timeout !== 'undefined') ? timeout : activeInfo.settings.homepage.refresh.homepagePiholeRefresh;
organizrAPI2('GET','api/v2/homepage/monitorr/data').success(function(data) {
try {
let response = data.response;
document.getElementById('homepageOrderMonitorr').innerHTML = '';
if(response.data !== null){
buildMonitorr(response.data)
$('#homepageOrderMonitorr').html(buildMonitorr(response.data));
}
}catch(e) {
organizrCatchError(e,data);
}
}).fail(function(xhr) {
OrganizrApiError(xhr);
});
let timeoutTitle = 'Monitorr-Homepage';
if(typeof timeouts[timeoutTitle] !== 'undefined'){ clearTimeout(timeouts[timeoutTitle]); }
timeouts[timeoutTitle] = setTimeout(function(){ homepageMonitorr(timeout); }, timeout);
delete timeout;
}
function homepageSpeedtest(timeout){
var timeout = (typeof timeout !== 'undefined') ? timeout : activeInfo.settings.homepage.refresh.homepageSpeedtestRefresh;
organizrAPI2('GET','api/v2/homepage/speedtest/data').success(function(data) {
try {
let response = data.response;
document.getElementById('homepageOrderSpeedtest').innerHTML = '';
if(response.data !== null){
$('#homepageOrderSpeedtest').html(buildSpeedtest(response.data));
}
}catch(e) {
organizrCatchError(e,data);
}
}).fail(function(xhr) {
OrganizrApiError(xhr);
});
let timeoutTitle = 'Speedtest-Homepage';
if(typeof timeouts[timeoutTitle] !== 'undefined'){ clearTimeout(timeouts[timeoutTitle]); }
timeouts[timeoutTitle] = setTimeout(function(){ homepageSpeedtest(timeout); }, timeout);
delete timeout;
}
function buildSpeedtest(array){
if(array === false){ return ''; }
var html = `
`;
var current = array.data.current;
var average = array.data.average;
var maximum = array.data.maximum;
var minimum = array.data.minimum;
var options = array.options;
html += `
`;
if(options.titleToggle) {
html += `
`+array['options']['title']+` :
`;
}
html += `
Ping
`+parseFloat(current.ping).toFixed(1)+`
ms (current)
`;
if(average != undefined) {
html += `
`+parseFloat(average.ping).toFixed(1)+`
ms (average)
`;
}
if(maximum != undefined) {
html += `
`+parseFloat(maximum.ping).toFixed(1)+`
ms (maximum)
`;
}
if(minimum != undefined) {
html += `
`+parseFloat(minimum.ping).toFixed(1)+`
ms (minimum)
`;
}
html += `
Download
`+parseFloat(current.download).toFixed(1)+`
Mbit/s (current)
`;
if(average != undefined) {
html += `
`+parseFloat(average.download).toFixed(1)+`
Mbit/s (average)
`;
}
if(maximum != undefined) {
html += `
`+parseFloat(maximum.download).toFixed(1)+`
Mbit/s (maximum)
`;
}
if(minimum != undefined) {
html += `
`+parseFloat(minimum.download).toFixed(1)+`
Mbit/s (minimum)
`;
}
html += `
Upload
`+parseFloat(current.upload).toFixed(1)+`
Mbit/s (current)
`;
if(average != undefined) {
html += `
`+parseFloat(average.upload).toFixed(1)+`
Mbit/s (average)
`;
}
if(maximum != undefined) {
html += `
`+parseFloat(maximum.upload).toFixed(1)+`
Mbit/s (maximum)
`;
}
if(minimum != undefined) {
html += `
`+parseFloat(minimum.upload).toFixed(1)+`
Mbit/s (minimum)
`;
}
html += `
`;
return (array) ? html : '';
}
function buildNetdataItem(array){
var html = `
`;
var buildEasyPieChart = function(e,i,size,easySize,display) {
return `
`+e.title+`
`+parseFloat(e.value).toFixed(1)+`
`+e.units+`
`;
}
var buildGaugeChart = function(e,i,size,easySize,display) {
switch(size) {
case 'lg':
easySize = 300;
break;
case 'sm':
easySize = 275;
break;
case 'md':
default:
easySize = 250;
break;
}
return `
`+e.title+`
`+parseFloat(e.value).toFixed(1)+`
`;
}
array.forEach((e, i) => {
var size = e.size;
var easySize;
if(size == '') {
size = 'md';
}
switch(size) {
case 'lg':
easySize = 180;
break;
case 'sm':
easySize = 140;
break;
case 'md':
default:
easySize = 160;
break;
}
var display = ' ';
if(e.lg) {
display += ' d-xl-inline-block d-lg-inline-block';
} else {
display += ' d-xl-none d-lg-none d-none';
}
if(e.md) {
display += ' d-md-inline-block';
} else {
display += ' d-md-none d-none';
}
if(e.sm) {
display += ' d-sm-inline-block d-xs-inline-block';
} else {
display += ' d-sm-none d-xs-none d-none';
}
display += ' ';
if(e.error) {
organizrConsole('Netdata Function','(Chart ' + (i+1) + '): ' + e.error, 'error');
} else if(e.chart == 'easypiechart') {
html += buildEasyPieChart(e,i,size,easySize,display);
} else if(e.chart == 'gauge') {
html += buildGaugeChart(e,i,size,easySize,display);
}
});
return html;
}
function buildNetdata(array){
var data = array.data;
if(array === false){ return ''; }
window.netdata = [];
var html = `
`;
html += `
`;
html += buildNetdataItem(data);
html += `
`;
return (array) ? html : '';
}
function homepageNetdata(timeout){
var timeout = (typeof timeout !== 'undefined') ? timeout : activeInfo.settings.homepage.refresh.homepageNetdataRefresh;
organizrAPI2('GET','api/v2/homepage/netdata/data').success(function(data) {
try {
let response = data.response;
if(!tryUpdateNetdata(response.data.data)) {
document.getElementById('homepageOrderNetdata').innerHTML = '';
if(response.data !== null){
$('#homepageOrderNetdata').html(buildNetdata(response.data));
}
}
}catch(e) {
organizrCatchError(e,data);
}
}).fail(function(xhr) {
OrganizrApiError(xhr);
});
var timeoutTitle = 'Netdata-Homepage';
if(typeof timeouts[timeoutTitle] !== 'undefined'){ clearTimeout(timeouts[timeoutTitle]); }
timeouts[timeoutTitle] = setTimeout(function(){ homepageNetdata(timeout); }, timeout);
delete timeout;
}
function tryUpdateNetdata(array){
var existing = false;
array.forEach((e,i) => {
var id = i + 1;
if(e.chart == 'easypiechart') {
if($('#easyPieChart' + id).length) {
$('#easyPieChart' + id).data('easyPieChart').update(e.percent);
$('#easyPieChart' + id + 'Value').html(parseFloat(e.value).toFixed(1));
existing = true;
}
} else if(e.chart == 'gauge') {
if(window.netdata) {
if(window.netdata[(i+1)]) {
window.netdata[(i+1)].set(e.percent); // set actual value
$('#gaugeChart' + (i+1) + 'Value').html(parseFloat(e.value).toFixed(1));
existing = true;
}
} else {
existing = false;
}
} else {
existing = false;
}
});
return existing;
}
function homepageJackett(){
if(activeInfo.settings.homepage.options.alternateHomepageHeaders){
var header = `
Jackett
`;
}else{
var header = `
Jackett
`;
}
let html = `
`+header+`
Search
Results
Date
Tracker
Name
Size
Files
Grabs
Seeds
Leechers
Download
`;
$('#homepageOrderJackett').html(html);
}
function clearJackett(){
$('#jackett-search-query').val('');
$('.clearJackett').parent().addClass('hidden');
$('#jackettDataTable').DataTable().destroy();
$('.jackettDataTable').addClass('hidden');
}
function searchJackett(){
let query = $('#jackett-search-query').val();
if(query !== ''){
$('.jackettDataTable').removeClass('hidden');
//ajaxloader('#jackettSearch .panel-wrapper', 'in');
ajaxblocker('.jackett-panel .white-box', 'in', 'Searching...');
}else{
return false;
}
$.fn.dataTable.ext.errMode = 'none';
$('#jackettDataTable').DataTable().destroy();
let preferBlackholeDownload = activeInfo.settings.homepage.jackett.homepageJackettBackholeDownload;
let jackettTable = $("#jackettDataTable")
.on( 'error.dt', function ( e, settings, techNote, message ) {
console.log( 'An error has been reported by DataTables: ', message );
} )
.DataTable( {
"ajax": {
"url": "api/v2/homepage/jackett/" + query,
"dataSrc": function ( json ) {
return json.response.data.content.Results;
}
},
"columns": [
{ data: 'PublishDate',
render: function ( data, type, row ) {
if ( type === 'display' || type === 'filter' ) {
var m = moment.tz(data, activeInfo.timezone);
return moment.utc(m, "YYYY-MM-DD hh:mm[Z]").local().fromNow();
}
return data;
}
},
{ "data": "Tracker" },
{ data: 'Title',
render: function ( data, type, row ) {
if(row.Details !== null){
return ' '+data+' ';
}else{
return data;
}
}
},
{ data: 'Size',
render: function ( data, type, row ) {
if ( type === 'display' || type === 'filter' ) {
return humanFileSize(data, false);
}
return humanFileSize(data, false);
}
},
{ "data": "Files" },
{ "data": "Grabs" },
{ "data": "Seeders" },
{ "data": "Peers" },
{ data: 'MagnetUri',
render: function ( data, type, row ) {
if ( type === 'display' || type === 'filter' ) {
if(preferBlackholeDownload === true && row.BlackholeLink !== null){
return ' ';
}else if(data !== null){
return ' ';
}else if(row.Details !== null){
return ' ';
}else if(row.Guid !== null){
return ' ';
}else if(row.Link !== null){
return ' ';
}else{
return 'No Download Link';
}
}
return data;
}
},
],
"order": [[ 0, 'desc' ]],
"initComplete": function(settings, json) {
//ajaxloader();
ajaxblocker('.jackett-panel .white-box');
$('.clearJackett').parent().removeClass('hidden');
}
} );
}
function jackettDownload(url) {
let blackholeLink=url.substring(url.indexOf("/bh/"));
var post = {
url: blackholeLink
};
organizrAPI2('POST', 'api/v2/homepage/jackett/download/', post, true)
.success(function() {
message('Torrent downloaded','',activeInfo.settings.notifications.position,"#FFF","success","5000");
})
.fail(function(xhr) {
OrganizrApiError(xhr, 'Error downloading torrent');
});
}
function homepageOctoprint(timeout){
var timeout = (typeof timeout !== 'undefined') ? timeout : activeInfo.settings.homepage.refresh.homepageOctoprintRefresh;
organizrAPI2('GET','api/v2/homepage/octoprint/data').success(function(data) {
try {
let response = data.response;
document.getElementById('homepageOrderOctoprint').innerHTML = '';
if(response.data !== null){
$('#homepageOrderOctoprint').html(buildOctoprint(response.data));
}
}catch(e) {
organizrCatchError(e,data);
}
}).fail(function(xhr) {
OrganizrApiError(xhr);
});
let timeoutTitle = 'Octoprint-Homepage';
if(typeof timeouts[timeoutTitle] !== 'undefined'){ clearTimeout(timeouts[timeoutTitle]); }
timeouts[timeoutTitle] = setTimeout(function(){ homepageOctoprint(timeout); }, timeout);
delete timeout;
}
function buildOctoprint(array){
var menu = ``;
var headerAlt = '';
var header = '';
var content = '';
var webcamUrl = '';
var webcamHtml = '';
var css = `
`;
menu += `
REFRESH
`;
menu += ' ';
if(activeInfo.settings.homepage.options.alternateHomepageHeaders){
var headerAlt = `
`+menu+`
`;
}else{
var header = `
`;
}
content = 'State: '+array.data.job.state+'
';
if (array.data.job.state == "Printing") {
content += 'File: '+array.data.job.job.file.display+'
';
content += 'Progress: '+parseFloat(array.data.job.progress.completion).toFixed(0)+'%
';
content += 'Approx. Total Print Time: '+octoprintFormatTime(array.data.job.job.estimatedPrintTime)+'
';
content += 'Print Time Left: '+octoprintFormatTime(array.data.job.progress.printTimeLeft)+'
';
}
if (array.data.settings.webcam.webcamEnabled) {
webcamUrl = array.data.settings.webcam.streamUrl;
if (webcamUrl[0] == "/") {
webcamUrl = array.data.url + webcamUrl;
}
}
if (webcamUrl) {
var webcamHtml = ``;
}
return css+`
`;
}
function octoprintFormatTime(seconds) {
var format = "";
var days = Math.floor(moment.duration(seconds,'seconds').asDays());
var hours = Math.floor(moment.duration(seconds,'seconds').asHours());
var minutes = moment.duration(seconds,'seconds').minutes()
var seconds = moment.duration(seconds,'seconds').seconds()
if (days > 0) {
format += days + " "+octoprintPluralize("day", days)+" ";
}
if (hours > 0) {
format += hours + " "+octoprintPluralize("hour", hours)+" ";
}
if (minutes > 0) {
format += minutes + " "+octoprintPluralize("minute", minutes)+" ";
}
if (seconds > 0) {
format += seconds + " "+octoprintPluralize("second", seconds)+" ";
}
return format;
}
function octoprintPluralize(s, n) {
if (n > 1) {
return s+"s";
}
return s
}
function pad(n, width, z) {
z = z || '0';
n = n + '';
return n.length >= width ? n : new Array(width - n.length + 1).join(z) + n;
}
// Thanks Swifty!
function PopupCenter(url, title, w, h) {
// Fixes dual-screen position Most browsers Firefox
var dualScreenLeft = window.screenLeft != undefined ? window.screenLeft : window.screenX;
var dualScreenTop = window.screenTop != undefined ? window.screenTop : window.screenY;
var width = window.innerWidth ? window.innerWidth : document.documentElement.clientWidth ? document.documentElement.clientWidth : screen.width;
var height = window.innerHeight ? window.innerHeight : document.documentElement.clientHeight ? document.documentElement.clientHeight : screen.height;
var left = ((width / 2) - (w / 2)) + dualScreenLeft;
var top = ((height / 2) - (h / 2)) + dualScreenTop;
var newWindow = window.open(url, title, 'scrollbars=yes, width=' + w + ', height=' + h + ', top=' + top + ', left=' + left);
// Puts focus on the newWindow
if (window.focus) {
newWindow.focus();
}
return newWindow;
}
function getPlexHeaders(){
return {
'Accept': 'application/json',
'X-Plex-Product': activeInfo.appearance.title,
'X-Plex-Version': '2.0',
'X-Plex-Client-Identifier': activeInfo.settings.misc.uuid,
'X-Plex-Model': 'Plex OAuth',
'X-Plex-Platform': activeInfo.osName,
'X-Plex-Platform-Version': activeInfo.osVersion,
'X-Plex-Device': activeInfo.browserName,
'X-Plex-Device-Name': activeInfo.browserVersion,
'X-Plex-Device-Screen-Resolution': window.screen.width + 'x' + window.screen.height,
'X-Plex-Language': 'en'
};
}
var plex_oauth_window = null;
const plex_oauth_loader = '' +
'' +
'
' +
'
' +
'
' +
'Redirecting to the login page...' +
'
' +
'
';
function closePlexOAuthWindow() {
if (plex_oauth_window) {
plex_oauth_window.close();
}
}
getPlexOAuthPin = function () {
var x_plex_headers = getPlexHeaders();
var deferred = $.Deferred();
$.ajax({
url: 'https://plex.tv/api/v2/pins?strong=true',
type: 'POST',
headers: x_plex_headers,
success: function(data) {
deferred.resolve({pin: data.id, code: data.code});
},
error: function() {
closePlexOAuthWindow();
deferred.reject();
}
});
return deferred;
};
var polling = null;
function PlexOAuth(success, error, pre) {
if (typeof pre === "function") {
pre()
}
closePlexOAuthWindow();
plex_oauth_window = PopupCenter('', 'Plex-OAuth', 600, 700);
$(plex_oauth_window.document.body).html(plex_oauth_loader);
getPlexOAuthPin().then(function (data) {
var x_plex_headers = getPlexHeaders();
const pin = data.pin;
const code = data.code;
var oauth_params = {
'clientID': x_plex_headers['X-Plex-Client-Identifier'],
'context[device][product]': x_plex_headers['X-Plex-Product'],
'context[device][version]': x_plex_headers['X-Plex-Version'],
'context[device][platform]': x_plex_headers['X-Plex-Platform'],
'context[device][platformVersion]': x_plex_headers['X-Plex-Platform-Version'],
'context[device][device]': x_plex_headers['X-Plex-Device'],
'context[device][deviceName]': x_plex_headers['X-Plex-Device-Name'],
'context[device][model]': x_plex_headers['X-Plex-Model'],
'context[device][screenResolution]': x_plex_headers['X-Plex-Device-Screen-Resolution'],
'context[device][layout]': 'desktop',
'code': code
};
plex_oauth_window.location = 'https://app.plex.tv/auth/#!?' + encodeData(oauth_params);
polling = pin;
(function poll() {
$.ajax({
url: 'https://plex.tv/api/v2/pins/' + pin,
type: 'GET',
headers: x_plex_headers,
success: function (data) {
if (data.authToken){
closePlexOAuthWindow();
if (typeof success === "function") {
success('plex',data.authToken)
}
}
},
error: function (jqXHR, textStatus, errorThrown) {
if (textStatus !== "timeout") {
closePlexOAuthWindow();
if (typeof error === "function") {
error()
}
}
},
complete: function () {
if (!plex_oauth_window.closed && polling === pin){
setTimeout(function() {poll()}, 1000);
}
},
timeout: 10000
});
})();
}, function () {
closePlexOAuthWindow();
if (typeof error === "function") {
error()
}
});
}
function openOAuth(provider){
// will actually fix this later
closePlexOAuthWindow();
plex_oauth_window = PopupCenter('', 'OAuth', 600, 700);
$(plex_oauth_window.document.body).html(plex_oauth_loader);
plex_oauth_window.location = 'api/v2/oauth/trakt';
}
function encodeData(data) {
return Object.keys(data).map(function(key) {
return [key, data[key]].map(encodeURIComponent).join("=");
}).join("&");
}
function oAuthSuccess(type,token){
switch(type) {
case 'plex':
$('#oAuth-Input').val(token);
$('#oAuthType-Input').val(type);
$('#login-username-Input').addClass('hidden');
$('#login-password-Input').addClass('hidden');
$('#oAuth-div').removeClass('hidden');
$('.login-button').first().trigger('click');
break;
default:
break;
}
}
function oAuthError(){
messageSingle('',window.lang.translate('Error Connecting to oAuth Provider'),activeInfo.settings.notifications.position,'#FFF','error','5000');
}
function oAuthStart(type){
switch(type){
case 'plex':
PlexOAuth(oAuthSuccess,oAuthError);
break;
default:
break;
}
}
function clearAJAX(id='all'){
if(id == 'all'){
$.each(timeouts, function(i,v) {
clearTimeout(timeouts[i]);
});
}else if(id == 'homepage'){
$.each(timeouts, function(i,v) {
if(i.indexOf('-Homepage') > 0 ){
clearTimeout(timeouts[i]);
}
})
}else{
clearTimeout(timeouts[id]);
}
}
//Generate API
function generateCode() {
var code = "";
var possible = "abcdefghijklmnopqrstuvwxyz0123456789";
for (var i = 0; i < 20; i++)
code += possible.charAt(Math.floor(Math.random() * possible.length));
return code;
}
// uppercase word
function toUpper(str) {
return str
.toLowerCase()
.split(' ')
.map(function(word) {
return word[0].toUpperCase() + word.substr(1);
})
.join(' ');
}
// human filesize
function humanFileSize(bytes, si) {
var thresh = si ? 1000 : 1024;
if(Math.abs(bytes) < thresh) {
return bytes + ' B';
}
var units = si
? ['kB','MB','GB','TB','PB','EB','ZB','YB']
: ['KiB','MiB','GiB','TiB','PiB','EiB','ZiB','YiB'];
var u = -1;
do {
bytes /= thresh;
++u;
} while(Math.abs(bytes) >= thresh && u < units.length - 1);
return bytes.toFixed(1)+' '+units[u];
}
//youtube search
function youtubeSearch(searchQuery) {
return $.ajax({
url: "api/v2/homepage/youtube/"+searchQuery,
});
}
function youtubeCheck(title,link){
youtubeSearch(title).success(function(data) {
var response = data.response;
if(response.data){
inlineLoad();
var id = response.data.items["0"].id.videoId;
var div = `
`;
$('.youtube-div').html(div);
$('.'+link).trigger('click');
player = new Plyr('#player-'+link);
}
}).fail(function(xhr) {
OrganizrApiError(xhr, 'YouTube API Error');
});
}
//request search
function requestSearch(title,page=1) {
return $.ajax({
url: "https://api.themoviedb.org/3/search/multi?api_key=83cf4ee97bb728eeaf9d4a54e64356a1&language="+activeInfo.language+"&query="+title+"&page="+page+"&include_adult=false",
});
}
function requestSearchList(list,page=1) {
var url = '';
switch (list) {
case 'top-movie':
url = 'https://api.themoviedb.org/3/movie/top_rated?api_key=83cf4ee97bb728eeaf9d4a54e64356a1&language='+activeInfo.language+'®ion=US&page='+page;
break;
case 'pop-movie':
url = 'https://api.themoviedb.org/3/movie/popular?api_key=83cf4ee97bb728eeaf9d4a54e64356a1&language='+activeInfo.language+'®ion=US&page='+page;
break;
case 'up-movie':
url = 'https://api.themoviedb.org/3/movie/upcoming?api_key=83cf4ee97bb728eeaf9d4a54e64356a1&language='+activeInfo.language+'®ion=US&page='+page;
break;
case 'theatre-movie':
url = 'https://api.themoviedb.org/3/movie/now_playing?api_key=83cf4ee97bb728eeaf9d4a54e64356a1&language='+activeInfo.language+'®ion=US&page='+page;
break;
case 'top-tv':
url = 'https://api.themoviedb.org/3/tv/top_rated?api_key=83cf4ee97bb728eeaf9d4a54e64356a1&language='+activeInfo.language+'®ion=US&page='+page;
break;
case 'pop-tv':
url = 'https://api.themoviedb.org/3/tv/popular?api_key=83cf4ee97bb728eeaf9d4a54e64356a1&language='+activeInfo.language+'®ion=US&page='+page;
break;
case 'today-tv':
url = 'https://api.themoviedb.org/3/tv/airing_today?api_key=83cf4ee97bb728eeaf9d4a54e64356a1&language='+activeInfo.language+'®ion=US&page='+page;
break;
case 'org-mod':
url = 'https://api.themoviedb.org/4/list/64438?api_key=83cf4ee97bb728eeaf9d4a54e64356a1&language='+activeInfo.language+'&page='+page;
break;
default:
}
return $.ajax({
url: url,
});
}
function requestNewID(id) {
return $.ajax({
url: "https://api.themoviedb.org/3/tv/"+id+"/external_ids?api_key=83cf4ee97bb728eeaf9d4a54e64356a1&language=en-US",
});
}
function getTmdbImages(id, type) {
return $.ajax({
url: `https://api.themoviedb.org/3/${type}/${id}/images?api_key=83cf4ee97bb728eeaf9d4a54e64356a1`,
});
}
function inlineLoad(){
$('.inline-popups').magnificPopup({
removalDelay: 500, //delay removal by X to allow out-animation
closeOnBgClick: true,
//closeOnContentClick: true,
callbacks: {
beforeOpen: function() {
this.st.mainClass = this.st.el.attr('data-effect');
this.st.focus = '#request-input';
},
close: function() {
if(typeof player !== 'undefined'){
player.destroy();
}
}
},
midClick: true // allow opening popup on middle mouse click. Always set it to true if you don't provide alternative source.
});
}
//Import Users
function importUsers(type){
$('.importUsersButton').attr('disabled', true);
messageSingle('',window.lang.translate('Importing Users'),activeInfo.settings.notifications.position,'#FFF','success','5000');
organizrAPI2('POST','api/v2/users/import/'+type,{type:type}).success(function(data) {
try {
var response = data.response;
message('User Import',response.message,activeInfo.settings.notifications.position,"#FFF","success","5000");
$('.importUsersButton').attr('disabled', false);
}catch(e) {
organizrCatchError(e,data);
}
}).fail(function(xhr) {
OrganizrApiError(xhr, 'Import Error');
});
}
//Settings change auth
function changeAuth(){
var type = $('#authSelect').val();
var service = $('#authBackendSelect').val();
switch (service) {
case 'plex':
$('.switchAuth').parent().parent().parent().hide();
$('.backendAuth').parent().parent().parent().show();
$('.plexAuth').parent().parent().parent().show();
break;
case 'emby_local':
case 'emby_connect':
case 'emby_all':
$('.switchAuth').parent().parent().parent().hide();
$('.backendAuth').parent().parent().parent().show();
$('.embyAuth').parent().parent().parent().show();
break;
case 'jellyfin':
$('.switchAuth').parent().parent().parent().hide();
$('.backendAuth').parent().parent().parent().show();
$('.jellyfinAuth').parent().parent().parent().show();
break;
case 'ftp':
$('.switchAuth').parent().parent().parent().hide();
$('.backendAuth').parent().parent().parent().show();
$('.ftpAuth').parent().parent().parent().show();
break;
case 'ldap':
$('.switchAuth').parent().parent().parent().hide();
$('.backendAuth').parent().parent().parent().show();
$('.ldapAuth').parent().parent().parent().show();
break;
default:
$('.switchAuth').parent().parent().parent().hide();
$('.backendAuth').parent().parent().parent().show();
}
if(type == 'internal') { $('.switchAuth').parent().parent().parent().hide(); }
}
function organizrSpecialSettings(array){
//media search
if(array.settings.homepage.search.enabled == true && typeof array.settings.homepage.search.type !== 'undefined'){
var htmlDOM = `
`;
var searchBoxResults = `
`;
$(htmlDOM).prependTo('.navbar-right');
$(searchBoxResults).appendTo($('.organizr-area'));
}
}
function checkLocalForwardStatus(array){
if(array.settings.login.enableLocalAddressForward == true && typeof array.settings.login.enableLocalAddressForward !== 'undefined'){
if(array.settings.login.wanDomain !== '' && array.settings.login.localAddress !== ''){
organizrConsole('Organizr Function','Local Login Enabled');
organizrConsole('Organizr Function','Local Login Testing...');
let remoteSite = array.settings.login.wanDomain;
let localSite = array.settings.login.localAddress;
try {
let currentURL = decodeURI(window.location.href)
let currentSite = window.location.host;
if(activeInfo.settings.user.local && currentSite.indexOf(remoteSite) !== -1 && currentURL.indexOf('override') === -1){
organizrConsole('Organizr Function','Local Login Status: Local | Forwarding Now');
window.location = localSite;
}
} catch(e) {
console.error(e);
}
organizrConsole('Organizr Function','Local Login Status: Not Local');
}
}
}
function forceSearch(term){
$.magnificPopup.close();
var tabName = $("li[data-url^='api/v2/page/homepage']").find('span').html();
if($("li[data-url^='api/v2/page/homepage']").find('i').hasClass('tabLoaded')){
if($("li[data-url^='api/v2/page/homepage']").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) ? `Would you like to Request it? ` : '';
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 += `
`;
}
var buttons = `
`+total+`
`+movie+`
`+tv+`
`+music+`
`;
results = '' + results + '
';
return buttons+results;
}
function getPingList(arrayItems){
var pingList = [];
var timeout = (activeInfo.user.groupID <= 1) ? activeInfo.settings.homepage.refresh.adminPingRefresh : activeInfo.settings.homepage.refresh.otherPingRefresh;
if (Array.isArray(arrayItems['data']['tabs']) && arrayItems['data']['tabs'].length > 0) {
$.each(arrayItems['data']['tabs'], function(i,v) {
if(v.ping && v.ping_url !== null){
pingList.push(v.ping_url);
}
});
}
return (pingList.length > 0) ? pingUpdate(pingList,timeout): false;
}
function pingUpdateItem(ping){
if(activeInfo.user.groupID > activeInfo.settings.ping.auth){
return false;
}
organizrAPI2('GET','api/v2/ping/' + ping,).success(function(data) {
try {
var response = data.response;
}catch(e) {
organizrCatchError(e,data);
}
var i = ping;
var v = response.data;
var elm = $('.menu-'+cleanClass(i)+'-ping');
var elmMs = $('.menu-'+cleanClass(i)+'-ping-ms');
var catElm = elm.parent().parent().parent().parent().children('a').find('.menu-category-ping');
var error = '
';
var success = '';
var badCount = 0;
var goodCount = 0;
var previousState = (elm.attr('data-previous-state') == "") ? '' : elm.attr('data-previous-state');
var tabName = elm.attr('data-tab-name');
var status = (v == null) ? 'down' : 'up';
var ms = (v == null) ? 'down' : v+'ms';
var sendMessage = (previousState !== status && previousState !== '' && activeInfo.user.groupID <= activeInfo.settings.ping.authMessage) ? true : false;
var audioDown = (sendMessage) ? new Audio(activeInfo.settings.ping.offlineSound) : '';
var audioUp = (sendMessage) ? new Audio(activeInfo.settings.ping.onlineSound) : '';
elm.attr('data-previous-state', status);
let listing = elm.parent().parent().parent().parent().children('a').find('.menu-category-ping').parent().parent().find('li').find("div[class$='-ping']");
$.each(listing, function(i,v) {
let state = $(v).attr('data-previous-state');
if(state == 'up'){
goodCount = goodCount + 1
}else if(state == 'down'){
badCount = badCount + 1;
}
})
if(catElm.length > 0){
catElm.attr('data-bad', badCount);
catElm.attr('data-good', goodCount);
if(badCount == 0){
catElm.html(success);
}
}
if(activeInfo.user.groupID <= activeInfo.settings.ping.authMs && activeInfo.settings.ping.ms){ elmMs.removeClass('hidden').html(ms); }
switch (status){
case 'down':
elm.html(error);
catElm.html(error);
elm.parent().find('img').addClass('grayscale');
var msg = (sendMessage) ? message(tabName,'Server Down',activeInfo.settings.notifications.position,'#FFF','error','600000') : '';
var audio = (sendMessage && activeInfo.settings.ping.statusSounds) ? audioDown.play() : '';
break;
default:
elm.html(success);
elm.parent().find('img').removeClass('grayscale');
var msg = (sendMessage) ? message(tabName,'Server Back Online',activeInfo.settings.notifications.position,'#FFF','success','600000') : '';
var audio = (sendMessage && activeInfo.settings.ping.statusSounds) ? audioUp.play() : '';
}
}).fail(function(xhr) {
OrganizrApiError(xhr);
});
}
function pingUpdate(pingList,timeout){
$.each(pingList, function(i,v) {
pingUpdateItem(v);
})
var timeoutTitle = 'ping';
if(typeof timeouts[timeoutTitle] !== 'undefined'){ clearTimeout(timeouts[timeoutTitle]); }
timeouts[timeoutTitle] = setTimeout(function(){ pingUpdate(pingList,timeout); }, timeout);
}
function include(filename) {
var type = filename.split('.').pop();
switch (type){
case 'js':
var body = document.getElementsByTagName('body')[0];
var script = document.createElement('script');
script.src = filename;
script.type = 'text/javascript';
body.appendChild(script);
break;
case 'css':
var head = document.getElementById('style');
var script = document.createElement('link');
script.href = filename;
script.type = 'text/css';
script.rel = 'stylesheet';
head.appendChild(script);
break;
default:
return false;
}
return false;
}
function defineNotification(){
var bb = (typeof activeInfo !== 'undefined') ? activeInfo.settings.notifications.backbone : 'izi';
switch(bb){
case 'toastr':
include('plugins/bower_components/toast-master/css/jquery.toast.css');
include('plugins/bower_components/toast-master/js/jquery.toast.js');
window.notificationFunction = '$.toast';
break;
case 'izi':
include('plugins/bower_components/iziToast/css/iziToast.min.css');
include('plugins/bower_components/iziToast/js/iziToast.min.js');
window.notificationFunction = 'iziToast';
break;
case 'alertify':
include('plugins/bower_components/alertify/alertify.min.css');
include('plugins/bower_components/alertify/default.min.css');
include('plugins/bower_components/alertify/alertify.min.js');
window.notificationFunction = 'alertify';
break;
case 'noty':
include('plugins/bower_components/noty/noty.min.js');
include('plugins/bower_components/noty/mo.min.js');
include('plugins/bower_components/noty/noty.css');
include('plugins/bower_components/noty/mint.css');
window.notificationFunction = 'Noty';
break;
default:
return false
}
window.notificationsReady = true;
}
function messagePositions(){
return {
"br":{
"toastr":"bottom-right",
"alertify":"bottom-right",
"izi":"bottomRight",
"noty":"bottomRight",
},
"bl":{
"toastr":"bottom-left",
"alertify":"bottom-left",
"izi":"bottomLeft",
"noty":"bottomLeft",
},
"bc":{
"toastr":"bottom-center",
"alertify":"bottom-center",
"izi":"bottomCenter",
"noty":"bottomCenter",
},
"tr":{
"toastr":"top-right",
"alertify":"top-right",
"izi":"topRight",
"noty":"topRight",
},
"tl":{
"toastr":"top-left",
"alertify":"top-left",
"izi":"topLeft",
"noty":"topLeft",
},
"tc":{
"toastr":"top-center",
"alertify":"top-center",
"izi":"topCenter",
"noty":"topCenter",
},
"c":{
"toastr":"center",
"alertify":"bottom-center",
"izi":"center",
"noty":"center",
}
};
}
function message(heading,text,position,color,icon,timeout, single = false){
var bb = (typeof activeInfo !== 'undefined') ? activeInfo.settings.notifications.backbone : 'izi';
switch (bb) {
case 'toastr':
var ready = (eval( notificationFunction) !== undefined) ? true :false;
break;
case 'izi':
case 'alertify':
case 'noty':
try {
var ready = (typeof eval(notificationFunction) !== undefined) ? true :false;
} catch (e) {
if (e instanceof SyntaxError) {
setTimeout(function(){ message(heading,text,position,color,icon,timeout, single); }, 100);
}
}
break;
default:
var ready = false;
}
if(notificationsReady && ready){
oldPosition = position;
position = messagePositions()[position][bb];
if(typeof activeInfo === 'undefined'){
setTimeout(function(){ message(heading,text,oldPosition,color,icon,timeout, single); }, 100);
return false;
}
if(single){
switch (bb) {
case 'toastr':
$.toast().reset('all');
break;
case 'izi':
iziToast.destroy();
break;
case 'alertify':
alertify.dismissAll();
break;
case 'noty':
Noty.closeAll();
break;
default:
return false;
}
}
switch (bb) {
case 'toastr':
$.toast({
heading: heading,
text: text,
position: position,
loaderBg: color,
icon: icon,
hideAfter: timeout,
stack: 6,
showHideTransition: 'slide',
});
break;
case 'izi':
switch (icon){
case 'success':
var msg = {
icon: 'mdi mdi-check-circle-outline',
};
break;
case 'info':
var msg ={
icon: 'mdi mdi-information-outline',
};
break;
case 'error':
var msg ={
icon: 'mdi mdi-close-circle-outline',
};
break;
case 'warning':
var msg ={
icon: 'mdi mdi-alert-circle-outline',
};
break;
case 'update':
var msg ={
icon: 'mdi mdi-webpack',
};
break;
default:
var msg ={
icon: 'mdi mdi-alert-circle-outline',
};
}
iziToast.show({
close: true,
progressBar: true,
progressBarEasing: 'ease',
class: icon+'-notify',
title: heading,
message: text,
position: position,
timeout: timeout,
layout: 2,
transitionIn: 'flipInX',
transitionOut: 'flipOutX',
balloon: false,
icon: msg['icon'],
});
break;
case 'alertify':
var msgFull = (heading !== '') ? heading + ' ' + text : text;
timeout = timeout / 1000;
alertify.set('notifier','position', position);
alertify.notify(msgFull, icon+'-alertify', timeout);
break;
case 'noty':
if(typeof mojs == 'undefined'){
setTimeout(function(){ message(heading,text,oldPosition,color,icon,timeout); }, 100);
return false;
}
var msgFull = (heading !== '') ? heading + ' ' + text : text;
new Noty({
type: icon + '-noty',
layout: position,
text: msgFull,
progressBar: true,
timeout: timeout,
animation: {
open: function (promise) {
var n = this;
var Timeline = new mojs.Timeline();
var body = new mojs.Html({
el: n.barDom,
x: {500: 0, delay: 0, duration: 500, easing: 'elastic.out'},
isForce3d: true,
onComplete: function () {
promise(function (resolve) {
resolve();
})
}
});
var parent = new mojs.Shape({
parent: n.barDom,
width: 200,
height: n.barDom.getBoundingClientRect().height,
radius: 0,
x: {[150]: -150},
duration: 1.2 * 500,
isShowStart: true
});
n.barDom.style['overflow'] = 'visible';
parent.el.style['overflow'] = 'hidden';
var burst = new mojs.Burst({
parent: parent.el,
count: 10,
top: n.barDom.getBoundingClientRect().height + 75,
degree: 90,
radius: 75,
angle: {[-90]: 40},
children: {
fill: '#EBD761',
delay: 'stagger(500, -50)',
radius: 'rand(8, 25)',
direction: -1,
isSwirl: true
}
});
var fadeBurst = new mojs.Burst({
parent: parent.el,
count: 2,
degree: 0,
angle: 75,
radius: {0: 100},
top: '90%',
children: {
fill: '#EBD761',
pathScale: [.65, 1],
radius: 'rand(12, 15)',
direction: [-1, 1],
delay: .8 * 500,
isSwirl: true
}
});
Timeline.add(body, burst, fadeBurst, parent);
Timeline.play();
},
close: function (promise) {
var n = this;
new mojs.Html({
el: n.barDom,
x: {0: 500, delay: 10, duration: 500, easing: 'cubic.out'},
skewY: {0: 10, delay: 10, duration: 500, easing: 'cubic.out'},
isForce3d: true,
onComplete: function () {
promise(function (resolve) {
resolve();
})
}
}).play();
}
}
}).show();
break;
default:
organizrConsole('Organizr Function','Message case not setup');
}
}else{
setTimeout(function(){ message(heading,text,position,color,icon,timeout,single); }, 100);
}
}
function messageSingle(heading,text,position,color,icon,timeout){
message(heading,text,position,color,icon,timeout, true);
}
function blockDev(e) {
var evtobj = window.event ? event : e;
if (evtobj.keyCode == 73 && evtobj.shiftKey && evtobj.ctrlKey){
evtobj.preventDefault();
}
}
function authDebugCheck(){
if(activeInfo.settings.misc.authDebug == true){
message('REMINDER','Auth Debug is still enabled',activeInfo.settings.notifications.position,'#FFF','warning','20000');
}
}
function lock(){
if(activeInfo.settings.user.oAuthLogin == true){
message('Lock Disabled','Lock function disabled if logged in via oAuth',activeInfo.settings.notifications.position,'#FFF','warning','5000');
return false;
}
organizrAPI2('POST','api/v2/users/lock','').success(function(data) {
try {
let html = data.response;
location.reload();
}catch(e) {
organizrCatchError(e,data);
}
}).fail(function(xhr) {
OrganizrApiError(xhr, 'Lock Error');
});
}
function openSettings(){
var tab = $("li[data-url='api/v2/page/settings']").find('span').text();
tabActions('click',tab,0);
}
function openHomepage(){
var tab = $("li[data-url='api/v2/page/homepage']").find('span').text();
tabActions('click',tab,0);
}
function toggleFullScreenIcon(){
$('.fullscreen-icon').toggleClass('ti-fullscreen').toggleClass('mdi mdi-fullscreen-exit');
}
function toggleFullScreen() {
toggleFullScreenIcon();
if (!document.fullscreenElement && // alternative standard method
!document.mozFullScreenElement && !document.webkitFullscreenElement && !document.msFullscreenElement ) { // current working methods
if (document.documentElement.requestFullscreen) {
document.documentElement.requestFullscreen();
} else if (document.documentElement.msRequestFullscreen) {
document.documentElement.msRequestFullscreen();
} else if (document.documentElement.mozRequestFullScreen) {
document.documentElement.mozRequestFullScreen();
} else if (document.documentElement.webkitRequestFullscreen) {
document.documentElement.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT);
}
} else {
if (document.exitFullscreen) {
document.exitFullscreen();
} else if (document.msExitFullscreen) {
document.msExitFullscreen();
} else if (document.mozCancelFullScreen) {
document.mozCancelFullScreen();
} else if (document.webkitExitFullscreen) {
document.webkitExitFullscreen();
}
}
}
function orgErrorCode(code){
switch (code) {
case 'upgrading':
window.location.href = './plugins/static/upgrade.html';
default:
}
}
function clickPath(type,path=null){
switch(type){
case 'c':
case 'custom':
if(path !== null){
if(typeof path == 'object'){
$.each(path, function(i,v) {
$(v).trigger('click');
});
}else{
$(path).trigger('click');
}
}else{
return null;
}
break;
case 'update':
$('#settings-main-system-settings-anchor').trigger('click');
$('#settings-settings-updates-anchor').trigger('click');
break;
case 'sso':
$('#settings-main-system-settings-anchor').trigger('click');
$('#settings-settings-sso-anchor').trigger('click');
break;
default:
return null;
}
}
function toggleWritableFolders(){
$('.folders-writable').toggleClass('hidden');
}
function getAllTabNames(){
var allTabs = $('.allTabsList');
var tabList = [];
$.each(allTabs, function(i,v) {
tabList[i] = v.getAttribute('data-tab-name').toLowerCase();
});
return tabList;
}
function checkIfTabNameExists(tabName){
if (getAllTabNames().indexOf(tabName.toLowerCase()) == -1) {
return false;
}else{
return true;
}
}
function getLatestBlackberryThemes() {
return $.ajax({
url: 'https://api.github.com/repos/Archmonger/Blackberry-Themes/contents/Themes',
});
}
function getBlackberryTheme(theme) {
return $.ajax({
url: 'https://api.github.com/repos/Archmonger/Blackberry-Themes/contents/Themes/' + theme + '/Icons',
});
}
function showBlackberryThemes(target){
getLatestBlackberryThemes().success(function(data) {
try {
let themes = '';
$.each(data, function(i,v) {
if(v.name !== 'Beta'){
themes += ` ${v.name} `;
}
});
themes = `${themes}
`;
let html = `
`;
swal({
content: createElementFromHTML(html),
button: 'Close',
className: 'orgErrorAlert',
dangerMode: true
});
}catch(e) {
organizrCatchError(e,data);
}
}).fail(function(xhr) {
OrganizrApiError(xhr);
});
}
function selectBlackberryTheme(theme, target){
getBlackberryTheme(theme).success(function(data) {
try {
let icons = '';
$.each(data, function(i,v) {
v.name = v.name.split('.')[0];
v.name = cleanClass(v.name);
icons += ` `;
});
icons = `${icons}
`;
let html = `
`;
swal({
content: createElementFromHTML(html),
buttons: {
back: {
text: "Back To Themes",
value: "back",
dangerMode: true,
className: "bg-org-alt"
}
},
className: 'orgErrorAlert',
dangerMode: true
})
.then((value) => {
switch (value) {
case "back":
showBlackberryThemes();
break;
}
});
}catch(e) {
organizrCatchError(e,data);
}
}).fail(function(xhr) {
OrganizrApiError(xhr);
});
}
function orgErrorAlert(error){
let showError = false;
if(typeof activeInfo === 'undefined'){
showError = true;
}else{
if(activeInfo.settings.misc.debugErrors){
showError = true;
}
}
if(showError) {
let div = `
`;
swal({
content: createElementFromHTML(div),
button: 'OK',
className: 'orgErrorAlert',
dangerMode: true
});
}
}
function toggleDebug(){
var div = `
`;
swal({
content: createElementFromHTML(div),
button: "OK",
className: 'orgErrorAlert',
});
getDebugPreInfo();
}
function toggleCalendarFilter(){
var div = `
Filter Calendar
Choose Media Type
All
TV
Movie
Music
Choose Media Status
All
Downloaded
Unaired
Missing
Premier
`;
swal({
content: createElementFromHTML(div),
className: 'bg-org',
button: false
});
}
function closeOrgError(){
$('#main-org-error-container').removeClass('show');
$('#main-org-error').html('');
}
function isJSON(data) {
if (typeof data != 'string'){
data = JSON.stringify(data);
}
try {
JSON.parse(data);
return true;
} catch (e) {
return false;
}
}
function createElementFromHTML(htmlString) {
var div = document.createElement('div');
div.innerHTML = htmlString.trim();
return div.firstChild;
}
function addCoordinatesToInput(latitude, longitude){
$('#homepage-Weather-Air-form [name=homepageWeatherAndAirLatitude]').val(latitude).change();
$('#homepage-Weather-Air-form [name=homepageWeatherAndAirLongitude]').val(longitude).change();
swal.close();
message('Coordinates Added','Please Save',activeInfo.settings.notifications.position,'#FFF','success','10000');
}
function searchCoordinatesAPI(query){
messageSingle('Submitting Query','',activeInfo.settings.notifications.position,'#FFF','info','5000');
organizrAPI2('POST','api/v2/homepage/weather/coordinates',{query:query}).success(function(data) {
try {
let html = data.response;
if(html.data.type == 'FeatureCollection'){
var entries = '';
$.each(html.data.features, function(i,v) {
entries += ''+v.place_name+' ';
})
var div = `
`;
if(entries !== ''){
swal.close();
swal({
content: createElementFromHTML(div),
buttons: false,
className: 'bg-org'
})
}else{
message('API Error','No results found...',activeInfo.settings.notifications.position,'#FFF','warning','10000');
}
}else{
message('API Error','',activeInfo.settings.notifications.position,'#FFF','warning','10000');
console.error('Organizr Function: API failed');
}
}catch(e) {
organizrCatchError(e,data);
}
}).fail(function(xhr) {
OrganizrApiError(xhr, 'API Error');
});
}
function showLookupCoordinatesModal(){
var div = `
`;
swal({
content: createElementFromHTML(div),
buttons: false,
className: 'bg-org'
})
}
function showLDAPLoginTest(){
var div = `
`;
swal({
content: createElementFromHTML(div),
buttons: false,
className: 'bg-org'
})
}
function showPlexTokenForm(selector = null){
var div = `
`;
swal({
content: createElementFromHTML(div),
buttons: false,
className: 'bg-org'
})
}
function getPlexToken(selector) {
$('.plexTokenMessage').text("Grabbing Token");
$('.plexTokenHeader').addClass('panel-info').removeClass('panel-warning').removeClass('panel-danger');
var plex_username = $('#get-plex-token-form [name=username]').val().trim();
var plex_password = $('#get-plex-token-form [name=password]').val().trim();
var plex_tfa = $('#get-plex-token-form [name=tfa]').val().trim();
if ((plex_password !== '') && (plex_password !== '')) {
$.ajax({
type: 'POST',
headers: {
'X-Plex-Product':'Organizr',
'X-Plex-Version':'2.0',
'X-Plex-Client-Identifier':'01010101-10101010'
},
url: 'https://plex.tv/users/sign_in.json',
data: {
'user[login]': plex_username,
'user[password]': plex_password + plex_tfa,
force: true
},
cache: false,
async: true,
complete: function(xhr, status) {
var result = $.parseJSON(xhr.responseText);
if (xhr.status === 201) {
$('.plexTokenMessage').text(xhr.statusText);
$('.plexTokenHeader').addClass('panel-success').removeClass('panel-info').removeClass('panel-warning').removeClass('panel-danger');
$(selector).val(result.user.authToken);
$(selector).change();
messageSingle('Token created','Please save...',activeInfo.settings.notifications.position,'#FFF','success','5000');
} else {
$('.plexTokenMessage').text(xhr.statusText);
$('.plexTokenHeader').addClass('panel-danger').removeClass('panel-info').removeClass('panel-warning');
}
}
});
} else {
$('.plexTokenMessage').text("Enter Username and Password");
$('.plexTokenHeader').addClass('panel-warning').removeClass('panel-info').removeClass('panel-danger');
}
}
function showPlexMachineForm(selector = null){
var div = `
`;
swal({
content: createElementFromHTML(div),
buttons: false,
className: 'bg-org'
})
.then(
organizrAPI2('GET','api/v2/plex/servers?owned').success(function(data) {
try {
let response = data.response;
$('.plexMachineMessage').text('Choose Plex Server');
$('.plexMachineHeader').addClass('panel-success').removeClass('panel-info').removeClass('panel-warning');
let machines = 'Choose Plex Machine ';
$.each(response.data, function(i,v) {
let name = v.name;
let machine = v.machineIdentifier;
name = name + ' [' + machine + ']';
machines += ''+name+' ';
})
let listing = ''+machines+' ';
$('.plexMachineListing').html(listing);
}catch(e) {
organizrCatchError(e,data);
}
}).fail(function(xhr) {
OrganizrApiError(xhr, 'API Error');
$('.plexMachineMessage').text("Plex Token Needed First");
$('.plexMachineHeader').addClass('panel-warning').removeClass('panel-info').removeClass('panel-danger');
})
);
}
function oAuthLoginNeededCheck() {
if(OAuthLoginNeeded == false){
return false;
}else{
if(activeInfo.user.loggedin == true){
return false;
}
}
message('OAuth', ' Proceeding to login', activeInfo.settings.notifications.position, '#FFF', 'info', '10000');
organizrAPI2('POST', 'api/v2/login', '').success(function (data) {
local('set','message','Welcome|Login Successful|success');
local('r','loggingIn');
location.reload();
}).fail(function (xhr) {
$('div.login-box').unblock({});
switch (xhr.status){
case 401:
if(xhr.responseJSON.response.message == '2FA Code incorrect'){
$('div.login-box').unblock({});
$('#tfa-div').removeClass('hidden');
$('#loginform [name=tfaCode]').focus();
}
break;
case 403:
$('div.login-box').block({
message: ' Locked Out!',
css: {
color: '#fff',
border: '1px solid #e91e63',
backgroundColor: '#f44336'
}
});
setTimeout(function(){ local('r','loggingIn'); location.reload() }, 10000);
break;
case 422:
$('div.login-box').unblock({});
$('#tfa-div').removeClass('hidden');
$('#loginform [name=tfaCode]').focus();
break;
default:
message('Login Error', 'API Connection Failed', activeInfo.settings.notifications.position, '#FFF', 'error', '10000');
console.error("Organizr Function: API Connection Failed");
}
message('Login Error', xhr.responseJSON.response.message, activeInfo.settings.notifications.position, '#FFF', 'warning', '10000');
console.error("Organizr Function: " + xhr.responseJSON.response.message);
local('r','loggingIn');
});
}
function ipInfoSpan(ip){
return ''+ip+' ';
}
function checkToken(activate = false){
if(typeof activeInfo !== 'undefined'){
if(typeof activeInfo.settings.misc.uuid !== 'undefined'){
var token = getCookie('organizr_token_' + activeInfo.settings.misc.uuid);
if(token){
setTimeout(function(){ checkToken(true); }, 5000);
}else{
if(activate){
local('set','message','Token Expired|You have been logged out|error');
location.reload();
}
}
}
}
}
function objDiff(obj1, obj2) {
// Make sure an object to compare is provided
if (!obj2 || Object.prototype.toString.call(obj2) !== '[object Object]') {
return obj1;
}
//
// Variables
//
var diffs = {};
var key;
//
// Methods
//
/**
* Check if two arrays are equal
* @param {Array} arr1 The first array
* @param {Array} arr2 The second array
* @return {Boolean} If true, both arrays are equal
*/
var arraysMatch = function (arr1, arr2) {
// Check if the arrays are the same length
if (arr1.length !== arr2.length) return false;
// Check if all items exist and are in the same order
for (var i = 0; i < arr1.length; i++) {
if (arr1[i] !== arr2[i]) return false;
}
// Otherwise, return true
return true;
};
/**
* Compare two items and push non-matches to object
* @param {*} item1 The first item
* @param {*} item2 The second item
* @param {String} key The key in our object
*/
var compare = function (item1, item2, key) {
// Get the object type
var type1 = Object.prototype.toString.call(item1);
var type2 = Object.prototype.toString.call(item2);
// If type2 is undefined it has been removed
if (type2 === '[object Undefined]') {
diffs[key] = null;
return;
}
// If items are different types
if (type1 !== type2) {
diffs[key] = item2;
return;
}
// If an object, compare recursively
if (type1 === '[object Object]') {
var objDiff = diff(item1, item2);
if (Object.keys(objDiff).length > 1) {
diffs[key] = objDiff;
}
return;
}
// If an array, compare
if (type1 === '[object Array]') {
if (!arraysMatch(item1, item2)) {
diffs[key] = item2;
}
return;
}
// Else if it's a function, convert to a string and compare
// Otherwise, just compare
if (type1 === '[object Function]') {
if (item1.toString() !== item2.toString()) {
diffs[key] = item2;
}
} else {
if (item1 !== item2 ) {
diffs[key] = item2;
}
}
};
//
// Compare our objects
//
// Loop through the first object
for (key in obj1) {
if (obj1.hasOwnProperty(key)) {
compare(obj1[key], obj2[key], key);
}
}
// Loop through the second object and find missing items
for (key in obj2) {
if (obj2.hasOwnProperty(key)) {
if (!obj1[key] && obj1[key] !== obj2[key] ) {
diffs[key] = obj2[key];
}
}
}
// Return the object of differences
return diffs;
}
function organizrConsole(subject,msg,type = 'info'){
let color;
switch (type){
case 'error':
color = '#ed2e72';
break;
case 'warning':
color = '#272361';
break;
default:
color = '#2cabe3';
break;
}
console.info("%c "+subject+" %c ".concat(msg, " "), "color: white; background: "+color+"; font-weight: 700;", "color: "+color+"; background: white; font-weight: 700;");
}
function organizrCatchError(e,data){
organizrConsole('Organizr API Function',data,'warning');
orgErrorAlert('' + e + ' ' + formatDebug(data));
return false;
}
function OrganizrApiError(xhr, secondaryMessage = null){
let msg = '';
if(typeof xhr.responseJSON !== 'undefined'){
msg = xhr.responseJSON.response.message;
}else if(typeof xhr.statusText !== 'undefined'){
msg = xhr.statusText;
}else if(typeof xhr.responseText !== 'undefined'){
msg = xhr.responseText;
}else{
msg = 'Connection Error';
}
organizrConsole('Organizr API Function',msg,'error');
if(secondaryMessage){
message(secondaryMessage, msg, activeInfo.settings.notifications.position, '#FFF', 'error', '10000');
}
return false;
}
function checkForUpdates(){
if(activeInfo.user.loggedin && activeInfo.user.groupID <= 1){
updateCheck();
checkCommitLoad();
}
}
function loadJavascript(script = null, defer = false){
if(script){
organizrConsole('JS Loader',script);
organizrConsole('JS Loader','Checking if script is loaded...');
let loaded = $('script[src="'+script+'"]').length;
if(!loaded){
organizrConsole('JS Loader','Script is NOT loaded... Loading now...');
let head = document.getElementsByTagName('head')[0];
let scriptEl = document.createElement('script');
scriptEl.type = 'text/javascript';
scriptEl.src = script;
scriptEl.defer = false;
head.appendChild(scriptEl);
}else{
organizrConsole('JS Loader','Script already loaded');
}
}
}
function tabShit(){
}
function msToTime(s) {
let pad = (n, z = 2) => ('00' + n).slice(-z);
let hours = (pad(s/3.6e6|0) !== '00') ? pad(s/3.6e6|0) + ':' : '';
let mins = pad((s%3.6e6)/6e4 | 0) + ':';
let secs = pad((s%6e4)/1000|0);
let ms = pad(s%1000, 3);
if(ms >= '500'){ secs = pad(parseFloat(secs) + 1, 2); }
return hours+mins+secs;
}
function clickMenuItem(selector){
if($(selector).length >= 1){
$(selector).click();
}else{
$('body').arrive(selector, {onceOnly: true}, function() {
$(selector).click();
});
}
}
function shortcut(selectors = ''){
let timeout = 200;
if(typeof selectors == 'string') {
if(selectors == ''){
selectors = [];
}else{
switch (selectors){
case 'custom-cert':
selectors = ['#settings-main-system-settings-anchor','#settings-settings-main-anchor','a[href$="Certificate"]'];
break;
default:
selectors = ['#settings-main-system-settings-anchor'];
}
}
}
selectors.forEach(function(selector){
timeout = timeout + 200;
setTimeout(function(){
clickMenuItem(selector);
}, timeout);
});
}
function launch(){
console.info('https://docs.organizr.app/books/setup-features/page/organizr-20--%3E-21-migration-guide');
organizrConsole('API V2 API','If you see a 404 Error for api/v2/launch below this line, you have not setup the new location block... See URL above this line', 'error');
organizrConnect('api/v2/launch').success(function (data) {
try {
let json = data.response;
if(json.data.user == false){ location.reload(); }
currentVersion = json.data.version;
activeInfo = {
timezone:Intl.DateTimeFormat().resolvedOptions().timeZone,
offest:new Date().getTimezoneOffset(),
language:language(moment.locale(navigator.languages[0])),
browserVersion:bowser.name,
browserName:bowser.version,
mobile:bowser.mobile,
tablet:bowser.tablet,
osName:bowser.osname,
osVersion:bowser.osversion,
serverOS:json.data.status.os,
phpVersion:json.data.status.php,
token:json.data.user.token,
user:json.data.user,
plugins:json.data.plugins,
branch:json.data.branch,
sso:json.data.sso,
settings:json.data.settings,
appearance:json.data.appearance,
theme:json.data.theme,
style:json.data.style,
version:json.data.version
};
// Add element to signal activeInfo Ready
$('#wrapper').after('
');
console.info("%c Organizr %c ".concat(currentVersion, " "), "color: white; background: #66D9EF; font-weight: 700; font-size: 24px; font-family: Monospace;", "color: #66D9EF; background: white; font-weight: 700; font-size: 24px; font-family: Monospace;");
console.info("%c Status %c ".concat("Starting Up...", " "), "color: white; background: #F92671; font-weight: 700;", "color: #F92671; background: white; font-weight: 700;");
//local('set','initial',true);
//setTimeout(function(){ local('r','initial'); }, 300);
defineNotification();
checkMessage();
errorPage();
uriRedirect();
changeStyle(activeInfo.style);
changeTheme(activeInfo.theme);
setSSO();
checkToken();
switch (json.data.status.status) {
case "wizard":
buildWizard();
buildLanguage('wizard');
break;
case "dependencies":
buildDependencyCheck(json);
break;
case "ok":
loadAppearance(json.data.appearance);
if(activeInfo.user.locked == 1){
buildLockscreen();
}else{
userMenu(json);
categoryProcess(json);
tabProcess(json);
buildSplashScreen(json);
accountManager(json);
organizrSpecialSettings(json.data);
getPingList(json);
checkLocalForwardStatus(json.data);
checkForUpdates();
}
loadCustomJava(json.data.appearance);
if(getCookie('lockout')){
$('.show-login').click();
setTimeout(function(){
$('div.login-box').block({
message: ' Locked Out!',
css: {
color: '#fff',
border: '1px solid #e91e63',
backgroundColor: '#f44336'
}
});
}, 1000);
setTimeout(function(){ location.reload() }, 60000);
}
break;
default:
console.error('Organizr Function: Action not set or defined');
}
console.info("%c Organizr %c ".concat("DOM Fully loaded", " "), "color: white; background: #AD80FD; font-weight: 700;", "color: #AD80FD; background: white; font-weight: 700;");
oAuthLoginNeededCheck();
} catch (e) {
orgErrorCode(data);
defineNotification();
message('FATAL ERROR',data,'br','#FFF','error','60000');
return false;
}
}).fail(function(xhr) {
defineNotification();
if(xhr.status == 404){
orgErrorAlert('Webserver not setup for Organizr v2.1 Webserver Error: ' + xhr.responseText);
message('FATAL ERROR','You need to update webserver location block... check browser console for migration URL','br','#FFF','error','60000');
}else{
orgErrorAlert('Webserver Error: ' + xhr.responseText);
}
});
}
`+array.company_name+`
`+array.about+extraInfo+`