// event bindings jQuery(function ($) { // browse.tpl, search.tpl -- show icons on hover var 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($("#addReply").val()) == "") { alert("Please enter a message."); return false; } }); $(".check").click(function (e) { if (!$(e.target).is('input')) $(this).children(".nzb_check").prop('checked', !$(this).children(".nzb_check").prop('checked')); }); $(".descmore").click(function (e) { $(".descinitial").hide(); $(".descfull").show(); return false; }); $('.nzb_check_all').change(function () { $('table#browsetable tr td input:checkbox').prop('checked', $(this).prop('checked')); }); $('.nzb_check_all_season').change(function () { var season = $(this).attr('name'); $('table.data tr td input:checkbox').each(function (i, row) { if ($(row).attr('name') == season) { $(row).prop('checked', !$(row).prop('checked')); } }); }); // browse.tpl, search.tpl $('.icon_cart').click(function (e) { if ($(this).hasClass('icon_cart_clicked')) return false; var guid = $(this).parent().parent().attr('id').substring(4); $.post(SERVERROOT + "cart?add=" + guid, function (resp) { $(e.target).addClass('icon_cart_clicked').attr('title', 'Added to Cart'); createGrowl('Added to Cart'); }); return false; }); $('.icon_sab').click(function (e) { // replace with cookies? if ($(this).hasClass('icon_sab_clicked')) { return false; } var guid = $(this).parent().parent().attr('id').substring(4); var nzburl = SERVERROOT + "sendtoqueue/" + guid; $.post(nzburl, function (resp) { $(e.target).addClass('icon_sab_clicked').attr('title', 'Added to Queue'); createGrowl('Added to Queue'); }); return false; }); $('.sendtocouch').click(function (e) { if ($(this).hasClass('icon_cp_clicked')) return false; var id = $(this).attr('id').substring(4); var cpurl = SERVERROOT + "sendtocouch/" + id; $.post(cpurl, function(resp){ $(e.target).addClass('icon_cp_clicked').attr('title','Added to CouchPotato'); createGrowl('Added to CouchPotato'); }); }); $("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({maxWidth: "800px", maxHeight: "800x"}); $("table.data a.modal_imdb").colorbox({ // IMDB modal href: function () { return SERVERROOT + "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'); }); $("table.data a.modal_music").colorbox({ // Music modal href: function () { return SERVERROOT + "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 SERVERROOT + "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 SERVERROOT + "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; }); $('input.nzb_multi_operations_download').click(function () { var ids = ""; $("table.data INPUT[type='checkbox']:checked").each(function (i, row) { if ($(row).val() != "on") ids += $(row).val() + ','; }); ids = ids.substring(0, ids.length - 1); if (ids) window.location = SERVERROOT + "getnzb?zip=1&id=" + ids; }); $('input.nzb_multi_operations_cart').click(function () { var guids = new Array(); $("table.data INPUT[type='checkbox']:checked").each(function (i, row) { var guid = $(row).val(); var $cartIcon = $(row).parent().parent().children('td.icons').children('.icon_cart'); if (guid && !$cartIcon.hasClass('icon_cart_clicked')) { $cartIcon.addClass('icon_cart_clicked').attr('title', 'Added to Cart'); // consider doing this only upon success guids.push(guid); createGrowl('Added to Cart'); } $(this).prop('checked', false); }); $.post(SERVERROOT + "cart?add=" + guids); }); $('input.nzb_multi_operations_sab').click(function () { $("table.data INPUT[type='checkbox']:checked").each(function (i, row) { var $sabIcon = $(row).parent().parent().children('td.icons').children('.icon_sab'); var guid = $(row).val(); if (guid && !$sabIcon.hasClass('icon_sab_clicked')) { var nzburl = SERVERROOT + "sendtoqueue/" + guid; $.post(nzburl, function (resp) { $sabIcon.addClass('icon_sab_clicked').attr('title', 'Added to Queue'); createGrowl('Added to Queue'); }); } $(this).prop('checked', false); }); }); //front end admin functions $('input.nzb_multi_operations_edit').click(function () { var 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 SERVERROOT + "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 () { var 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 delete the selected releases?')) { $.post(SERVERROOT + "ajax_release-admin?action=dodelete" + ids, function (resp) { window.location = window.location; }); } }); //cart functions $('input.nzb_multi_operations_cartdelete').click(function () { var ids = new Array(); $("table.data INPUT[type='checkbox']:checked").each(function (i, row) { if ($(row).val() != "on") ids.push($(row).val()); }); if (ids) { if (confirm('Are you sure you want to delete the selected releases from your cart?')) { $.post(SERVERROOT + "cart?delete", { 'delete': ids }, function (resp) { window.location = window.location; }); } } }); // headermenu.tpl $('#headsearch') .focus(function () { if (this.value == 'Enter keywords') this.value = ''; }) .blur(function () { if (this.value == '') this.value = 'Enter keywords'; }); $('#headsearch_form').submit(function () { $('headsearch_go').trigger('click'); return false; }); $('#headsearch_go').click(function () { if ($('#headsearch').val() && $('#headsearch').val() != 'Enter keywords') { document.location = WWW_TOP + "/search/" + $('#headsearch').val() + ($("#headcat").val() != -1 ? "?t=" + $("#headcat").val() : ""); } }); // search.tpl $('#search_search_button').click(function () { if ($('#search').val()) document.location = WWW_TOP + "/search/" + $('#search').val() + ($("#search_cat").val() != -1 ? "?t=" + $("#search_cat").val() : ""); 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?'); }); // 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 var last1, last2; $(".checkbox_operations .select_all").click(function () { $("table.data INPUT[type='checkbox']").prop('checked', true).trigger('change'); return false; }); $(".checkbox_operations .select_none").click(function () { $("table.data INPUT[type='checkbox']").prop('checked', false).trigger('change'); return false; }); $(".checkbox_operations .select_invert").click(function () { $("table.data INPUT[type='checkbox']").each(function () { $(this).prop('checked', !$(this).prop('checked')).trigger('change'); }); return false; }); $(".checkbox_operations .select_range").click(function () { if (last1 && last2 && last1 < last2) $("table.data INPUT[type='checkbox']").slice(last1, last2).prop('checked', true).trigger('change'); else if (last1 && last2) $("table.data INPUT[type='checkbox']").slice(last2, last1).prop('checked', true).trigger('change'); return false; }); $('table.data td.check INPUT[type="checkbox"]').click(function (e) { // range event interaction -- see further above var 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).prop('checked', true).trigger('change'); else $("table.data INPUT[type='checkbox']").slice(last2, last1).prop('checked', true).trigger('change'); } }); $('table.data a.data_filename').click(function (e) { // click filenames to select // range event interaction -- see further above var rowNum = $(e.target).parent().parent()[0].rowIndex; if (last1) last2 = last1; last1 = rowNum; var $checkbox = $('table.data tr:nth-child(' + (rowNum + 1) + ') td.selection INPUT[type="checkbox"]'); $checkbox.prop('checked', !$checkbox.prop('checked')); return false; }); // show/hide invite form $('#lnkSendInvite').click(function () { $('#divInvite').slideToggle('fast'); }); // send an invite $('#frmSendInvite').submit(function () { var inputEmailto = $("#txtInvite").val(); if (isValidEmailAddress(inputEmailto)) { // no caching of results var rand_no = Math.random(); $.ajax({ url: WWW_TOP + '/ajax_profile?action=1&rand=' + rand_no, 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 () { var movSearchText = $("#txtsearch").val(); // no caching of results var rand_no = Math.random(); $.ajax({ url: WWW_TOP + '/ajax_mymovies?rand=' + rand_no, data: { id: movSearchText}, dataType: "html", success: function (data) { $("#divMovResults").html(data); }, error: function (xhr, err, e) { alert("Error in ajax_mymovies: " + err); } }); return false; }); // file list tooltip $(".rarfilelist").each(function () { var guid = $(this).children('img').attr('alt'); $(this).qtip({ content: { title: { text: 'rar archive contains...' }, text: 'loading...', // The text to use whilst the AJAX request is loading ajax: { url: SERVERROOT + 'ajax_rarfilelist', // URL to the local file type: 'GET', // POST or GET data: { id: guid }, // Data to pass along with your request success: function (data, status) { this.set('content.text', data); } } }, position: { my: 'top right', at: 'bottom left', }, style: { classes: 'qtip-dark qtip-shadow qtip-rounded', width: { max: 500 }, tip: { // Now an object instead of a string corner: 'topRight', // We declare our corner within the object using the corner sub-option size: { x: 8, // Be careful that the x and y values refer to coordinates on screen, not height or width. y: 8 // Depending on which corner your tooltip is at, x and y could mean either height or width! } } } }); }); // seriesinfo tooltip $(".seriesinfo").each(function () { var guid = $(this).attr('title'); $(this).qtip({ content: { title: { text: 'episode info...' }, text: 'loading...', // The text to use whilst the AJAX request is loading ajax: { url: SERVERROOT + 'ajax_tvinfo', // URL to the local file type: 'GET', // POST or GET data: { id: guid }, // Data to pass along with your request success: function (data, status) { this.set('content.text', data); } } }, style: { classes: 'qtip-dark qtip-shadow qtip-rounded' } }); }); // mediainfo tooltip $(".mediainfo").each(function () { var guid = $(this).attr('title'); $(this).qtip({ content: { title: { text: 'extended media info...' }, text: 'loading...', // The text to use whilst the AJAX request is loading ajax: { url: SERVERROOT + 'ajax_mediainfo', // URL to the local file type: 'GET', // POST or GET data: { id: guid }, // Data to pass along with your request success: function (data, status) { this.set('content.text', data); } } }, style: { classes: 'qtip-dark qtip-shadow qtip-rounded', width: { max: 500 }, tip: { // Now an object instead of a string corner: 'topLeft', // We declare our corner within the object using the corner sub-option size: { x: 8, // Be careful that the x and y values refer to coordinates on screen, not height or width. y: 8 // Depending on which corner your tooltip is at, x and y could mean either height or width! } } } }); }); // preinfo tooltip $(".preinfo").each(function () { var preid = $(this).attr('title'); $(this).qtip({ content: { title: { text: 'PreDB info...' }, text: 'loading...', // The text to use whilst the AJAX request is loading ajax: { url: SERVERROOT + 'ajax_preinfo', // URL to the local file type: 'GET', // POST or GET data: { id: preid }, // Data to pass along with your request success: function (data, status) { this.set('content.text', data); } } }, style: { classes: 'qtip-dark qtip-shadow qtip-rounded', width: { max: 500 }, tip: { // Now an object instead of a string corner: 'topLeft', // We declare our corner within the object using the corner sub-option size: { x: 8, // Be careful that the x and y values refer to coordinates on screen, not height or width. y: 8 // Depending on which corner your tooltip is at, x and y could mean either height or width! } } } }); }); // titleinfo tooltip $(".titleinfo").each(function () { var guid = $(this).attr('title'); $(this).qtip({ content: { title: { text: 'Release info...' }, text: 'loading...', // The text to use whilst the AJAX request is loading ajax: { url: SERVERROOT + 'ajax_titleinfo', // URL to the local file type: 'GET', // POST or GET data: { id: guid }, // Data to pass along with your request success: function (data, status) { this.set('content.text', data); } } }, style: { classes: 'qtip-dark qtip-shadow qtip-rounded', width: { max: 500 }, tip: { // Now an object instead of a string corner: 'topLeft', // We declare our corner within the object using the corner sub-option size: { x: 8, // Be careful that the x and y values refer to coordinates on screen, not height or width. y: 8 // Depending on which corner your tooltip is at, x and y could mean either height or width! } } } }); }); }); $.extend({ // http://plugins.jquery.com/project/URLEncode URLEncode: function (c) { var o = ''; var x = 0; c = c.toString(); var r = /(^[a-zA-Z0-9_.]*)/; while (x < c.length) { var 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 { var d = c.charCodeAt(x); var h = d.toString(16); o += '%' + (h.length < 2 ? '0' : '') + h.toUpperCase(); } x++; } } return o; }, URLDecode: function (s) { var o = s; var binVal, t; var 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) { var 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 mymovie_del(imdbid, btn) { var rand_no = Math.random(); $.ajax({ url: WWW_TOP + '/ajax_mymovies?rand=' + rand_no, data: { del: imdbid}, dataType: "html", success: function (data) { $(btn).hide(); $(btn).prev("a").show(); }, error: function (xhr, err, e) { } }); return false; } function mymovie_add(imdbid, btn) { $(btn).hide(); $(btn).next("a").show(); var rand_no = Math.random(); $.ajax({ url: WWW_TOP + '/ajax_mymovies?rand=' + rand_no, data: { add: imdbid}, dataType: "html", success: function (data) { }, error: function (xhr, err, e) { } }); return false; } // qtip growl $(document).ready(function () { window.createGrowl = function (tipText /*, tipTitle, persistent*/) { // Use the last visible jGrowl qtip as our positioning target var target = $('.qtip.jgrowl:visible:last'); var tipTitle = 'Attention!'; var persistent = false; // Create your jGrowl qTip... $(document.body).qtip({ // Any content config you want here really.... go wild! content: { text: tipText, title: { text: tipTitle, button: true } }, position: { my: 'top right', // Not really important... at: (target.length ? 'bottom' : 'top') + ' right', // If target is window use 'top right' instead of 'bottom right' target: target.length ? target : $(document.body), // Use our target declared above adjust: { y: 5 } // Add some vertical spacing }, show: { event: false, // Don't show it on a regular event ready: true, // Show it when ready (rendered) effect: function () { $(this).stop(0, 1).fadeIn(400); }, // Matches the hide effect // Custom option for use with the .get()/.set() API, awesome! persistent: persistent }, hide: { event: false, // Don't hide it on a regular event effect: function (api) { // Do a regular fadeOut, but add some spice! $(this).stop(0, 1).fadeOut(400).queue(function () { // Destroy this tooltip after fading out api.destroy(); // Update positions updateGrowls(); }) } }, style: { classes: 'jgrowl qtip-dark qtip-shadow qtip-rounded', // Some nice visual classes tip: false // No tips for this one (optional ofcourse) }, events: { render: function (event, api) { // Trigger the timer (below) on render timer.call(api.elements.tooltip, event); } } }) .removeData('qtip'); }; // Make it a window property see we can call it outside via updateGrowls() at any point window.updateGrowls = function () { // Loop over each jGrowl qTip var each = $('.qtip.jgrowl:not(:animated)'); each.each(function (i) { var api = $(this).data('qtip'); // Set the target option directly to prevent reposition() from being called twice. api.options.position.target = !i ? $(document.body) : each.eq(i - 1); api.set('position.at', (!i ? 'top' : 'bottom') + ' right'); }); }; // Setup our timer function function timer(event) { var api = $(this).data('qtip'), lifespan = 5000; // 5 second lifespan // If persistent is set to true, don't do anything. if (api.get('show.persistent') === true) { return; } // Otherwise, start/clear the timer depending on event type clearTimeout(api.timer); if (event.type !== 'mouseover') { api.timer = setTimeout(api.hide, lifespan); } } // Utilise delegate so we don't have to rebind for every qTip! $(document).delegate('.qtip.jgrowl', 'mouseover mouseout', timer); });