SickGear/gui/slick/js/configProviders.js
Supremicus 2c510aa210 Improve UI to display fluidly on different screen sizes.
Fixes the issue where top menu items would disappear on smaller screens.
Add Bootstrap v3.2.0 with Normalize v3.0.1 from github.com/twbs/bootstrap.
Add a modified jquery pnotify stylesheet.
Various UI tweaks.
Update CHANGES.md and TODO.txt
2014-10-23 23:23:56 +01:00

680 lines
No EOL
21 KiB
JavaScript

$(document).ready(function(){
$.fn.showHideProviders = function() {
$('.providerDiv').each(function(){
var providerName = $(this).attr('id');
var selectedProvider = $('#editAProvider :selected').val();
if (selectedProvider+'Div' == providerName)
$(this).show();
else
$(this).hide();
});
}
/**
* Gets categories for the provided newznab provider.
* @param {String} isDefault
* @param {Array} selectedProvider
* @return no return data. Function updateNewznabCaps() is run at callback
*/
$.fn.getCategories = function (isDefault, selectedProvider) {
var name = selectedProvider[0];
var url = selectedProvider[1];
var key = selectedProvider[2];
if (!name)
return;
if (!url)
return;
if (!key)
return;
var params = {url: url, name: name, key: key};
var returnData;
$.getJSON(sbRoot + '/config/providers/getNewznabCategories', params,
function(data){
updateNewznabCaps( data, selectedProvider );
console.debug(data.tv_categories);
});
}
$.fn.addProvider = function (id, name, url, key, cat, isDefault, showProvider) {
url = $.trim(url);
if (!url)
return;
if (!/^https?:\/\//i.test(url))
url = "http://" + url;
if (url.match('/$') == null)
url = url + '/';
var newData = [isDefault, [name, url, key, cat]];
newznabProviders[id] = newData;
if (!isDefault){
$('#editANewznabProvider').addOption(id, name);
$(this).populateNewznabSection();
}
if ($('#provider_order_list > #'+id).length == 0 && showProvider != false) {
var toAdd = '<li class="ui-state-default" id="'+id+'"> <input type="checkbox" id="enable_'+id+'" class="provider_enabler" CHECKED> <a href="'+url+'" class="imgLink" target="_new"><img src="'+sbRoot+'/images/providers/newznab.png" alt="'+name+'" width="16" height="16"></a> '+name+'</li>'
$('#provider_order_list').append(toAdd);
$('#provider_order_list').sortable("refresh");
}
$(this).makeNewznabProviderString();
}
$.fn.addTorrentRssProvider = function (id, name, url, cookies) {
var newData = [name, url, cookies];
torrentRssProviders[id] = newData;
$('#editATorrentRssProvider').addOption(id, name);
$(this).populateTorrentRssSection();
if ($('#provider_order_list > #'+id).length == 0) {
var toAdd = '<li class="ui-state-default" id="'+id+'"> <input type="checkbox" id="enable_'+id+'" class="provider_enabler" CHECKED> <a href="'+url+'" class="imgLink" target="_new"><img src="'+sbRoot+'/images/providers/torrentrss.png" alt="'+name+'" width="16" height="16"></a> '+name+'</li>'
$('#provider_order_list').append(toAdd);
$('#provider_order_list').sortable("refresh");
}
$(this).makeTorrentRssProviderString();
}
$.fn.updateProvider = function (id, url, key, cat) {
newznabProviders[id][1][1] = url;
newznabProviders[id][1][2] = key;
newznabProviders[id][1][3] = cat;
$(this).populateNewznabSection();
$(this).makeNewznabProviderString();
}
$.fn.deleteProvider = function (id) {
$('#editANewznabProvider').removeOption(id);
delete newznabProviders[id];
$(this).populateNewznabSection();
$('li').remove('#'+id);
$(this).makeNewznabProviderString();
}
$.fn.updateTorrentRssProvider = function (id, url, cookies) {
torrentRssProviders[id][1] = url;
torrentRssProviders[id][2] = cookies;
$(this).populateTorrentRssSection();
$(this).makeTorrentRssProviderString();
}
$.fn.deleteTorrentRssProvider = function (id) {
$('#editATorrentRssProvider').removeOption(id);
delete torrentRssProviders[id];
$(this).populateTorrentRssSection();
$('li').remove('#'+id);
$(this).makeTorrentRssProviderString();
}
$.fn.populateNewznabSection = function() {
var selectedProvider = $('#editANewznabProvider :selected').val();
if (selectedProvider == 'addNewznab') {
var data = ['','',''];
var isDefault = 0;
$('#newznab_add_div').show();
$('#newznab_update_div').hide();
$('#newznab_cat').attr('disabled','disabled');
$('#newznab_cap').attr('disabled','disabled');
$("#newznab_cat option").each(function() {
$(this).remove();
return;
});
$("#newznab_cap option").each(function() {
$(this).remove();
return;
});
} else {
var data = newznabProviders[selectedProvider][1];
var isDefault = newznabProviders[selectedProvider][0];
$('#newznab_add_div').hide();
$('#newznab_update_div').show();
$('#newznab_cat').removeAttr("disabled");
$('#newznab_cap').removeAttr("disabled");
}
$('#newznab_name').val(data[0]);
$('#newznab_url').val(data[1]);
$('#newznab_key').val(data[2]);
//Check if not already array
if (typeof data[3] === 'string') {
rrcat = data[3].split(",")
}
else {
rrcat = data[3];
}
// Update the category select box (on the right)
var newCatOptions = [];
if (rrcat) {
rrcat.forEach(function (cat) {
newCatOptions.push({text : cat, value : cat});
});
$("#newznab_cat").replaceOptions(newCatOptions);
};
if (selectedProvider == 'addNewznab') {
$('#newznab_name').removeAttr("disabled");
$('#newznab_url').removeAttr("disabled");
} else {
$('#newznab_name').attr("disabled", "disabled");
if (isDefault) {
$('#newznab_url').attr("disabled", "disabled");
$('#newznab_delete').attr("disabled", "disabled");
} else {
$('#newznab_url').removeAttr("disabled");
$('#newznab_delete').removeAttr("disabled");
//Get Categories Capabilities
if (data[0] && data[1] && data[2] && !ifExists($.fn.newznabProvidersCapabilities, data[0])) {
$(this).getCategories(isDefault, data);
}
else {
updateNewznabCaps( null, data );
}
}
}
}
ifExists = function(loopThroughArray, searchFor) {
var found = false;
loopThroughArray.forEach(function(rootObject) {
if (rootObject.name == searchFor) {
found = true;
}
console.log(rootObject.name + " while searching for: "+ searchFor);
});
return found;
};
/**
* Updates the Global array $.fn.newznabProvidersCapabilities with a combination of newznab prov name
* and category capabilities. Return
* @param {Array} newzNabCaps, is the returned object with newzNabprod Name and Capabilities.
* @param {Array} selectedProvider
* @return no return data. The multiselect input $("#newznab_cap") is updated, as a result.
*/
updateNewznabCaps = function( newzNabCaps, selectedProvider ) {
if (newzNabCaps && !ifExists($.fn.newznabProvidersCapabilities, selectedProvider[0])) {
$.fn.newznabProvidersCapabilities.push({'name' : selectedProvider[0], 'categories' : newzNabCaps.tv_categories});
}
//Loop through the array and if currently selected newznab provider name matches one in the array, use it to
//update the capabilities select box (on the left).
if (selectedProvider[0]) {
$.fn.newznabProvidersCapabilities.forEach(function(newzNabCap) {
if (newzNabCap.name && newzNabCap.name == selectedProvider[0] && newzNabCap.categories instanceof Array) {
var newCapOptions = [];
newzNabCap.categories.forEach(function(category_set) {
if (category_set.id && category_set.name) {
newCapOptions.push({value : category_set.id, text : category_set.name + "(" + category_set.id + ")"});
};
});
$("#newznab_cap").replaceOptions(newCapOptions);
}
});
};
}
$.fn.makeNewznabProviderString = function() {
var provStrings = new Array();
for (var id in newznabProviders) {
provStrings.push(newznabProviders[id][1].join('|'));
}
$('#newznab_string').val(provStrings.join('!!!'))
}
$.fn.populateTorrentRssSection = function() {
var selectedProvider = $('#editATorrentRssProvider :selected').val();
if (selectedProvider == 'addTorrentRss') {
var data = ['','',''];
$('#torrentrss_add_div').show();
$('#torrentrss_update_div').hide();
} else {
var data = torrentRssProviders[selectedProvider];
$('#torrentrss_add_div').hide();
$('#torrentrss_update_div').show();
}
$('#torrentrss_name').val(data[0]);
$('#torrentrss_url').val(data[1]);
$('#torrentrss_cookies').val(data[2]);
if (selectedProvider == 'addTorrentRss') {
$('#torrentrss_name').removeAttr("disabled");
$('#torrentrss_url').removeAttr("disabled");
$('#torrentrss_cookies').removeAttr("disabled");
} else {
$('#torrentrss_name').attr("disabled", "disabled");
$('#torrentrss_url').removeAttr("disabled");
$('#torrentrss_cookies').removeAttr("disabled");
$('#torrentrss_delete').removeAttr("disabled");
}
}
$.fn.makeTorrentRssProviderString = function() {
var provStrings = new Array();
for (var id in torrentRssProviders) {
provStrings.push(torrentRssProviders[id].join('|'));
}
$('#torrentrss_string').val(provStrings.join('!!!'))
}
$.fn.refreshProviderList = function() {
var idArr = $("#provider_order_list").sortable('toArray');
var finalArr = new Array();
$.each(idArr, function(key, val) {
var checked = + $('#enable_'+val).prop('checked') ? '1' : '0';
finalArr.push(val + ':' + checked);
});
$("#provider_order").val(finalArr.join(' '));
}
$.fn.hideConfigTab = function () {
$("#config-components").tabs( "disable", 1 );
$("#config-components ul li:eq(1)").hide();
};
$.fn.showProvidersConfig = function () {
$("#provider_order_list li").each(function( index ) {
if ($(this).find("input").attr("checked")) {
$(this).addTip();
} else {
$(this).qtip('destroy');
}
});
};
$.fn.addTip = function() {
var config_id = $(this).find("input").attr('id').replace("enable_", "") + "Div";
var config_form = '<div id="config"><form id="configForm_tip" action="saveProviders" method="post"><fieldset class="component-group-list tip_scale"><div class="providerDiv_tip">' + $("div[id*="+config_id+"]").html() + '</div></fieldset></form></div>'
var provider_name = $.trim($(this).text()).replace('*','')
if ($("div[id*="+config_id+"]").length == 0) {
return false
}
$(this).qtip({
overwrite: true,
position: {
adjust: {
x: 0, y: 0,
},
my: 'left top',
at: 'top right',
},
show: {
event: 'mouseenter', // Show it on click...
target: false,
solo: true,
delay: 90,
effect: true,
},
hide: {
fixed: true,
delay: 900,
},
content: {
text: config_form,
title: {
text: provider_name + ' Config',
button: true
}
},
style: {
border: {
width: 5,
radius: 2,
color: '#e1e1e1'
},
width: 400,
background: '#FFF',
padding: 15,
tip: true, // Give it a speech bubble tip with automatic corner detection
classes: 'qtip-dark qtip-shadow',
},
});
}
var newznabProviders = new Array();
var torrentRssProviders = new Array();
$("#provider_order_list li").on('change', function() {
if ($(this).find("input").attr("checked")) {
$(this).addTip();
$(this).qtip('show');
} else {
$(this).qtip('destroy');
}
});
$(this).on('change', '.newznab_key', function(){
var provider_id = $(this).attr('id');
provider_id = provider_id.substring(0, provider_id.length-'_hash'.length);
var url = $('#'+provider_id+'_url').val();
var cat = $('#'+provider_id+'_cat').val();
var key = $(this).val();
$(this).updateProvider(provider_id, url, key, cat);
});
$('#newznab_key,#newznab_url').change(function(){
var selectedProvider = $('#editANewznabProvider :selected').val();
if (selectedProvider == "addNewznab")
return;
var url = $('#newznab_url').val();
var key = $('#newznab_key').val();
var cat = $('#newznab_cat option').map(function(i, opt) {
return $(opt).text();
}).toArray().join(',');
$(this).updateProvider(selectedProvider, url, key, cat);
});
$('#torrentrss_url,#torrentrss_cookies').change(function(){
var selectedProvider = $('#editATorrentRssProvider :selected').val();
if (selectedProvider == "addTorrentRss")
return;
var url = $('#torrentrss_url').val();
var cookies = $('#torrentrss_cookies').val();
$(this).updateTorrentRssProvider(selectedProvider, url, cookies);
});
$('#editAProvider').change(function(){
$(this).showHideProviders();
});
$('#editANewznabProvider').change(function(){
$(this).populateNewznabSection();
});
$('#editATorrentRssProvider').change(function(){
$(this).populateTorrentRssSection();
});
$(this).on('click', '.provider_enabler', function(){
$(this).refreshProviderList();
});
$(this).on('click', '#newznab_cat_update', function(){
console.debug('Clicked Button');
//Maybe check if there is anything selected?
$("#newznab_cat option").each(function() {
$(this).remove();
return;
});
var newOptions = [];
// When the update botton is clicked, loop through the capabilities list
// and copy the selected category id's to the category list on the right.
$("#newznab_cap option").each(function(){
if($(this).attr('selected') == 'selected')
{
var selected_cat = $(this).val();
console.debug(selected_cat);
newOptions.push({text: selected_cat, value: selected_cat})
};
});
$("#newznab_cat").replaceOptions(newOptions);
var selectedProvider = $('#editANewznabProvider :selected').val();
if (selectedProvider == "addNewznab")
return;
var url = $('#newznab_url').val();
var key = $('#newznab_key').val();
var cat = $('#newznab_cat option').map(function(i, opt) {
return $(opt).text();
}).toArray().join(',');
$("#newznab_cat option:not([value])").remove();
$(this).updateProvider(selectedProvider, url, key, cat);
});
$('#newznab_add').click(function(){
var selectedProvider = $('#editANewznabProvider :selected').val();
var name = $.trim($('#newznab_name').val());
var url = $.trim($('#newznab_url').val());
var key = $.trim($('#newznab_key').val());
//var cat = $.trim($('#newznab_cat').val());
var cat = $.trim($('#newznab_cat option').map(function(i, opt) {
return $(opt).text();}).toArray().join(','));
if (!name)
return;
if (!url)
return;
if (!key)
return;
var params = {name: name};
// send to the form with ajax, get a return value
$.getJSON(sbRoot + '/config/providers/canAddNewznabProvider', params,
function(data){
if (data.error != undefined) {
alert(data.error);
return;
}
$(this).addProvider(data.success, name, url, key, cat, 0);
});
});
$('.newznab_delete').click(function(){
var selectedProvider = $('#editANewznabProvider :selected').val();
$(this).deleteProvider(selectedProvider);
});
$('#torrentrss_add').click(function(){
var selectedProvider = $('#editATorrentRssProvider :selected').val();
var name = $('#torrentrss_name').val();
var url = $('#torrentrss_url').val();
var cookies = $('#torrentrss_cookies').val();
var params = { name: name, url: url, cookies: cookies}
// send to the form with ajax, get a return value
$.getJSON(sbRoot + '/config/providers/canAddTorrentRssProvider', params,
function(data){
if (data.error != undefined) {
alert(data.error);
return;
}
$(this).addTorrentRssProvider(data.success, name, url, cookies);
});
});
$('.torrentrss_delete').on('click', function(){
var selectedProvider = $('#editATorrentRssProvider :selected').val();
$(this).deleteTorrentRssProvider(selectedProvider);
});
$(this).on('change', "[class='providerDiv_tip'] input", function(){
$('div .providerDiv ' + "[name=" + $(this).attr('name') + "]").replaceWith($(this).clone());
$('div .providerDiv ' + "[newznab_name=" + $(this).attr('id') + "]").replaceWith($(this).clone());
});
$(this).on('change', "[class='providerDiv_tip'] select", function(){
$(this).find('option').each( function() {
if ($(this).is(':selected')) {
$(this).prop('defaultSelected', true)
} else {
$(this).prop('defaultSelected', false);
}
});
$('div .providerDiv ' + "[name=" + $(this).attr('name') + "]").empty().replaceWith($(this).clone())});
$(this).on('change', '.enabler', function(){
if ($(this).is(':checked')) {
$('.content_'+$(this).attr('id')).each( function() {
$(this).show()
})
} else {
$('.content_'+$(this).attr('id')).each( function() {
$(this).hide()
})
}
});
$(".enabler").each(function(){
if (!$(this).is(':checked')) {
$('.content_'+$(this).attr('id')).hide();
} else {
$('.content_'+$(this).attr('id')).show();
}
});
$.fn.makeTorrentOptionString = function(provider_id) {
var seed_ratio = $('.providerDiv_tip #'+provider_id+'_seed_ratio').prop('value');
var seed_time = $('.providerDiv_tip #'+provider_id+'_seed_time').prop('value');
var process_met = $('.providerDiv_tip #'+provider_id+'_process_method').prop('value');
var option_string = $('.providerDiv_tip #'+provider_id+'_option_string');
option_string.val([seed_ratio, seed_time, process_met].join('|'))
}
$(this).on('change', '.seed_option', function(){
var provider_id = $(this).attr('id').split('_')[0];
$(this).makeTorrentOptionString(provider_id);
});
$.fn.replaceOptions = function(options) {
var self, $option;
this.empty();
self = this;
$.each(options, function(index, option) {
$option = $("<option></option>")
.attr("value", option.value)
.text(option.text);
self.append($option);
});
};
// initialization stuff
$.fn.newznabProvidersCapabilities = [];
$(this).hideConfigTab();
$(this).showHideProviders();
$(this).showProvidersConfig();
$("#provider_order_list").sortable({
placeholder: 'ui-state-highlight',
update: function (event, ui) {
$(this).refreshProviderList();
ui.item.qtip('reposition');
}
});
$("#provider_order_list").disableSelection();
});