`;
if(count%2 == 0 || count == total ){ group += '
'; };
});
group += '
';
}
});
return group;
}
function buildImageManagerViewItem(array){
var imageListing = '';
if (Array.isArray(array)) {
$.each(array, function(i,v) {
var filepath = v.split("/");
var name = filepath[3].split(".");
imageListing += `
`+name[0]+`
`;
});
}
return imageListing;
}
function buildImageManagerView(){
ajaxloader(".content-wrap","in");
organizrAPI('GET','api/?v1/image/list').success(function(data) {
var response = JSON.parse(data);
$('#settings-image-manager-list').html(buildImageManagerViewItem(response.data));
;
}).fail(function(xhr) {
console.error("Organizr Function: API Connection Failed");
});
ajaxloader();
}
function buildCustomizeAppearance(){
ajaxloader(".content-wrap","in");
organizrAPI('GET','api/?v1/customize/appearance').success(function(data) {
var response = JSON.parse(data);
$('#customize-appearance-form').html(buildFormGroup(response.data));
$(".colorpicker").asColorPicker({
mode: 'complex',
color: {
format: false,
alphaConvert: false
}
});
}).fail(function(xhr) {
console.error("Organizr Function: API Connection Failed");
});
ajaxloader();
}
function buildSSO(){
ajaxloader(".content-wrap","in");
organizrAPI('GET','api/?v1/sso').success(function(data) {
var response = JSON.parse(data);
$('#sso-form').html(buildFormGroup(response.data));
;
}).fail(function(xhr) {
console.error("Organizr Function: API Connection Failed");
});
ajaxloader();
}
function buildSettingsMain(){
ajaxloader(".content-wrap","in");
organizrAPI('GET','api/?v1/settings/main').success(function(data) {
var response = JSON.parse(data);
$('#settings-main-form').html(buildFormGroup(response.data));
changeAuth();
;
}).fail(function(xhr) {
console.error("Organizr Function: API Connection Failed");
});
ajaxloader();
}
function buildUserManagement(){
ajaxloader(".content-wrap","in");
organizrAPI('GET','api/?v1/user/list').success(function(data) {
var response = JSON.parse(data);
$('#manageUserTable').html(buildUserManagementItem(response.data));
}).fail(function(xhr) {
console.error("Organizr Function: API Connection Failed");
});
ajaxloader();
}
function buildGroupManagement(){
ajaxloader(".content-wrap","in");
organizrAPI('GET','api/?v1/user/list').success(function(data) {
var response = JSON.parse(data);
$('#manageGroupTable').html(buildGroupManagementItem(response.data));
}).fail(function(xhr) {
console.error("Organizr Function: API Connection Failed");
});
ajaxloader();
}
function buildTabEditor(){
ajaxloader(".content-wrap","in");
organizrAPI('GET','api/?v1/tab/list').success(function(data) {
var response = JSON.parse(data);
$('#tabEditorTable').html(buildTabEditorItem(response.data));
}).fail(function(xhr) {
console.error("Organizr Function: API Connection Failed");
});
ajaxloader();
}
function buildCategoryEditor(){
ajaxloader(".content-wrap","in");
organizrAPI('GET','api/?v1/tab/list').success(function(data) {
var response = JSON.parse(data);
$('#categoryEditorTable').html(buildCategoryEditorItem(response.data));
}).fail(function(xhr) {
console.error("Organizr Function: API Connection Failed");
});
ajaxloader();
}
function settingsAPI(post, callbacks=null){
ajaxloader(".content-wrap","in");
organizrAPI('POST',post.api,post).success(function(data) {
var response = JSON.parse(data);
message(post.messageTitle,post.messageBody,"bottom-right","#FFF","success","5000");
if(callbacks){ callbacks.fire(); }
}).fail(function(xhr) {
console.error(post.error);
});
ajaxloader();
}
/* END ORGANIZR API FUNCTIONS */
function buildLanguage(replace=false,newLang=null){
var languages = languageList();
var languageItems = '';
var currentLanguage = (getCookie('organizrLanguage')) ? getCookie('organizrLanguage') : window.lang.currentLang;
$.each(languages, function(i,v) {
var active = (i == currentLanguage) ? '' : '';
languageItems += `
`;
});
break;
default:
}
break;
case 'transmission':
switch (type) {
case 'queue':
if(array.arguments.torrents == 0){
return '
Nothing in queue
';
}
$.each(array.arguments.torrents, function(i,v) {
switch (v.status) {
case 7:
case '7':
var status = 'No Peers';
break;
case 6:
case '6':
var status = 'Seeding';
break;
case 5:
case '5':
var status = 'Seeding Queued';
break;
case 4:
case '4':
var status = 'Downloading';
break;
case 3:
case '3':
var status = 'Queued';
break;
case 2:
case '2':
var status = 'Checking Files';
break;
case 1:
case '1':
var status = 'File Check Queued';
break;
case 0:
case '0':
var status = 'Complete';
break;
default:
var status = 'Complete';
}
var percent = Math.floor(v.percentDone * 100);
v.Category = (v.Category !== '') ? v.Category : 'Not Set';
items += `
`+v.name+`
`+status+`
`+v.downloadDir+`
`+humanFileSize(v.totalSize,true)+`
`+percent+`%
`;
});
break;
default:
}
break;
case 'qBittorrent':
switch (type) {
case 'queue':
if(array.arguments.torrents == 0){
return '
Nothing in queue
';
}
$.each(array.arguments.torrents, function(i,v) {
switch (v.state) {
case 'stalledDL':
var status = 'No Peers';
break;
case 'metaDL':
var status = 'Getting Metadata';
break;
case 'uploading':
var status = 'Seeding';
break;
case 'queuedUP':
var status = 'Seeding Queued';
break;
case 'downloading':
var status = 'Downloading';
break;
case 'queuedDL':
var status = 'Queued';
break;
case 'checkingDL':
case 'checkingUP':
var status = 'Checking Files';
break;
case 'pausedDL':
var status = 'Paused';
break;
case 'pausedUP':
var status = 'Complete';
break;
default:
var status = 'Complete';
}
var percent = Math.floor(v.progress * 100);
var size = v.total_size != -1 ? humanFileSize(v.total_size,true) : "?";
items += `
`+v.name+`
`+status+`
`+v.save_path+`
`+size+`
`+percent+`%
`;
});
break;
default:
}
break;
case 'deluge':
switch (type) {
case 'queue':
if(array.length == 0){
return '
`;
}
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+`
`+genres+`
`+v.metadata.summary+`
`+actors+`
`;
});
return metadata;
}
function homepageDownloader(type, timeout=30000){
//if(isHidden()){ return; }
switch (type) {
case 'sabnzbd':
var action = 'getSabnzbd';
break;
case 'nzbget':
var action = 'getNzbget';
break;
case 'transmission':
var action = 'getTransmission';
break;
case 'qBittorrent':
var action = 'getqBittorrent';
break;
case 'deluge':
var action = 'getDeluge';
break;
default:
}
organizrAPI('POST','api/?v1/homepage/connect',{action:action}).success(function(data) {
var response = JSON.parse(data);
document.getElementById('homepageOrder'+type).innerHTML = '';
$('#homepageOrder'+type).html(buildDownloader(response.data, type));
}).fail(function(xhr) {
console.error("Organizr Function: API Connection Failed");
});
setTimeout(function(){
homepageDownloader(type, timeout);
}, timeout)
}
function homepageStream(type, timeout=30000){
//if(isHidden()){ return; }
switch (type) {
case 'plex':
var action = 'getPlexStreams';
break;
case 'emby':
var action = 'getEmbyStreams';
break;
default:
}
ajaxloader(".content-wrap","in");
organizrAPI('POST','api/?v1/homepage/connect',{action:action}).success(function(data) {
var response = JSON.parse(data);
document.getElementById('homepageOrder'+type+'nowplaying').innerHTML = '';
$('#homepageOrder'+type+'nowplaying').html(buildStream(response.data, type));
}).fail(function(xhr) {
console.error("Organizr Function: API Connection Failed");
});
ajaxloader();
setTimeout(function(){
homepageStream(type, timeout);
}, timeout)
}
function homepageRecent(type, timeout=30000){
//if(isHidden()){ return; }
switch (type) {
case 'plex':
var action = 'getPlexRecent';
break;
case 'emby':
var action = 'getEmbyRecent';
break;
default:
}
ajaxloader(".content-wrap","in");
organizrAPI('POST','api/?v1/homepage/connect',{action:action}).success(function(data) {
var response = JSON.parse(data);
document.getElementById('homepageOrder'+type+'recent').innerHTML = '';
$('#homepageOrder'+type+'recent').html(buildRecent(response.data, type));
$('.recent-items').owlCarousel({
margin:40,
nav:false,
autoplay:false,
dots:false,
responsive:{
0:{
items:2
},
500:{
items:3
},
650:{
items:4
},
800:{
items:5
},
950:{
items:6
},
1100:{
items:7
},
1250:{
items:8
},
1400:{
items:9
},
1550:{
items:10
},
1700:{
items:11
},
1850:{
items:12
},
2000:{
items:13
},
2150:{
items:14
},
2300:{
items:15
},
2450:{
items:16
}
}
})
}).fail(function(xhr) {
console.error("Organizr Function: API Connection Failed");
});
ajaxloader();
setTimeout(function(){
homepageRecent(type, timeout);
}, timeout)
}
function homepageCalendar(timeout=30000){
//if(isHidden()){ return; }
ajaxloader(".content-wrap","in");
organizrAPI('POST','api/?v1/homepage/connect',{action:'getCalendar'}).success(function(data) {
var response = JSON.parse(data);
$('#calendar').fullCalendar('removeEvents');
$('#calendar').fullCalendar('addEventSource', response.data);
response = '';
}).fail(function(xhr) {
console.error("Organizr Function: API Connection Failed");
});
ajaxloader();
setTimeout(function(){
homepageCalendar(timeout);
}, timeout)
}
//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];
}
//Settings change auth
function changeAuth(){
var type = $('#authSelect').val();
var service = $('#authBackendSelect').val();
switch (service) {
case 'plex':
$('.switchAuth').parent().parent().parent().hide();
$('.backendAuth').parent().parent().parent().show();
$('.plexAuth').parent().parent().parent().show();
break;
case 'emby_local':
case 'emby_connect':
case 'emby_all':
$('.switchAuth').parent().parent().parent().hide();
$('.backendAuth').parent().parent().parent().show();
$('.embyAuth').parent().parent().parent().show();
break;
case 'ftp':
$('.switchAuth').parent().parent().parent().hide();
$('.backendAuth').parent().parent().parent().show();
$('.ftpAuth').parent().parent().parent().show();
break;
case 'ldap':
$('.switchAuth').parent().parent().parent().hide();
$('.backendAuth').parent().parent().parent().show();
$('.ldapAuth').parent().parent().parent().show();
break;
default:
$('.switchAuth').parent().parent().parent().hide();
$('.backendAuth').parent().parent().parent().show();
}
if(type == 'internal') { $('.switchAuth').parent().parent().parent().hide(); }
}
function launch(){
organizrConnect('api/?v1/launch_organizr').success(function (data) {
var json = JSON.parse(data);
if(json.data.user == false){ location.reload(); }
currentVersion = json.data.status.version;
activeInfo = {
timezone:Intl.DateTimeFormat().resolvedOptions().timeZone,
offest:new Date().getTimezoneOffset(),
language:language(moment.locale(navigator.languages[0])),
browserVersion:bowser.name,
browserName:bowser.version,
mobile:bowser.mobile,
tablet:bowser.tablet,
osName:bowser.osname,
osVersion:bowser.osversion,
serverOS:json.data.status.os,
phpVersion:json.data.status.php,
token:json.data.user.token,
branch:json.branch,
sso:json.sso,
theme:json.theme,
style:json.style,
version:json.version
};
console.log("%cOrganizr","color: #66D9EF; font-size: 24px; font-family: Monospace;");
console.log("%cVersion: "+currentVersion,"color: #AD80FD; font-size: 12px; font-family: Monospace;");
console.log("%cStarting Up...","color: #F92671; font-size: 12px; font-family: Monospace;");
checkMessage();
errorPage();
changeStyle(activeInfo.style);
changeTheme(activeInfo.theme);
setSSO();
switch (json.data.status.status) {
case "wizard":
buildWizard();
buildLanguage('wizard');
break;
case "dependencies":
buildDependencyCheck(json);
break;
case "ok":
loadAppearance(json.appearance);
userMenu(json);
categoryProcess(json);
tabProcess(json);
break;
default:
console.error('Organizr Function: Action not set or defined');
}
});
}