';
$('#debugPreInfo').html(formatted);
if(bowser.mobile !== true){
$('#debugPreInfo > .whitebox').slimScroll();
}
}
function orgDebugList(cmd){
if(cmd !== ''){
$('#debug-input').val(cmd);
orgDebug();
}
}
function updateIssueLink(line){
var preNumber = line.match(/\((.*?)\)/g);
if(preNumber !== null){
preNumber = preNumber.toString();
var issueNumber = preNumber.substr(2, (preNumber.length - 3));
var issueLink = 'https://github.com/causefx/Organizr/issues/' + issueNumber;
issueLink = '' + preNumber + '';
return line.replace(preNumber, issueLink);
}else{
return line;
}
}
function clipboard(trigger = true, string = null){
let clipboard = $('#internal-clipboard');
if(string){
clipboard.attr('data-clipboard-text',string );
}
if(trigger){
clipboard.click();
}
}
function getLangStrings(){
let strings = JSON.stringify(window.langStrings, null, '\t');
clipboard(true,strings);
console.log('Copied JSON Strings to clipboard');
}
function getHiddenProp(){
var prefixes = ['webkit','moz','ms','o'];
// if 'hidden' is natively supported just return it
if ('hidden' in document) return 'hidden';
// otherwise loop over all the known prefixes until we find one
for (var i = 0; i < prefixes.length; i++){
if ((prefixes[i] + 'Hidden') in document)
return prefixes[i] + 'Hidden';
}
// otherwise it's not supported
return null;
}
function isHidden() {
var prop = getHiddenProp();
if (!prop) return false;
return document[prop];
}
function loadLanguageList(){
$.each(languageList, function(i,v) {
lang.dynamic(v.code, 'js/langpack/'+v.filename);
});
}
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
function contains(target, pattern){
var value = 0;
pattern.forEach(function(word){
value = value + target.includes(word);
});
return (value === 1)
}
function isNumberKey(evt) {
var charCode = (evt.which) ? evt.which : event.keyCode;
if ((charCode < 48 || charCode > 57))
return false;
return true;
}
function timerIncrement() {
//check for cookieExpiry
if(hasCookie){
if(getCookie('organizrToken')){
//do nothing
}else{
location.reload();
}
}
idleTime = idleTime + 1;
if(activeInfo.settings.lockout.enabled && activeInfo.settings.user.oAuthLogin !== true){
if (idleTime > activeInfo.settings.lockout.timer && $('#lockScreen').length !== 1) {
if(activeInfo.user.groupID <= activeInfo.settings.lockout.minGroup && activeInfo.user.groupID >= activeInfo.settings.lockout.maxGroup){
lock();
}
}
}
}
function ajaxloader(element=null, action='out'){
var loader = `
`;
switch (action) {
case 'in':
case 'fadein':
$(loader).appendTo(element);
break;
case 'out':
case 'fadeout':
$('.ajaxloader').remove();
break;
default:
$('.ajaxloader').remove();
}
}
function getDefault(tabName,tabType){
if(getHash() === false){
if(tabName !== null && tabType !== null){
switchTab(tabName,tabType);
}else{
$('#side-menu').children().first().children().click()
}
}else{
var hashTab = getHash();
var hashType = getTabType(hashTab);
if (typeof hashTab !== 'undefined' && typeof hashType !== 'undefined') {
switchTab(hashTab,hashType);
}else{
console.warn("Tab Function: "+hashTab+" is not a defined tab");
}
}
}
function getTabType(tabName){
var tabType = $('#menu-'+tabName);
if (typeof tabType !== 'undefined') {
return tabType.attr('type');
}else{
return false;
}
}
function getHash(){
if ($(location).attr('hash')){
return $(location).attr('hash').substr(1);
}
return false;
}
function setHash(hash){
window.location.hash = '#'+hash;
}
function getQueryVariable(variable){
var query = window.location.search.substring(1);
console.log(query);
var vars = query.split("&");
console.log(vars);
for (var i=0;i';
}else if(tabIcon[0] == 'alphanumeric'){
return ''+tabIcon[1]+'';
}else{
return '';
}
}else{
return '';
}
}
function iconPrefixSplash(source){
var tabIcon = source.split("::");
var icons = {
"materialize":"mdi mdi-",
"fontawesome":"fa fa-",
"themify":"ti-",
"simpleline":"icon-",
"weathericon":"wi wi-",
"alphanumeric":"fa-fw",
};
if(Array.isArray(tabIcon) && tabIcon.length === 2){
if(tabIcon[0] !== 'url' && tabIcon[0] !== 'alphanumeric'){
return '';
}else if(tabIcon[0] == 'alphanumeric'){
return ''+tabIcon[1]+'';
}else{
return tabIcon[1];
}
}else{
return source;
}
}
function cleanClass(string){
return string.replace(/ +/g, "-").replace(/\W+/g, "-");
}
function noTabs(arrayItems){
if (arrayItems.data.user.loggedin === true) {
organizrConnect('api/?v1/no_tabs').success(function(data) {
try {
var response = JSON.parse(data);
}catch(e) {
console.log(e + ' error: ' + data);
orgErrorAlert('
' + e + '
' + formatDebug(data));
return false;
}
console.log("Organizr Function: No Tabs Available");
$(response.data).appendTo($('.organizr-area'));
}).fail(function(xhr) {
console.error("Organizr Function: API Connection Failed");
});
}else {
$('.show-login').trigger('click');
}
}
function formatImage (icon) {
if (!icon.id || icon.text == 'Select or type Icon') {
return icon.text;
}
var baseUrl = "/user/pages/images/flags";
var $icon = $(
' ' + icon.text + ''
);
return $icon;
}
function formatIcon (icon) {
if (!icon.id || icon.text == 'Select or type Icon') {
return icon.text;
}
var $icon = $(
''+iconPrefix(icon.id)+ icon.text + ''
);
return $icon;
}
function logout(){
message('',' Goodbye!',activeInfo.settings.notifications.position,'#FFF','success','10000');
organizrAPI('GET','api/?v1/logout').success(function(data) {
try {
var html = JSON.parse(data);
}catch(e) {
console.log(e + ' error: ' + data);
orgErrorAlert('
' + e + '
' + formatDebug(data));
return false;
}
if(html.data == true){
local('set','message','Goodbye|Logout Successful|success');
location.reload();
}else{
message('Logout Error',' An Error Occured',activeInfo.settings.notifications.position,'#FFF','warning','10000');
console.error('Organizr Function: Logout failed');
}
}).fail(function(xhr) {
console.error("Organizr Function: Logout Failed");
});
}
function reloadOrganizr(){
location.reload();
}
function hideFrames(){
$(".iFrame-listing div[class^='frame-container']").addClass("hidden").removeClass('show');
$(".internal-listing div[class^='internal-container']").addClass("hidden").removeClass('show');
$(".plugin-listing div[class^='plugin-container']").addClass("hidden").removeClass('show');
}
function closeSideMenu(){
$('.content-wrapper').removeClass('show-sidebar');
}
function removeMenuActive(){
$("#side-menu a").removeClass('active');
}
function swapDisplay(type){
switch (type) {
case 'internal':
$('body').removeClass('fix-header');
$('.iFrame-listing').addClass('hidden').removeClass('show');
$('.internal-listing').addClass('show').removeClass('hidden');
$('.login-area').addClass('hidden').removeClass('show');
$('.plugin-listing').addClass('hidden').removeClass('show');
//$('body').removeClass('fix-header');
break;
case 'iframe':
$('body').addClass('fix-header');
$('.iFrame-listing').addClass('show').removeClass('hidden');
$('.internal-listing').addClass('hidden').removeClass('show');
$('.login-area').addClass('hidden').removeClass('show');
$('.plugin-listing').addClass('hidden').removeClass('show');
//$('body').addClass('fix-header');
break;
case 'login':
$('body').removeClass('fix-header');
$('.iFrame-listing').addClass('hidden').removeClass('show');
$('.internal-listing').addClass('hidden').removeClass('show');
$('.login-area').addClass('show').removeClass('hidden');
$('.plugin-listing').addClass('hidden').removeClass('show');
if(activeInfo.settings.misc.minimalLoginScreen == true){
$('.sidebar').addClass('hidden');
$('.navbar').addClass('hidden');
$('#pagewrapper').addClass('hidden');
}
break;
case 'plugin':
$('.iFrame-listing').addClass('hidden').removeClass('show');
$('.internal-listing').addClass('hidden').removeClass('show');
$('.login-area').addClass('hidden').removeClass('show');
$('.plugin-listing').addClass('show').removeClass('hidden');
break;
default:
}
}
function toggleParentActive(tab){
var childTab = $('#menu-'+tab);
if(childTab.parent().hasClass('nav-second-level')){
if(!childTab.parent().hasClass('in')){
childTab.parent().addClass('collapse in');
childTab.parent().parent().addClass('active');
}
}
}
function swapBodyClass(tab){
var prior = $('body').attr('data-active-tab');
if(prior !== ''){
$('body').removeClass('active-tab-'+prior);
}
$('body').attr('data-active-tab', tab);
$('body').addClass('active-tab-'+tab);
}
function switchTab(tab, type){
if(type !== 2){
hideFrames();
closeSideMenu();
removeMenuActive();
toggleParentActive(tab);
swapBodyClass(tab);
}
if(type !== 2 && type !== 'plugin'){
setHash(tab);
}
switch (type) {
case 0:
case '0':
case 'internal':
swapDisplay('internal');
var newTab = $('#internal-'+tab);
var tabURL = newTab.attr('data-url');
$('#menu-'+cleanClass(tab)).find('a').addClass("active");
if(newTab.hasClass('loaded')){
console.log('Tab Function: Switching to tab: '+tab);
newTab.addClass("show").removeClass('hidden');
}else{
$("#preloader").fadeIn();
console.log('Tab Function: Loading new tab for: '+tab);
$('#menu-'+tab+' a').children().addClass('tabLoaded');
newTab.addClass("show loaded").removeClass('hidden');
loadInternal(tabURL,cleanClass(tab));
$("#preloader").fadeOut();
}
break;
case 1:
case '1':
case 'iframe':
swapDisplay('iframe');
var newTab = $('#container-'+tab);
var tabURL = newTab.attr('data-url');
$('#menu-'+cleanClass(tab)).find('a').addClass("active");
if(newTab.hasClass('loaded')){
console.log('Tab Function: Switching to tab: '+tab);
newTab.addClass("show").removeClass('hidden');
}else{
$("#preloader").fadeIn();
console.log('Tab Function: Loading new tab for: '+tab);
$('#menu-'+tab+' a').children().addClass('tabLoaded');
newTab.addClass("show loaded").removeClass('hidden');
$(buildFrame(tab,tabURL)).appendTo(newTab);
$("#preloader").fadeOut();
}
$('#frame-'+tab).focus();
break;
case 2:
case 3:
case '2':
case '3':
case '_blank':
case 'popout':
popTab(cleanClass(tab), type);
break;
case 'plugin':
swapDisplay('plugin');
$('#container-plugin-'+tab).addClass("show").removeClass('hidden');
break;
default:
console.error('Tab Function: Action not set');
}
}
function popTab(tab, type){
switch (type) {
case 0:
case '0':
case 'internal':
console.warn('Tab Function: New window not supported for tab: '+tab);
break;
case 1:
case '1':
case 'iframe':
case 2:
case 3:
case '2':
case '3':
case '_blank':
case 'popout':
console.log('Tab Function: Creating New Window for tab: '+tab);
var url = $('#menu-'+cleanClass(tab)).attr('data-url');
window.open(url, '_blank');
break;
default:
console.error('Tab Function: Action not set');
}
}
function closeTab(tab){
tab = cleanClass(tab);
// check if current tab?
if($('.active-tab-'+tab).length > 0){
closeCurrentTab();
}else{
if($('.frame-'+tab).hasClass('loaded')){
var type = $('#menu-'+tab).attr('type');
switch (type) {
case 0:
case '0':
case 'internal':
console.log('Tab Function: Closing tab: '+tab);
$('#internal-'+cleanClass(tab)).html('');
$('#menu-'+cleanClass(tab)+' a').removeClass("active");
$('#menu-'+tab+' a').children().removeClass('tabLoaded');
$('#internal-'+cleanClass(tab)).removeClass("loaded show");
$('#menu-'+cleanClass(tab)).removeClass("active");
break;
case 1:
case '1':
case 'iframe':
console.log('Tab Function: Closing tab: '+tab);
$('#menu-'+cleanClass(tab)+' a').removeClass("active");
$('#menu-'+tab+' a').children().removeClass('tabLoaded');
$('#container-'+cleanClass(tab)).removeClass("loaded show");
$('#frame-'+cleanClass(tab)).remove();
break;
case 2:
case 3:
case '2':
case '3':
case '_blank':
case 'popout':
break;
default:
console.error('Tab Function: Action not set');
}
}
}
}
function reloadTab(tab, type){
$("#preloader").fadeIn();
console.log('Tab Function: Reloading tab: '+tab);
switch (type) {
case 0:
case '0':
case 'internal':
break;
case 1:
case '1':
case 'iframe':
$('#frame-'+cleanClass(tab)).attr('src', $('#frame-'+cleanClass(tab)).attr('src'));
break;
case 2:
case 3:
case '2':
case '3':
case '_blank':
case 'popout':
break;
default:
console.error('Tab Function: Action not set');
}
$("#preloader").fadeOut();
}
function reloadCurrentTab(){
$("#preloader").fadeIn();
console.log('Tab Function: Reloading Current tab');
var iframe = $('.iFrame-listing').find('.show');
var internal = $('.internal-listing').find('.show');
if(iframe.length > 0){
var type = 'iframe';
}else if(internal.length > 0){
var type = 'internal';
}else{
var type = 'not set';
}
switch (type) {
case 0:
case '0':
case 'internal':
var activeInternal = $('.internal-listing').find('.show');
$(activeInternal).html('');
loadInternal(activeInternal.attr('data-url'),activeInternal.attr('data-name'));
break;
case 1:
case '1':
case 'iframe':
var activeFrame = $('.iFrame-listing').find('.show').children('iframe');
activeFrame.attr('src', activeFrame.attr('src'));
break;
case 2:
case 3:
case '2':
case '3':
case '_blank':
case 'popout':
break;
default:
console.error('Tab Function: Action not set');
}
$("#preloader").fadeOut();
}
function loadNextTab(){
var next = $('#page-wrapper').find('.loaded').attr('data-name');
if (typeof next !== 'undefined') {
var type = $('#page-wrapper').find('.loaded').attr('data-type');
switchTab(next,type);
}else{
console.log("Tab Function: No Available Tab to open");
}
}
function closeCurrentTab(){
var iframe = $('.iFrame-listing').find('.show');
var internal = $('.internal-listing').find('.show');
if(iframe.length > 0){
var type = 'iframe';
}else if(internal.length > 0){
var type = 'internal';
}else{
var type = 'not set';
}
switch (type) {
case 0:
case '0':
case 'internal':
var tab = $('.internal-listing').find('.show').attr('data-name');
console.log('Tab Function: Closing tab: '+tab);
$('#internal-'+cleanClass(tab)).html('');
$('#menu-'+cleanClass(tab)+' a').removeClass("active");
$('#menu-'+tab+' a').children().removeClass('tabLoaded');
$('#internal-'+cleanClass(tab)).removeClass("loaded show");
$('#menu-'+cleanClass(tab)).removeClass("active");
loadNextTab();
break;
case 1:
case '1':
case 'iframe':
var tab = $('.iFrame-listing').find('.show').children('iframe').attr('data-name');
console.log('Tab Function: Closing tab: '+tab);
$('#menu-'+cleanClass(tab)+' a').removeClass("active");
$('#menu-'+tab+' a').children().removeClass('tabLoaded');
$('#container-'+cleanClass(tab)).removeClass("loaded show");
$('#frame-'+cleanClass(tab)).remove();
loadNextTab();
break;
case 2:
case 3:
case '2':
case '3':
case '_blank':
case 'popout':
break;
default:
console.error('Tab Function: Action not set');
}
}
function tabActions(event,name, type){
$('.splash-screen').removeClass('in').addClass('hidden');
if(event.ctrlKey){
popTab(cleanClass(name), type);
}else if(event.altKey){
closeTab(name);
}else if(event.shiftKey){
reloadTab(cleanClass(name), type);
}else{
switchTab(cleanClass(name), type);
}
}
function reverseObject(object) {
var newObject = {};
var keys = [];
for (var key in object) {
keys.push(key);
}
for (var i = keys.length - 1; i >= 0; i--) {
var value = object[keys[i]];
newObject[keys[i]]= value;
}
return newObject;
}
function hasValue(test){
if(Array.isArray(test) && test[0] !== ''){
return true;
}else{
return false;
}
return false;
}
function arrayContains(needle, arrhaystack){
return (arrhaystack.indexOf(needle) > -1);
}
/* END NORMAL FUNCTIONS */
/* BUILD FUNCTIONS */
/* END BUILD FUNCTIONS */
/* ORGANIZR API FUNCTIONS */
function selectOptions(options, active){
var selectOptions = '';
$.each(options, function(i,v) {
activeTest = active.split(',');
if(activeTest.length > 1){
var selected = (arrayContains(v.value, activeTest)) ? 'selected' : '';
}else{
var selected = (active.toString() == v.value) ? 'selected' : '';
}
var disabled = (v.disabled) ? ' disabled' : '';
selectOptions += '';
});
return selectOptions;
}
function accordionOptions(options, parentID){
//console.log(options);
var accordionOptions = '';
$.each(options, function(i,v) {
var id = v.id;
var extraClass = (v.class) ? ' '+v.class : '';
var header = (v.header) ? ' '+v.header : '';
if(typeof v.body == 'object'){
if(typeof v.body.length == 'undefined'){
var body = buildFormItem(v.body);
}else{
var body = '';
$.each(v.body, function(int,val) {
body += buildFormItem(val);
});
}
}else{
var body = v.body;
}
accordionOptions += `
';
}
function buildFormItem(item){
var placeholder = (item.placeholder) ? ' placeholder="'+item.placeholder+'"' : '';
var id = (item.id) ? ' id="'+item.id+'"' : '';
var type = (item.type) ? ' data-type="'+item.type+'"' : '';
var value = (item.value) ? ' value="'+item.value+'"' : '';
var textarea = (item.value) ? item.value : '';
var name = (item.name) ? ' name="'+item.name+'"' : '';
var extraClass = (item.class) ? ' '+item.class : '';
var icon = (item.icon) ? ' '+item.icon : '';
var text = (item.text) ? ' '+item.text : '';
var attr = (item.attr) ? ' '+item.attr : '';
var disabled = (item.disabled) ? ' disabled' : '';
var href = (item.href) ? ' href="'+item.href+'"' : '';
var pwd1 = createRandomString(6);
var pwd2 = createRandomString(6);
var pwd3 = createRandomString(6);
var helpInfo = (item.help) ? '
'+item.help+'
' : '';
var smallLabel = (item.smallLabel) ? ''+helpInfo : ''+helpInfo;
var pwgMgr = `
`;
//+tof(item.value,'c')+`
switch (item.type) {
case 'input':
case 'text':
return smallLabel+'';
break;
case 'number':
return smallLabel+'';
break;
case 'textbox':
return smallLabel+'';
break;
case 'password':
return smallLabel+pwgMgr+'';
break;
case 'password-alt':
return smallLabel+'
'+pwgMgr+'
';
break;
case 'hidden':
return '';
break;
case 'select':
return smallLabel+'';
break;
case 'select2':
return smallLabel+'';
break;
case 'switch':
case 'checkbox':
return smallLabel+'';
break;
case 'button':
return smallLabel+'';
break;
case 'blank':
return '';
break;
case 'accordion':
return '
'+accordionOptions(item.options, item.id)+'
';
break;
case 'html':
return item.html;
break;
default:
return false;
}
}
function buildPluginsItem(array){
var activePlugins = '';
var inactivePlugins = '';
$.each(array, function(i,v) {
var settingsPage = (v.settings == true) ? `
` : '';
var href = (v.settings == true) ? '#'+v.idPrefix+'-settings-page' : 'javascript:void(0);';
if(v.enabled == true){
var activeToggle = `
`;
$.each(v, function(i,v) {
var override = '6';
if(typeof v.override !== 'undefined'){
override = v.override;
}
count++;
if (count % 2 !== 0) {
group += '
';
}
var helpID = '#help-info-'+v.name;
var helpTip = (v.help) ? '' : '';
group += `
`+buildFormItem(v)+`
`;
if (count % 2 == 0 || count == total) {
group += '
';
}
});
group += '
';
}
});
return uList+'
'+group;
}
function buildImageManagerViewItem(array){
var imageListing = '';
if (Array.isArray(array)) {
$.each(array, function(i,v) {
var filepath = v.split("/");
var name = filepath[3].split(".");
var clipboardText = v.replace(/ /g,"%20");
imageListing += `
`;
}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 = `
` : '';
}
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 += `
';
}
$.each(array.content.queueItems.arguments.torrents, 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 += `
';
}
$.each(array.content.queueItems.arguments.torrents, 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 += `
`;
});
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 'sabnzbd':
case 'nzbget':
var queue = true;
var history = true;
break;
case 'transmission':
case 'qBittorrent':
case 'deluge':
case 'rTorrent':
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 += `
';
if(activeInfo.settings.homepage.options.alternateHomepageHeaders){
var headerAlt = `
`+state+`
`+menu+`
`;
}else{
var header = `
`+state+`
`+menu+`
`;
}
return `
`+headerAlt+`
`+header+`
`+listing+`
`;
}
function buildDownloaderCombined(source){
var first = ($('.combinedDownloadRow').length == 0) ? true : false;
var active = (first) ? 'active' : '';
var queueButton = 'QUEUE';
var historyButton = 'HISTORY';
switch (source) {
case 'sabnzbd':
case 'nzbget':
var queue = true;
var history = true;
break;
case 'transmission':
case 'qBittorrent':
case 'deluge':
case 'rTorrent':
var queue = true;
var history = false;
queueButton = 'REFRESH';
break;
default:
var queue = false;
var history = false;
}
var mainMenu = `
`;
var addToMainMenu = `
`;
var listing = '';
var headerAlt = '';
var header = '';
var menu = `
`;
}
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 = `
`;
});
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 = `
' + formatDebug(data));
return false;
}
$('#calendar').fullCalendar('removeEvents');
$('#calendar').fullCalendar('addEventSource', response.data.events);
$('#calendar').fullCalendar('addEventSource', response.data.ical);
$('#calendar').fullCalendar('today');
response = '';
}).fail(function(xhr) {
console.error("Organizr Function: API Connection Failed");
});
if(typeof timeouts['calendar'] !== 'undefined'){ clearTimeout(timeouts['calendar']); }
timeouts['calendar'] = setTimeout(function(){ homepageCalendar(timeout); }, timeout);
}
// 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,
};
}
var plex_oauth_window = null;
const plex_oauth_loader = '' +
'
' +
'
' +
'' +
' ' +
'Redirecting to the Plex 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;
plex_oauth_window.location = 'https://app.plex.tv/auth/#!?clientID=' + x_plex_headers['X-Plex-Client-Identifier'] + '&code=' + code;
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 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{
clearTimeout(timeouts[id]);
}
}
//Generate API
function generateCode() {
var code = "";
var possible = "abcdefghijklmnopqrstuvwxyz0123456789";
for (var i = 0; i < 20; i++)
code += possible.charAt(Math.floor(Math.random() * possible.length));
return code;
}
// uppercase word
function toUpper(str) {
return str
.toLowerCase()
.split(' ')
.map(function(word) {
return word[0].toUpperCase() + word.substr(1);
})
.join(' ');
}
// human filesize
function humanFileSize(bytes, si) {
var thresh = si ? 1000 : 1024;
if(Math.abs(bytes) < thresh) {
return bytes + ' B';
}
var units = si
? ['kB','MB','GB','TB','PB','EB','ZB','YB']
: ['KiB','MiB','GiB','TiB','PiB','EiB','ZiB','YiB'];
var u = -1;
do {
bytes /= thresh;
++u;
} while(Math.abs(bytes) >= thresh && u < units.length - 1);
return bytes.toFixed(1)+' '+units[u];
}
//youtube search
function youtubeSearch(searchQuery) {
return $.ajax({
url: "https://www.googleapis.com/youtube/v3/search?part=snippet&q="+searchQuery+"+official+trailer&part=snippet&maxResults=1&type=video&videoDuration=short&key=AIzaSyD-8SHutB60GCcSM8q_Fle38rJUV7ujd8k",
});
}
function youtubeCheck(title,link){
youtubeSearch(title).success(function(data) {
inlineLoad();
var id = data.items["0"].id.videoId;
var div = `
`;
$('.youtube-div').html(div);
$('.'+link).trigger('click');
player = new Plyr('#player-'+link);
}).fail(function(xhr) {
console.error("Organizr Function: YouTube Connection Failed");
});
}
//request search
function requestSearch(title,page=1) {
return $.ajax({
url: "https://api.themoviedb.org/3/search/multi?api_key=83cf4ee97bb728eeaf9d4a54e64356a1&language="+activeInfo.language+"&query="+title+"&page="+page+"&include_adult=false",
});
}
function requestSearchList(list,page=1) {
var url = '';
switch (list) {
case 'top-movie':
url = 'https://api.themoviedb.org/3/movie/top_rated?api_key=83cf4ee97bb728eeaf9d4a54e64356a1&language='+activeInfo.language+'®ion=US&page='+page;
break;
case 'pop-movie':
url = 'https://api.themoviedb.org/3/movie/popular?api_key=83cf4ee97bb728eeaf9d4a54e64356a1&language='+activeInfo.language+'®ion=US&page='+page;
break;
case 'up-movie':
url = 'https://api.themoviedb.org/3/movie/upcoming?api_key=83cf4ee97bb728eeaf9d4a54e64356a1&language='+activeInfo.language+'®ion=US&page='+page;
break;
case 'theatre-movie':
url = 'https://api.themoviedb.org/3/movie/now_playing?api_key=83cf4ee97bb728eeaf9d4a54e64356a1&language='+activeInfo.language+'®ion=US&page='+page;
break;
case 'top-tv':
url = 'https://api.themoviedb.org/3/tv/top_rated?api_key=83cf4ee97bb728eeaf9d4a54e64356a1&language='+activeInfo.language+'®ion=US&page='+page;
break;
case 'pop-tv':
url = 'https://api.themoviedb.org/3/tv/popular?api_key=83cf4ee97bb728eeaf9d4a54e64356a1&language='+activeInfo.language+'®ion=US&page='+page;
break;
case 'today-tv':
url = 'https://api.themoviedb.org/3/tv/airing_today?api_key=83cf4ee97bb728eeaf9d4a54e64356a1&language='+activeInfo.language+'®ion=US&page='+page;
break;
case 'org-mod':
url = 'https://api.themoviedb.org/4/list/64438?api_key=83cf4ee97bb728eeaf9d4a54e64356a1&language='+activeInfo.language+'®ion=US&page='+page;
break;
default:
}
return $.ajax({
url: url,
});
}
function requestNewID(id) {
return $.ajax({
url: "https://api.themoviedb.org/3/tv/"+id+"/external_ids?api_key=83cf4ee97bb728eeaf9d4a54e64356a1&language=en-US",
});
}
function inlineLoad(){
$('.inline-popups').magnificPopup({
removalDelay: 500, //delay removal by X to allow out-animation
closeOnBgClick: true,
//closeOnContentClick: true,
callbacks: {
beforeOpen: function() {
this.st.mainClass = this.st.el.attr('data-effect');
this.st.focus = '#request-input';
},
close: function() {
if(typeof player !== 'undefined'){
console.log('STOP STOP STOP');
player.destroy();
}
}
},
midClick: true // allow opening popup on middle mouse click. Always set it to true if you don't provide alternative source.
});
}
//Import Users
function importUsers(type){
$('.importUsersButton').attr('disabled', true);
messageSingle('',window.lang.translate('Importing Users'),activeInfo.settings.notifications.position,'#FFF','success','5000');
organizrAPI('POST','api/?v1/import/users',{type:type}).success(function(data) {
try {
var response = JSON.parse(data);
}catch(e) {
console.log(e + ' error: ' + data);
orgErrorAlert('
' + e + '
' + formatDebug(data));
return false;
}
if(response.data !== false){
messageSingle('',window.lang.translate('Imported [' + response.data + '] Users'),activeInfo.settings.notifications.position,'#FFF','success','5000');
$('.importUsersButton').attr('disabled', false);
}else{
messageSingle('','Imported Users Error',activeInfo.settings.notifications.position,'#FFF','error','5000');
}
}).fail(function(xhr) {
console.error("Organizr Function: API Connection Failed");
});
}
//Settings change auth
function changeAuth(){
var type = $('#authSelect').val();
var service = $('#authBackendSelect').val();
switch (service) {
case 'plex':
$('.switchAuth').parent().parent().parent().hide();
$('.backendAuth').parent().parent().parent().show();
$('.plexAuth').parent().parent().parent().show();
break;
case 'emby_local':
case 'emby_connect':
case 'emby_all':
$('.switchAuth').parent().parent().parent().hide();
$('.backendAuth').parent().parent().parent().show();
$('.embyAuth').parent().parent().parent().show();
break;
case 'ftp':
$('.switchAuth').parent().parent().parent().hide();
$('.backendAuth').parent().parent().parent().show();
$('.ftpAuth').parent().parent().parent().show();
break;
case 'ldap':
$('.switchAuth').parent().parent().parent().hide();
$('.backendAuth').parent().parent().parent().show();
$('.ldapAuth').parent().parent().parent().show();
break;
default:
$('.switchAuth').parent().parent().parent().hide();
$('.backendAuth').parent().parent().parent().show();
}
if(type == 'internal') { $('.switchAuth').parent().parent().parent().hide(); }
}
function organizrSpecialSettings(array){
//media search
if(array.settings.homepage.search.enabled == true && typeof array.settings.homepage.search.type !== 'undefined'){
var htmlDOM = `
`;
var searchBoxResults = `
`;
$(htmlDOM).prependTo('.navbar-right');
$(searchBoxResults).appendTo($('.organizr-area'));
}
}
function forceSearch(term){
$.magnificPopup.close();
var tabName = $("li[data-url^='api/?v1/homepage/page']").find('span').html();
if($("li[data-url^='api/?v1/homepage/page']").find('i').hasClass('tabLoaded')){
console.log('yup');
if($("li[data-url^='api/?v1/homepage/page']").find('a').hasClass('active')){
setTimeout(
function(){
$('#newRequestButton').trigger('click');
$('#request-input').val(term);
doneTyping();
},
1000);
}else{
tabActions('click',tabName,0);
setTimeout(
function(){
$('#newRequestButton').trigger('click');
$('#request-input').val(term);
doneTyping();
},
1000);
}
}else{
tabActions('click',tabName,0);
setTimeout(
function(){
$('#newRequestButton').trigger('click');
$('#request-input').val(term);
doneTyping();
},
3000);
}
}
function splitPoster(str){
var words = str.split(' ');
var newWord = '';
$.each(words, function(i,v) {
newWord += v+' ';
});
return newWord;
}
function buildMediaResults(array,source,term){
if(array.content.length == 0){
var none = '
No Results for:
'+term+'
';
none += (activeInfo.settings.homepage.ombi.enabled == true) ? `` : '';
return none;
}
var results = '';
var tv = 0;
var movie = 0;
var music = 0;
var total = 0;
$.each(array.content, function(i,v) {
total = total + 1;
tv = (v.type == 'tv') ? tv + 1 : tv;
movie = (v.type == 'movie') ? movie + 1 : movie;
music = (v.type == 'music') ? music + 1 : music;
var bg = v.imageURL;
var top = v.title;
var bottom = v.metadata.originallyAvailableAt;
results += `
`+array.company_name+`
`+array.about+extraInfo+`