//enable bootstrap tooltips let tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]')); let tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) { return new bootstrap.Tooltip(tooltipTriggerEl); }); // event bindings jQuery(function ($) { const base_url = window.location.origin; $('.cartadd').click(function (e) { if ($(this).hasClass('icon_cart_clicked')) return false; let guid = $('.guid').attr('id').substring(4); //alert(guid); $.ajaxSetup({ headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content'), }, }); $.post(base_url + '/cart/add?id=' + guid, function (resp) { $(e.target).addClass('icon_cart_clicked').attr('title', 'Added to Cart'); PNotify.defaults.icons = 'fontawesome5'; PNotify.success({ title: 'Release added to your Download Basket!', type: 'success', icon: 'fa fa-info fa-3x', Animate: { animate: true, in_class: 'bounceInLeft', out_class: 'bounceOutRight', }, desktop: { desktop: true, fallback: true, }, }); }); return false; }); // browse.tpl, search.tpl -- show icons on hover let orig_opac = $('table.data tr').children('td.icons').children('div.icon').css('opacity'); $('table.data tr').hover( function () { $(this).children('td.icons').children('div.icon').css('opacity', 1); }, function () { $(this).children('td.icons').children('div.icon').css('opacity', orig_opac); } ); $('.forumpostsubmit').click(function (e) { if ($.trim($('#addMessage').val()) == '' || $.trim($('#addSubject').val()) == '') { alert('Please enter a subject and message.'); return false; } }); $('.forumreplysubmit').click(function (e) { if ($.trim($('#addMessage').val()) == '') { alert('Please enter a message.'); return false; } }); $('.check').click(function (e) { if (!$(e.target).is('input')) $(this) .children('.nzb_check') .attr('checked', !$(this).children('.nzb_check').attr('checked')); }); $('.descmore').click(function (e) { $(this).prev('.descinitial').hide(); $(this).next('.descfull').show(); $(this).hide(); return false; }); $('.nzb_check_all').change(function () { if ($(this).attr('checked')) { $('table.data tr td input:checkbox').attr('checked', $(this).attr('checked')); } else { $('table.data tr td input:checkbox').removeAttr('checked'); } }); $('.nzb_check_all_season').change(function () { let season = $(this).attr('name'); $('table.data tr td input:checkbox').each(function (i, row) { if ($(row).attr('name') == season) { $(row).attr('checked', !$(row).attr('checked')); } }); }); // browse.tpl, search.tpl $('.icon_cart').click(function (e) { if ($(this).hasClass('icon_cart_clicked')) return false; let guid = $(this).attr('id').substring(4); //alert(guid); //alert(base_url + "/cart/add?id=" + guid); $.ajaxSetup({ headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content'), }, }); $.post(base_url + '/cart/add?id=' + guid, function (resp) { $(e.target).addClass('icon_cart_clicked').attr('title', ' Release added to Cart'); PNotify.defaults.icons = 'fontawesome5'; PNotify.success({ title: 'Release added to your download basket!', type: 'success', icon: 'fa fa-info fa-3x', Animate: { animate: true, in_class: 'bounceInLeft', out_class: 'bounceOutRight', }, desktop: { desktop: true, fallback: true, }, }); }); return false; }); $('table.data a.modal_nfo').colorbox({ // NFO modal href: function () { return $(this).attr('href') + '&modal'; }, title: function () { return $(this).parent().parent().children('a.title').text(); }, innerWidth: '800px', innerHeight: '90%', initialWidth: '800px', initialHeight: '90%', speed: 0, opacity: 0.7, }); // Screenshot modal $('table.data a.modal_prev').colorbox({ scrolling: false, maxWidth: '800px', maxHeight: '450px', }); $('table.data a.modal_imdb') .colorbox({ // IMDB modal href: function () { return base_url + 'movie/' + $(this).attr('name').substring(4) + '&modal'; }, title: function () { return $(this).parent().parent().children('a.title').text(); }, innerWidth: '800px', innerHeight: '450px', initialWidth: '800px', initialHeight: '450px', speed: 0, opacity: 0.7, }) .click(function () { $('#colorbox').removeClass().addClass('cboxMovie'); }); $('a.modal_imdbtrailer') .colorbox({ // IMDB trailer modal href: function () { return base_url + 'movietrailer/' + $(this).attr('name').substring(4) + '&modal'; }, title: function () { return $(this).parent().parent().children('a.title').text(); }, innerWidth: '800px', innerHeight: '450px', initialWidth: '800px', initialHeight: '450px', speed: 0, opacity: 0.7, }) .click(function () { $('#colorbox').removeClass().addClass('cboxMovie'); }); $('table.data a.modal_music') .colorbox({ // Music modal href: function () { return base_url + 'musicmodal/' + $(this).attr('name').substring(4) + '&modal'; }, title: function () { return $(this).parent().parent().children('a.title').text(); }, innerWidth: '800px', innerHeight: '450px', initialWidth: '800px', initialHeight: '450px', speed: 0, opacity: 0.7, }) .click(function () { $('#colorbox').removeClass().addClass('cboxMusic'); }); $('table.data a.modal_console') .colorbox({ // Console modal href: function () { return base_url + 'consolemodal/' + $(this).attr('name').substring(4) + '&modal'; }, title: function () { return $(this).parent().parent().children('a.title').text(); }, innerWidth: '800px', innerHeight: '450px', initialWidth: '800px', initialHeight: '450px', speed: 0, opacity: 0.7, }) .click(function () { $('#colorbox').removeClass().addClass('cboxConsole'); }); $('table.data a.modal_book') .colorbox({ // Book modal href: function () { return base_url + 'bookmodal/' + $(this).attr('name').substring(4) + '&modal'; }, title: function () { return $(this).parent().parent().children('a.title').text(); }, innerWidth: '800px', innerHeight: '450px', initialWidth: '800px', initialHeight: '450px', speed: 0, opacity: 0.7, }) .click(function () { $('#colorbox').removeClass().addClass('cboxBook'); }); $('#nzb_multi_operations_form').submit(function () { return false; }); // Reusable function to get selected item IDs function getSelectedItemIds() { const selectedIds = []; // Try multiple common container selectors to find checkboxes const checkboxSelectors = [ "INPUT[type='checkbox']:checked", // Any checked checkbox ".table INPUT[type='checkbox']:checked", // Table checkboxes ".card INPUT[type='checkbox']:checked", // Card layout checkboxes "[data-guid] INPUT[type='checkbox']:checked", // Elements with data-guid attribute "form INPUT[type='checkbox']:checked" // Form checkboxes ]; // Try each selector until we find checked boxes for (const selector of checkboxSelectors) { $(selector).each(function() { const value = $(this).val(); if (value && value !== 'on') { selectedIds.push(value); } }); // If we found any items, stop searching if (selectedIds.length > 0) { break; } } console.log('Selected IDs:', selectedIds); // Debugging return selectedIds; } // Download button handler $('button.nzb_multi_operations_download').on('click', function() { const ids = getSelectedItemIds().join(','); if (ids) { window.location = base_url + '/getnzb?zip=1&id=' + ids; } else { PNotify.alert({ title: 'No items selected', text: 'Please select at least one item to download.', type: 'info' }); } }); // Cart button handler $('button.nzb_multi_operations_cart').on('click', function() { const selectedIds = getSelectedItemIds(); if (selectedIds.length === 0) { PNotify.alert({ title: 'No items selected', text: 'Please select at least one item to add to your cart.', type: 'info' }); return; } $.ajaxSetup({ headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content'), }, }); // Find and update cart icons using data attributes selectedIds.forEach(guid => { // Look for cart icon with matching data attribute const $cartIcon = $(`[data-guid="${guid}"] .icon_cart, #guid${guid}`); if ($cartIcon.length && !$cartIcon.hasClass('icon_cart_clicked')) { $cartIcon.addClass('icon_cart_clicked').attr('title', 'Added to Cart'); } }); // Uncheck all selected checkboxes $('input[type="checkbox"]:checked').prop('checked', false); // Send to cart if (selectedIds.length > 0) { const guidString = selectedIds.join(','); $.post(base_url + '/cart/add?id=' + guidString, function() { PNotify.defaults.icons = 'fontawesome5'; PNotify.success({ title: 'Items added to your Download Basket!', type: 'success', icon: 'fa fa-info fa-3x', Animate: { animate: true, in_class: 'bounceInLeft', out_class: 'bounceOutRight', }, desktop: { desktop: true, fallback: true, }, }); }); } }); $('button.nzb_multi_operations_sab').on('click', function () { $("table.data INPUT[type='checkbox']:checked").each(function (i, row) { let $sabIcon = $(row).parent().parent().children('td.icons').children('.icon_sab'); let guid = $(row).val(); //alert(guid); if (guid && !$sabIcon.hasClass('icon_sab_clicked')) { let nzburl = base_url + '/sendtoqueue/' + guid; // alert(nzburl); $.post(nzburl, function (resp) { $sabIcon.addClass('icon_sab_clicked').attr('title', 'Added to Queue'); PNotify.defaults.icons = 'fontawesome5'; PNotify.success({ title: 'Release added to your download queue!', type: 'success', icon: 'fa fa-info fa-3x', Animate: { animate: true, in_class: 'bounceInLeft', out_class: 'bounceOutRight', }, desktop: { desktop: true, fallback: true, }, }); }); } $(this).attr('checked', false); }); }); $('input.nzb_multi_operations_nzbget').on('click', function () { $("table.data INPUT[type='checkbox']:checked").each(function (i, row) { let $nzbgetIcon = $(row) .parent() .parent() .children('td.icons') .children('.icon_nzbget'); let guid = $(row).val(); if (guid && !$nzbgetIcon.hasClass('icon_nzbget_clicked')) { let nzburl = base_url + '/sendtoqueue/' + guid; $.post(nzburl, function (resp) { $nzbgetIcon.addClass('icon_nzbget_clicked').attr('title', 'Added to Queue'); PNotify.defaults.icons = 'fontawesome5'; PNotify.success({ title: 'Release added to your download queue!', type: 'success', icon: 'fa fa-info fa-3x', Animate: { animate: true, in_class: 'bounceInLeft', out_class: 'bounceOutRight', }, desktop: { desktop: true, fallback: true, }, }); }); } $(this).attr('checked', false); }); }); //front end admin functions $('input.nzb_multi_operations_edit').click(function () { let ids = ''; $("table.data INPUT[type='checkbox']:checked").each(function (i, row) { if ($(row).val() != 'on') ids += '&id[]=' + $(row).val(); }); if (ids) $('input.nzb_multi_operations_edit').colorbox({ href: function () { return ( base_url + 'ajax_release-admin?action=edit' + ids + '&from=' + encodeURIComponent(window.location) ); }, title: 'Edit Release', innerWidth: '400px', innerHeight: '250px', initialWidth: '400px', initialHeight: '250px', speed: 0, opacity: 0.7, }); }); $('input.nzb_multi_operations_delete').click(function () { let ids = ''; $("table.data INPUT[type='checkbox']:checked").each(function (i, row) { if ($(row).val() != 'on') ids += '&id[]=' + $(row).val(); }); if (ids) { PNotify.defaults.icons = 'fontawesome5'; const notice = PNotify.alert({ title: 'Confirmation Needed', text: 'Are you sure you want to delete the selected releases?', icon: 'glyphicon glyphicon-question-sign', hide: false, modules: { Confirm: { confirm: true, }, }, Buttons: { closer: false, sticker: false, }, History: { history: false, }, }); notice.on('pnotify.confirm', function () { $.post(base_url + 'ajax_release-admin?action=dodelete' + ids, function (resp) { location.reload(true); }); }); notice.on('pnotify.cancel', function () { alert('Cancelled'); }); } }); $('input.nzb_multi_operations_rebuild').click(function () { let ids = ''; $("table.data INPUT[type='checkbox']:checked").each(function (i, row) { if ($(row).val() != 'on') ids += '&id[]=' + $(row).val(); }); if (ids) if (confirm('Are you sure you want to rebuild the selected releases?')) { $.post(base_url + 'ajax_release-admin?action=dorebuild' + ids, function (resp) { location.reload(true); }); } }); //cart functions $('input.nzb_multi_operations_cartdelete').click(function () { let ids = new Array(); $("table.data INPUT[type='checkbox']:checked").each(function (i, row) { if ($(row).val() != 'on') ids.push($(row).val()); }); $.ajaxSetup({ headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content'), }, }); //alert(base_url + "/cart/delete/" + ids); if (ids) { PNotify.defaults.icons = 'fontawesome5'; const notice = PNotify.alert({ title: 'Confirmation Needed', text: 'Are you sure you want to delete the selected releases from your cart?', hide: false, modules: { Confirm: { confirm: true, }, }, Buttons: { closer: false, sticker: false, }, History: { history: false, }, }); notice.on('pnotify.confirm', function () { $.post(base_url + '/cart/delete/' + ids); }); notice.on('pnotify.cancel', function () { alert('Cancelled'); }); } }); $('input.nzb_multi_operations_cartsab').click(function () { let ids = new Array(); $("table.data INPUT[type='checkbox']:checked").each(function (i, row) { let guid = $(row).val(); let nzburl = base_url + '/sendtoqueue/' + guid; $.post(nzburl, function () { PNotify.defaults.icons = 'fontawesome5'; PNotify.success({ title: 'Releases sent to queue!', type: 'success', icon: 'fa fa-info fa-3x', Animate: { animate: true, in_class: 'bounceInLeft', out_class: 'bounceOutRight', }, desktop: { desktop: true, fallback: true, }, }); }); }); }); // headermenu.tpl $('#headsearch') .focus(function () { if (this.value === 'Search...') this.value = ''; else this.select(); }) .blur(function () { if (this.value === '') this.value = 'Search...'; }); $('#headsearch_form').submit(function () { $('#headsearch_go').trigger('click'); return false; }); document.getElementById('headsearch_go').addEventListener('click', function () { let searchInput = document.getElementById('headsearch'); let categoryInput = document.getElementById('headcat'); if (searchInput.value && searchInput.value != 'Search...') { let sText = searchInput.value; let sCat = categoryInput.value !== '-1' ? '&t=' + categoryInput.value : 't=-1'; window.location.href = base_url + '/search?' + sCat + '&search=' + sText; } else { PNotify.defaults.icons = 'fontawesome5'; PNotify.alert({ title: 'You need to enter a search term!', type: 'error', icon: 'fa fa-info fa-3x', Animate: { animate: true, in_class: 'bounceInLeft', out_class: 'bounceOutRight', }, desktop: { desktop: true, fallback: true, }, }); } }); // search.tpl $('#search_search_button').click(function () { if ($('#search').val()) document.location = base_url + '/search?search=' + $('#search').val() + ($('#search_cat').val() != -1 ? '&t=' + $('#search_cat').val() : '&t=-1'); return false; }); $('#search').focus(function () { this.select(); }); // searchraw.tpl $('#searchraw_search_button').click(function () { if ($('#search').val()) document.location = base_url + '/searchraw/' + $('#search').val(); return false; }); $('#searchraw_download_selected').click(function () { if ($('#dl input:checked').length) $('#dl').trigger('submit'); return false; }); // login.tpl, register.tpl, search.tpl, searchraw.tpl if ($('#username').length) $('#username').focus(); if ($('#search').length) $('#search').focus(); // viewfilelist.tpl $('#viewfilelist_download_selected').click(function () { if ($('#fileform input:checked').length) $('#fileform').trigger('submit'); return false; }); // misc $('.confirm_action').click(function () { return confirm('Are you sure?'); }); // play audio preview $('.audioprev').click(function () { let a = document.getElementById($(this).next('audio').attr('ID')); if (a != null) { if ($(this).text() == 'Listen') { a.play(); $(this).text('Stop'); } else { a.pause(); a.currentTime = 0; $(this).text('Listen'); } } a.addEventListener('ended', function () { $(this).prev().text('Listen'); }); return false; }); // mmenu $('.mmenu').click(function () { document.location = $(this).children('a').attr('href'); return false; }); // mmenu_new $('.mmenu_new').click(function () { window.open($(this).children('a').attr('href')); return false; }); // searchraw.tpl, viewfilelist.tpl -- checkbox operations // selections let last1, last2; $('.checkbox_operations .select_all').click(function () { $("table.data INPUT[type='checkbox']").attr('checked', true).trigger('change'); return false; }); $('.checkbox_operations .select_none').click(function () { $("table.data INPUT[type='checkbox']").attr('checked', false).trigger('change'); return false; }); $('.checkbox_operations .select_invert').click(function () { $("table.data INPUT[type='checkbox']").each(function () { $(this).attr('checked', !$(this).attr('checked')).trigger('change'); }); return false; }); $('.checkbox_operations .select_range').click(function () { if (last1 && last2 && last1 < last2) $("table.data INPUT[type='checkbox']") .slice(last1, last2) .attr('checked', true) .trigger('change'); else if (last1 && last2) $("table.data INPUT[type='checkbox']") .slice(last2, last1) .attr('checked', true) .trigger('change'); return false; }); $('table.data td.check INPUT[type="checkbox"]').click(function (e) { // range event interaction -- see further above let rowNum = $(e.target).parent().parent()[0].rowIndex; if (last1) last2 = last1; last1 = rowNum; // perform range selection if (e.shiftKey && last1 && last2) { if (last1 < last2) $("table.data INPUT[type='checkbox']") .slice(last1, last2) .attr('checked', true) .trigger('change'); else $("table.data INPUT[type='checkbox']") .slice(last2, last1) .attr('checked', true) .trigger('change'); } }); $('table.data a.data_filename').click(function (e) { // click filenames to select // range event interaction -- see further above let rowNum = $(e.target).parent().parent()[0].rowIndex; if (last1) last2 = last1; last1 = rowNum; let $checkbox = $( 'table.data tr:nth-child(' + (rowNum + 1) + ') td.selection INPUT[type="checkbox"]' ); $checkbox.attr('checked', !$checkbox.attr('checked')); return false; }); // show/hide previews $('#showmoviepreviews').click(function () { $('#moviepreviews').next('form').toggle('fast'); $('#moviepreviews').toggle('fast', function () { $('#showmoviepreviews').text( ($('#moviepreviews').is(':visible') ? 'Hide' : 'Show') + ' previews' ); }); return false; }); // show/hide invite form $('#lnkSendInvite').click(function () { $('#divInvite').slideToggle('fast'); }); // send an invite $('#frmSendInvite').submit(function () { let inputEmailto = $('#txtInvite').val(); if (isValidEmailAddress(inputEmailto)) { // no caching of results $.ajax({ url: base_url + '/ajax_profile?action=1&rand=' + $.now(), data: { emailto: inputEmailto }, dataType: 'html', success: function (data) { $('#txtInvite').val(''); $('#divInvite').slideToggle('fast'); $('#divInviteSuccess').text(data).show(); $('#divInviteError').hide(); }, error: function (xhr, err, e) { alert('Error in ajax_profile: ' + err); }, }); } else { $('#divInviteSuccess').hide(); $('#divInviteError').text('Invalid email').show(); } return false; }); // movie.tpl $('.mlmore').click(function () { // show more movies $(this).parent().parent().hide(); $(this).parent().parent().parent().children('.mlextra').show(); return false; }); // lookup tmdb for a movie $('#frmMyMovieLookup').submit(function () { let movSearchText = $('#txtsearch').val(); // no caching of results $.ajax({ url: base_url + '/ajax_mymovies?rand=' + $.now(), data: { id: movSearchText }, dataType: 'html', success: function (data) { $('#divMovResults').html(data); }, error: function (xhr, err, e) { alert('Error in ajax_mymovies: ' + err); }, }); return false; }); // season selector in TV $('a[id^="seas_"]').click(function () { seas = $(this).attr('ID').replace('seas_', ''); $('table[class^="tb_"]').hide(); $('.tb_' + seas).show(); $('li', $(this).closest('ul')).removeClass('active'); $(this).closest('li').addClass('active'); return false; }); }); $.extend({ // http://plugins.jquery.com/project/URLEncode URLEncode: function (c) { let o = ''; let x = 0; c = c.toString(); let r = /(^[a-zA-Z0-9_.]*)/; while (x < c.length) { let m = r.exec(c.substr(x)); if (m != null && m.length > 1 && m[1] != '') { o += m[1]; x += m[1].length; } else { if (c[x] == ' ') o += '+'; else { let d = c.charCodeAt(x); let h = d.toString(16); o += '%' + (h.length < 2 ? '0' : '') + h.toUpperCase(); } x++; } } return o; }, URLDecode: function (s) { let o = s; let binVal, t; let r = /(%[^%]{2})/; while ((m = r.exec(o)) != null && m.length > 1 && m[1] != '') { b = parseInt(m[1].substr(1), 16); t = String.fromCharCode(b); o = o.replace(m[1], t); } return o; }, }); function isValidEmailAddress(emailAddress) { let pattern = new RegExp( /^(("[\w-\s]+")|([\w-]+(?:\.[\w-]+)*)|("[\w-\s]+")([\w-]+(?:\.[\w-]+)*))(@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$)|(@\[?((25[0-5]\.|2[0-4][0-9]\.|1[0-9]{2}\.|[0-9]{1,2}\.))((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\.){2}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\]?$)/i ); return pattern.test(emailAddress); } function getNzbGetQueue() { $.ajax({ url: 'queuedata?type=nzbget&id=' + $.now(), cache: false, success: function (html) { $('.nzbget_queue').html(html); setTimeout('getNzbGetQueue()', 2500); }, error: function () { $('.nzbget_queue').html( 'Could not contact your queue. Refresh' ); }, timeout: 5000, }); } function getHistory() { $.ajax({ url: 'queuedata?type=history&id=' + $.now(), cache: false, success: function (html) { $('.sab_history').html(html); setTimeout('getHistory()', 10000); }, error: function () { //$(".sab_history").html("Could not contact your queue. Refresh"); }, timeout: 5000, }); } /** ****** iswitch *********************** **/ $(function () { let checkAll = $('input.flat-all'); let checkboxes = $('input.flat'); $('input').iCheck({ checkboxClass: 'icheckbox_flat-green', radioClass: 'iradio_flat-green', }); checkAll.on('ifChecked ifUnchecked', function (event) { if (event.type === 'ifChecked') { checkboxes.iCheck('check'); } else { checkboxes.iCheck('uncheck'); } }); checkboxes.on('ifChanged', function (event) { if (checkboxes.filter(':checked').length === checkboxes.length) { checkAll.prop('checked', 'checked'); } else { checkAll.prop('checked', false); } checkAll.iCheck('update'); }); }); /** ****** /iswitch *********************** **/