"use strict"; /** * html_entity_decode */ function html_entity_decode(str) { var el = document.createElement("div"); el.innerHTML = str; for (var i = 0, ret = ''; i < el.childNodes.length; i++) { ret += el.childNodes[i].nodeValue; } return ret; } /** * get_size */ function get_size(size) { var steps = 0; for (; size >= 1024; size /= 1024, steps++); var exts = ['B', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB'] return (size.toFixed(2) + (exts[steps] || '')) } /** * ratio */ function ratio(a, b) { var rc = 'r50'; for (var i of [[5, '20'], [2, '10'], [1, '09'], [0.9, '08'], [0.8, '07'], [0.7, '06'], [0.6, '05'], [0.5, '04'], [0.4, '03'], [0.3, '02'], [0.2, '01'], [0.1, '00']]) { if (a / b < i[0]) rc = 'r' + i[1]; } if (b == 0) return a ? '∞' : '--'; return '' + ((a / b) - 0.005).toFixed(2) + ''; } /** * save_message */ function save_message(message, err = false) { var messageDiv = document.createElement("div"); messageDiv.className = err ? "error_message box" : "save_message box"; messageDiv.innerHTML = message; $("#content").raw().insertBefore(messageDiv, $("#content").raw().firstChild); } $.fn.extend({ gshow: function () { return this.remove_class('hidden'); }, ghide: function (force) { return this.add_class('hidden', force); }, gtoggle: function (force) { if (this[0].className.split(' ').indexOf('hidden') == -1) { this.add_class('hidden', force); } else { this.remove_class('hidden'); } return this; }, listen: function (event, callback) { for (var i = 0; i < this.length; i++) { var object = this[i]; if (document.addEventListener) { object.addEventListener(event, callback, false); } else { object.attachEvent('on' + event, callback); } } return this; }, add_class: function (class_name, force) { for (var i = 0; i < this.length; i++) { var object = this[i]; if (object.className === '') { object.className = class_name; } else if (force || object.className.split(' ').indexOf(class_name) == -1) { object.className = object.className + ' ' + class_name; } } return this; }, remove_class: function (class_name) { for (var i = 0; i < this.length; i++) { var object = this[i]; var classes = object.className.split(' '); var result = classes.indexOf(class_name); if (result != -1) { classes.splice(result, 1); object.className = classes.join(' '); } } return this; }, has_class: function (class_name) { for (var i = 0; i < this.length; i++) { var object = this[i]; var classes = object.className.split(' '); if (classes.indexOf(class_name) != -1) { return true; } } return false; }, toggle_class: function (class_name) { for (var i = 0, il; i < this.length; i++) { var object = this[i]; var classes = object.className.split(' '); var result = classes.indexOf(class_name); if (result != -1) { classes.splice(result, 1); object.className = classes.join(' '); } else { if (object.className === '') { object.className = class_name; } else { object.className = object.className + ' ' + class_name; } } } return this; }, disable: function () { $(this).prop('disabled', true); return this; }, enable: function () { $(this).prop('disabled', false); return this; }, raw: function (number) { if (typeof number == 'undefined') { number = 0; } return $(this).get(number); }, nextElementSibling: function () { var here = this[0]; if (here.nextElementSibling) { return $(here.nextElementSibling); } do { here = here.nextSibling; } while (here.nodeType != 1); return $(here); }, previousElementSibling: function () { var here = this[0]; if (here.previousElementSibling) { return $(here.previousElementSibling); } do { here = here.nextSibling; } while (here.nodeType != 1); return $(here); }, // Disable unset form elements to allow search URLs cleanups disableUnset: function () { $('input, select', this).filter(function () { return $(this).val() === ""; }).disable(); return this; }, // Prevent double submission of forms preventDoubleSubmission: function () { $(this).submit(function (e) { var $form = $(this); if ($form.data('submitted') === true) { e.preventDefault(); } else { $form.data('submitted', true); } }); return this; } }); if ($('meta[name=authkey]').raw()) { var authkey = $('meta[name=authkey]').raw().content; var userid = parseInt($('meta[name=userid]').raw().content); } /** * Check or uncheck checkboxes in formElem * If masterElem is false, toggle each box, otherwise use masterElem's status on all boxes * If elemSelector is false, act on all checkboxes in formElem */ function toggleChecks(formElem, masterElem, elemSelector) { elemSelector = elemSelector || 'input:checkbox'; if (masterElem) { $('#' + formElem + ' ' + elemSelector).prop('checked', masterElem.checked); } else { $('#' + formElem + ' ' + elemSelector).each(function () { this.checked = !this.checked; }) } } var lightbox = { init: function (image, size) { if ($('#lightbox').length == 0 || $('#curtain').length == 0) { var lightboxEl = document.createElement('div') lightboxEl.id = 'lightbox' lightboxEl.className = 'lightbox hidden' var curtainEl = document.createElement('div') curtainEl.id = 'curtain' curtainEl.className = 'curtain hidden' $('#wrapper')[0].appendChild(lightboxEl) $('#wrapper')[0].appendChild(curtainEl) } if (typeof (image) == 'string') { $('#lightbox').gshow().listen('click', lightbox.unbox).raw().innerHTML = '
Loading...
';
$('#curtain').gshow().listen('click', lightbox.unbox);
var src = image;
image = new Image();
image.onload = function () {
lightbox.box_async(image);
}
image.src = src;
}
if (image.naturalWidth === undefined) {
var tmp = document.createElement('img');
tmp.style.visibility = 'hidden';
tmp.src = image.src;
image.naturalWidth = tmp.width;
}
if (image.naturalWidth > size) {
lightbox.box(image);
}
},
box: function (image) {
var hasA = false;
if (image.parentNode != null && image.parentNode.tagName.toUpperCase() == 'A') {
hasA = true;
}
if (!hasA) {
$('#lightbox').gshow().listen('click', lightbox.unbox).raw().innerHTML = '';
$('#curtain').gshow().listen('click', lightbox.unbox);
}
},
box_async: function (image) {
var hasA = false;
if (image.parentNode != null && image.parentNode.tagName.toUpperCase() == 'A') {
hasA = true;
}
if (!hasA) {
$('#lightbox').raw().innerHTML = '
';
}
},
unbox: function (data) {
$('#curtain').ghide();
$('#lightbox').ghide().raw().innerHTML = '';
}
};
// Horrible hack to let arrow keys work as forward/back in lightbox
window.onkeydown = function (e) {
e = e || window.event
if (e.keyCode == 37 || e.keyCode == 39) {
if ($('#lightbox').raw() && !$('#lightbox').raw().classList.contains('hidden')) {
($('[id!="lightbox"] > [lightbox-img="' + $('#lightbox > img').raw().src + '"]').raw()[((e.keyCode == 39) ? 'next' : 'previous') + 'Sibling'].click() || function () { })()
}
}
}
function resize(id) {
var textarea = document.getElementById(id);
if (textarea.scrollHeight > textarea.clientHeight) {
textarea.style.height = Math.min(1000, textarea.scrollHeight + textarea.style.fontSize) + 'px';
}
}
//ZIP downloader stuff
function add_selection() {
var selected = $('#formats').raw().options[$('#formats').raw().selectedIndex];
if (selected.disabled === false) {
var listitem = document.createElement("li");
listitem.id = 'list' + selected.value;
listitem.innerHTML = ' ' +
' ' + selected.innerHTML + '' +
' X' +
'
';
$('#list').raw().appendChild(listitem);
$('#opt' + selected.value).raw().disabled = true;
}
}
function remove_selection(index) {
$('#list' + index).remove();
$('#opt' + index).raw().disabled = '';
}
function preload(image) {
var img = document.createElement('img')
img.style.display = 'none'
img.src = image
document.body.appendChild(img)
document.body.removeChild(img)
}
let coverListener
function getCover(event) {
let image = event.target.attributes['data-cover'].value
$('#coverCont img').remove()
let coverCont = ($('#coverCont').length == 0) ? document.body.appendChild(document.createElement('div')) : $('#coverCont')[0]
coverCont.id = 'coverCont'
if ($('#coverCont img').length == 0) {
coverCont.appendChild(document.createElement('img'))
}
$('#coverCont img')[0].src = image ? image : '/static/common/noartwork/music.png'
coverCont.style.display = 'block'
coverListener = mevent => {
let wh = window.innerHeight, ch = coverCont.clientHeight, ph = mevent.clientY
let pos = (ph < wh / 2) ? ((ph + ch + 10 > wh) ? wh - ch : ph + 10) : ((ph - ch - 10 < 0) ? 0 : ph - ch - 10)
coverCont.style.top = pos + 'px'
if (mevent.clientX > window.innerWidth / 2) {
coverCont.style.left = "initial"
coverCont.style.right = window.innerWidth - mevent.clientX + 10 + "px"
} else {
coverCont.style.left = mevent.clientX + 10 + "px"
coverCont.style.right = "initial"
}
}
document.addEventListener("mousemove", coverListener)
//Preload next image
if ($('.torrent_table, .request_table').length > 0) {
var as = $('[data-cover]')
var a = event.target
preload((as[as.toArray().indexOf(a) + 1] || as[0]).attributes['data-cover'].value)
preload((as[as.toArray().indexOf(a) - 1] || as[0]).attributes['data-cover'].value)
}
}
function ungetCover(event) {
$('#coverCont img').remove()
coverCont.style.display = 'none'
document.removeEventListener("mousemove", coverListener)
}
// Apparently firefox doesn't implement NodeList.forEach until FF50
// Remove this shim after that's stable for a while
if (typeof NodeList.prototype.forEach !== 'function') {
NodeList.prototype.forEach = Array.prototype.forEach
}
$(function () {
document.querySelectorAll('[data-toggle-target]').forEach(function (el) {
el.addEventListener('click', function (event) {
$(el.attributes['data-toggle-target'].value).gtoggle()
if (el.attributes['data-toggle-replace']) {
[el.innerHTML, el.attributes['data-toggle-replace'].value] = [el.attributes['data-toggle-replace'].value, el.innerHTML]
}
})
})
$(document).on('mouseover', '[data-cover]', getCover)
$(document).on('mouseleave', '[data-cover]', ungetCover)
$(document).on('click', '.lightbox-init', function (e) {
lightbox.init((e.target.attributes['lightbox-img'] || []).value || e.target.src, (e.target.attributes['lightbox-size'] || []).value || e.target.width)
})
})
/**
* jQuery tooltips
* Replaces Tooltipster
* @see https://jqueryui.com/tooltip/
*/
$(function () {
$(document).tooltip();
});