1457 lines
55 KiB
JavaScript
1457 lines
55 KiB
JavaScript
function escapeHTML(str) {
|
|
return str.replace(/[&<>"'`=\/]/g, function(s) {
|
|
return {
|
|
'&': '&',
|
|
'<': '<',
|
|
'>': '>',
|
|
'"': '"',
|
|
"'": ''',
|
|
'/': '/',
|
|
'`': '`',
|
|
'=': '='
|
|
}[s];
|
|
});
|
|
}
|
|
|
|
class API {
|
|
static request(post, base, method, params, callback) {
|
|
$.ajax({
|
|
url: '/api/' + base + '/' + method,
|
|
method: post ? 'POST' : 'GET',
|
|
data: params,
|
|
success: cb => {
|
|
if(cb.error === 'null')
|
|
callback(true, null, cb.warnings, cb);
|
|
else
|
|
callback(false, this.responsify(cb.error), cb.warnings, cb);
|
|
},
|
|
error: cb => callback(false, null, null, cb)
|
|
});
|
|
}
|
|
static responsify(response) {
|
|
var r = (type, text) => ({type: type, text: text});
|
|
return {
|
|
not_logged_in: r('error', 'Not logged in (✖╭╮✖)'),
|
|
invalid_request: r('error', 'Invalid request 【ツ】'),
|
|
video_not_found: r('error', 'Video not found. Perhaps it has already been deleted'),
|
|
insufficient_permissions: r('error', 'Insufficient permissions ┌∩┐(◣_◢)┌∩┐'),
|
|
no_tags_specified: r('error', 'No tags specified')
|
|
}[response];
|
|
}
|
|
}
|
|
|
|
class Video {
|
|
constructor() {
|
|
let match = location.href.match(/(\d+)(?!.*\/.)/);
|
|
if(!match) return;
|
|
this.id = match[1];
|
|
this.user = $('.fa-info-circle').next().children().text().trim();
|
|
this.tags = $.makeArray($('#tag-display').children().children()).map(el => el.innerText).filter(tag => !!tag);
|
|
this.api = 'video';
|
|
this.apiBase = this.api + '/' + this.id;
|
|
}
|
|
tag(tags, callback) {
|
|
var _this = this;
|
|
function preCallback(success, error, warnings, cb) {
|
|
if(success) {
|
|
_this.tags = [];
|
|
_this.tags = cb.tags.map(tag => tag.name);
|
|
}
|
|
callback(success, error, warnings, cb);
|
|
}
|
|
tags.length ? API.request(true, this.apiBase, 'tag', {tags: tags}, preCallback) : callback(false, API.responsify('no_tags_specified'), null, null);
|
|
}
|
|
untag(tag, callback) {
|
|
var _this = this;
|
|
function preCallback(success, error, warnings, cb) {
|
|
if(success) {
|
|
_this.tags = [];
|
|
_this.tags = cb.tags.map(tag => tag.name);
|
|
}
|
|
callback(success, error, warnings, cb);
|
|
}
|
|
tag = tag.trim();
|
|
!!tag ? API.request(true, this.apiBase, 'untag', {tag: tag}, preCallback) : callback(false, API.responsify('invalid_request'), null, null);
|
|
}
|
|
delete(reason, callback) {
|
|
reason = reason.trim();
|
|
!!reason ? API.request(true, this.apiBase, 'delete', {reason: reason}, callback) : callback(false, API.responsify('invalid_request'), null, null);
|
|
}
|
|
}
|
|
|
|
var video;
|
|
$(function() {
|
|
video = new Video();
|
|
if(!video.id) video = null;
|
|
});
|
|
|
|
//CSRF Token AjaxSetup
|
|
$(function() {
|
|
$.ajaxSetup({
|
|
headers: {
|
|
'X-CSRF-TOKEN': $('meta[name="_token"]').attr('content')
|
|
}
|
|
});
|
|
});
|
|
|
|
function flash(type, message) {
|
|
var html = '<div class="alert alert-:TYPE: alert-dismissable" role="alert"><button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>:REPLACE:</div>';
|
|
var alerts = $('.flashcontainer > .flash-inner');
|
|
if(type === 'error') type = 'danger';
|
|
alerts.append(html.replace(/:TYPE:/, type).replace(/:REPLACE:/, message));
|
|
alertrm(jQuery);
|
|
}
|
|
|
|
window.requestAnimFrame = (function(){
|
|
return window.requestAnimationFrame
|
|
|| window.webkitRequestAnimationFrame
|
|
|| window.mozRequestAnimationFrame
|
|
|| function(callback) { window.setTimeout(callback, 1000 / 60);};
|
|
})();
|
|
|
|
Array.prototype.average = function() {
|
|
var sum = 0;
|
|
for(var i = 0; i < this.length; i++)
|
|
sum += this[i];
|
|
return sum / this.length;
|
|
};
|
|
|
|
var videoElem = document.getElementById('video');
|
|
if(videoElem !== null) {
|
|
if($.browser.mobile) {
|
|
let src_split = document.querySelector("video > source:first-child").src.split("/");
|
|
src_split = src_split[src_split.length - 1];
|
|
videoElem.setAttribute("poster", "//w0bm.com/thumbs/" + src_split.replace(".webm", ".gif"));
|
|
}
|
|
var player = videojs(videoElem, {
|
|
controls: true,
|
|
autoplay: true,
|
|
playbackRates: [0.25, 0.5, 1, 1.5, 2],
|
|
inactivityTimeout: 1000,
|
|
controlBar: {
|
|
children: {
|
|
'progressControl': {},
|
|
'playToggle': {},
|
|
'MuteToggle': {},
|
|
'volumeControl': {},
|
|
'currentTimeDisplay': {},
|
|
'timeDivider': {},
|
|
'durationDisplay': {},
|
|
'CustomControlSpacer': {},
|
|
'playbackRateMenuButton': {},
|
|
'fullscreenToggle': {}
|
|
}
|
|
}
|
|
}, function() {
|
|
this.addClass('video-js');
|
|
this.volume(0.3);
|
|
this.muted(false);
|
|
if (typeof localStorage != "undefined") {
|
|
this.volume(Math.abs(localStorage.getItem("volume") || 0.3));
|
|
// 1/x to detect the special case of -0 for saving volume level 0 and the mute button being activated
|
|
this.muted(0 > 1/(localStorage.getItem("volume") || 0.3));
|
|
this.on("volumechange", function () {
|
|
localStorage.setItem("volume", (this.volume() * (this.muted() ? -1 : 1)));
|
|
});
|
|
}
|
|
});
|
|
|
|
//player.on('mouseout', function(){ this.userActive(false) });
|
|
|
|
//videojs fix for firefox
|
|
if(player.autoplay() && !player.paused() && player.hasClass('vjs-paused')) {
|
|
player.pause();
|
|
player.play();
|
|
}
|
|
|
|
if($.browser.mobile) {
|
|
document.addEventListener("fullscreenerror", function(e) {
|
|
console.error("Fullscreen denied", JSON.stringify(e));
|
|
});
|
|
window.screen.orientation.onchange = function() {
|
|
if(this.type.startsWith("landscape"))
|
|
player.requestFullscreen();
|
|
else
|
|
player.exitFullscreen();
|
|
if(!document.fullscreenElement)
|
|
console.error("No fullscreen after request");
|
|
};
|
|
}
|
|
|
|
if(localStorage.getItem('background') == undefined) {
|
|
if($.browser.mobile)
|
|
localStorage.setItem('background', 'false');
|
|
else
|
|
localStorage.setItem('background', 'true');
|
|
}
|
|
var background = localStorage.getItem('background') === 'true';
|
|
|
|
var canvas = document.getElementById('bg');
|
|
var context = canvas.getContext('2d');
|
|
var cw = canvas.width = canvas.clientWidth | 0;
|
|
var ch = canvas.height = canvas.clientHeight | 0;
|
|
|
|
if(!background)
|
|
$(canvas).css('display', 'none');
|
|
|
|
function animationLoop() {
|
|
if(videoElem.paused || videoElem.ended || !background)
|
|
return;
|
|
context.drawImage(videoElem, 0, 0, cw, ch);
|
|
window.requestAnimFrame(animationLoop);
|
|
}
|
|
|
|
videoElem.addEventListener('play', animationLoop);
|
|
|
|
$('#togglebg').on('click', function (e) {
|
|
e.preventDefault();
|
|
background = !background;
|
|
localStorage.setItem('background', background.toString());
|
|
if(background)
|
|
$(canvas).css('display', 'block');
|
|
else
|
|
$(canvas).css('display', 'none');
|
|
animationLoop();
|
|
});
|
|
|
|
|
|
function getNext() {
|
|
var next = $('#next');
|
|
if(next.css('visibility') != 'hidden') {
|
|
next.get(0).click();
|
|
}
|
|
}
|
|
|
|
function getPrev() {
|
|
var prev = $('#prev');
|
|
if(prev.css('visibility') != 'hidden') {
|
|
prev.get(0).click();
|
|
}
|
|
}
|
|
|
|
//Key Bindings
|
|
$(document).on('keydown', function(e) {
|
|
if(e.defaultPrevented || e.target.nodeName.match(/\b(input|textarea)\b/i) || e.ctrlKey || e.altKey || e.shiftKey)
|
|
return;
|
|
|
|
//arrow keys
|
|
else if(e.keyCode == 39)
|
|
getNext();
|
|
else if(e.keyCode == 37)
|
|
getPrev();
|
|
|
|
//gamer-style
|
|
else if(e.keyCode == 65)
|
|
getPrev();
|
|
else if(e.keyCode == 68)
|
|
getNext();
|
|
|
|
//vi style
|
|
else if(e.keyCode == 72)
|
|
getPrev();
|
|
else if(e.keyCode == 76)
|
|
getNext();
|
|
|
|
else if(e.keyCode == 82) //click random
|
|
$('#prev').next().get(0).click();
|
|
|
|
else if(e.keyCode == 70) //add fav
|
|
$('#fav').get(0).click();
|
|
|
|
else if(e.keyCode == 67) //toggle comments
|
|
$(".aside").fadeToggle(localStorage.comments = !(localStorage.comments == "true"));
|
|
|
|
else if(e.keyCode == 87 || e.keyCode == 38)
|
|
player.volume(player.volume() + 0.1);
|
|
|
|
else if(e.keyCode == 83 || e.keyCode == 40)
|
|
player.volume(player.volume() - 0.1);
|
|
|
|
else if(e.keyCode == 32)
|
|
player.paused() ? player.play() : player.pause();
|
|
});
|
|
|
|
$('.wrapper > div:not(.aside)').on('wheel', function(e) {
|
|
if(e.ctrlKey || e.altKey || e.shiftKey)
|
|
return;
|
|
e.preventDefault();
|
|
e.originalEvent.deltaY > 0 ? getNext() : getPrev();
|
|
});
|
|
} else {
|
|
var canvas = document.getElementById('bg');
|
|
canvas.parentNode.removeChild(canvas);
|
|
}
|
|
|
|
function commentClickableTimestamp(e) {
|
|
e.preventDefault();
|
|
if(!player) return;
|
|
var match = $(e.target).text().match(/(\d{1,2}):(\d{2})/);
|
|
if(match) {
|
|
var seek = parseInt(match[1]) * 60 + parseInt(match[2]);
|
|
if(seek <= player.duration()) player.currentTime(seek);
|
|
}
|
|
}
|
|
|
|
|
|
$(function() {
|
|
$('.comment_clickable_timestamp').on('click', commentClickableTimestamp);
|
|
});
|
|
|
|
|
|
(function ($) {
|
|
// Comments
|
|
var commentform = $('#commentForm > form');
|
|
let lastComment = "";
|
|
commentform.on('submit', function (e) {
|
|
e.preventDefault();
|
|
|
|
// double comment prevention:
|
|
const data = commentform.serialize();
|
|
if (data == lastComment) {
|
|
alert("nope. just don't. seriously... don't.");
|
|
return false;
|
|
}
|
|
lastComment = data;
|
|
|
|
$.ajax({
|
|
type: 'POST',
|
|
url: commentform.attr('action'),
|
|
data: data
|
|
}).done(function (data) {
|
|
$('.nocomments').remove();
|
|
var comment = $(data).appendTo('.commentwrapper').find('time.timeago');
|
|
comment.timeago();
|
|
comment.tooltip();
|
|
comment.closest('.panel-footer').siblings('.panel-body').find('.comment_clickable_timestamp').on('click', commentClickableTimestamp);
|
|
var textarea = commentform.find('textarea').val('');
|
|
textarea.blur();
|
|
}).fail(function(){
|
|
flash('error', 'Error saving comment');
|
|
});
|
|
});
|
|
|
|
//Tags
|
|
let tagsinput = $('#tags'),
|
|
submit = $('#submittags'),
|
|
tagdisplay = $('#tag-display');
|
|
|
|
function tagmd() {
|
|
let elReplace = (el, regex, fn) => el.innerHTML = el.innerHTML.replace(regex, fn);
|
|
tagdisplay.children().children(':first-of-type').each((i, el) => {
|
|
elReplace(el, /^nsfw$/i, x => '<span style="color: red;">' + x + '</span>');
|
|
elReplace(el, /^sfw$/i, x => '<span style="color: #23ff00;">' + x + '</span>');
|
|
});
|
|
}
|
|
tagmd();
|
|
|
|
function tagDeleteHandler(e) {
|
|
e.preventDefault();
|
|
if(!confirm('Do you really want to delete this tag?')) return;
|
|
video.untag($(this).siblings().text(), (success, error, warnings, cb) => {
|
|
if(success) {
|
|
flash('success', 'Tag successfully deleted');
|
|
let tags = [];
|
|
for(let tag of cb.tags)
|
|
tags.push('<span class="label label-default"><a href="/index?q=' + tag.normalized + '" class="default-link">' + escapeHTML(tag.name) + '</a> <a class="delete-tag default-link" href="#"><i class="fa fa-times"></i></a></span>');
|
|
tagdisplay.empty();
|
|
tagdisplay.append(tags.join(" "));
|
|
$('.delete-tag').on('click', tagDeleteHandler);
|
|
tagmd();
|
|
}
|
|
else
|
|
flash('error', 'Error deleting tag');
|
|
});
|
|
}
|
|
|
|
$('.delete-tag').on('click', tagDeleteHandler);
|
|
|
|
$('#tags, #filter, #tags_upload').on('itemAdded', e => setTimeout(() => $(e.currentTarget).siblings('.bootstrap-tagsinput').children('input').val(''), 0));
|
|
|
|
tagsinput.on('beforeItemAdd', e => {
|
|
for(let tag of video.tags) {
|
|
if(tag.toLowerCase() === e.item.toLowerCase()) {
|
|
e.cancel = true;
|
|
flash('info', 'Tag already exists');
|
|
return;
|
|
}
|
|
}
|
|
});
|
|
submit.on('click touchdown', e => {
|
|
e.preventDefault();
|
|
video.tag(tagsinput.tagsinput('items'), (success, error, warnings, cb) => {
|
|
if(success) {
|
|
$('#tag-add-toggle').prop('checked', false);
|
|
var tags = [];
|
|
for(let tag of cb.tags)
|
|
tags.push('<span class="label label-default"><a href="/index?q=' + tag.normalized + '" class="default-link">' + escapeHTML(tag.name) + '</a>' + (cb.can_edit_video ? ' <a class="delete-tag default-link" href="#"><i class="fa fa-times"></i></a>' : '') + '</span>');
|
|
tagdisplay.empty();
|
|
tagdisplay.append(tags.join(" "));
|
|
tagsinput.tagsinput('removeAll');
|
|
$('.delete-tag').on('click', tagDeleteHandler);
|
|
tagmd();
|
|
}
|
|
else
|
|
flash('error', 'Error saving tag(s)');
|
|
});
|
|
});
|
|
|
|
// Filter
|
|
var filter = $('#filter'),
|
|
submitfilter = $('#submitfilter');
|
|
submitfilter.on('click touchdown', function(e) {
|
|
e.preventDefault();
|
|
$.ajax({
|
|
type: 'POST',
|
|
url: submitfilter.attr('href'),
|
|
data: filter.serialize()
|
|
}).done(function() {
|
|
flash('success', 'Filter successfully updated');
|
|
$('#filterselectmodal').modal('hide');
|
|
}).fail(function(data) {
|
|
flash('error', 'Error updating filter');
|
|
});
|
|
});
|
|
})(jQuery);
|
|
|
|
(function ($) {
|
|
function updaterow(ctx, video) {
|
|
if($('video').length) {
|
|
var info = [];
|
|
if(video.interpret) {
|
|
info.push(' <strong>Artist:</strong> ' + video.interpret);
|
|
}
|
|
if(video.songtitle) {
|
|
info.push(' <strong>Songtitle:</strong> ' + video.songtitle);
|
|
}
|
|
if(video.imgsource) {
|
|
info.push(' <strong>Video Source:</strong> ' + video.imgsource);
|
|
}
|
|
if(video.category.name) {
|
|
info.push(' <strong>Category:</strong> ' + video.category.name);
|
|
}
|
|
$('span.fa-info-circle').attr('data-content', info.join('<br>'));
|
|
}
|
|
else {
|
|
var row = ctx.parents('tr');
|
|
row.find('span').show();
|
|
row.find('input, select').hide();
|
|
row.find('.vinterpret').html(video.interpret || '');
|
|
row.find('.vsongtitle').html(video.songtitle || '');
|
|
row.find('.vimgsource').html(video.imgsource || '');
|
|
row.find('.vcategory').html('<a href="/' + video.category.shortname + '">' + video.category.name + '</a>');
|
|
}
|
|
}
|
|
|
|
var indexform = $('.indexform, #webmedit');
|
|
$('.indexedit').find('input, select').hide();
|
|
if(indexform.length) {
|
|
var row = $('tr');
|
|
row.on('dblclick touchdown', function(e) {
|
|
var self = $(this);
|
|
self.find('input, select').show();
|
|
self.find('span').hide();
|
|
});
|
|
}
|
|
indexform.on('submit', function (e) {
|
|
var self = $(this);
|
|
e.preventDefault();
|
|
$.ajax({
|
|
type: 'POST',
|
|
url: self.attr('action'),
|
|
data: self.serialize()
|
|
}).done(function (data) {
|
|
flash('success', 'Video successfully updated');
|
|
updaterow(self, data);
|
|
self.find('#webmeditmodal').modal('hide');
|
|
}).fail(function(){
|
|
flash('error', 'Error updating video');
|
|
self.find('#webmeditmodal').modal('hide');
|
|
});
|
|
});
|
|
})(jQuery);
|
|
|
|
|
|
(function ($) {
|
|
var favBtn = $('#fav');
|
|
favBtn.on('click touchdown', function (e) {
|
|
e.preventDefault();
|
|
$.ajax({
|
|
type: 'GET',
|
|
url: favBtn.attr('href')
|
|
}).done(function () {
|
|
var icon = favBtn.find('i');
|
|
if(icon.hasClass('fa-heart-o')) {
|
|
icon.removeClass('fa-heart-o');
|
|
icon.addClass('fa-heart');
|
|
} else {
|
|
icon.removeClass('fa-heart');
|
|
icon.addClass('fa-heart-o');
|
|
}
|
|
});
|
|
})
|
|
})(jQuery);
|
|
|
|
(function ($) {
|
|
$('#togglebg').on('click touchdown', function (e) {
|
|
e.preventDefault();
|
|
$.ajax({
|
|
dataType: 'json',
|
|
url: $(this).attr('href'),
|
|
data: {}
|
|
}).done(function () {
|
|
$('#bg').toggle();
|
|
});
|
|
});
|
|
})(jQuery);
|
|
|
|
(function ($) {
|
|
$(':not(form)[data-confirm]').on('click touchdown', function () {
|
|
return confirm($(this).data('confirm'));
|
|
});
|
|
})(jQuery);
|
|
|
|
// Komische Scrollbar lol (wird eh nicht mehr genutzt, so seit 3 Jahren xD
|
|
/*(function ($) {
|
|
$("").mCustomScrollbar({
|
|
axis: 'y',
|
|
theme: 'minimal',
|
|
scrollInertia: 0
|
|
});
|
|
})(jQuery);*/
|
|
|
|
var alertrm = function ($) {
|
|
$('.alert').each(function (index) {
|
|
$(this).delay(3000 + index * 1000).slideUp(300, function() { $(this).remove(); });
|
|
});
|
|
};
|
|
alertrm(jQuery);
|
|
|
|
// this added a nice looking effect to how the tems would load up and display on the page, sadly the items are positioned elements with this script
|
|
// which makes it not so nice to work it. sry belst :D
|
|
// $('#categories').imagesLoaded(function () {
|
|
// $('#categories').isotope({
|
|
// itemSelector: '.category',
|
|
// percentPosition: true,
|
|
// layoutMode: 'masonry'
|
|
// });
|
|
// });
|
|
|
|
$(function() {
|
|
$('[data-toggle="popover"]').popover({
|
|
trigger: 'manual',
|
|
container: $(this).attr('id'),
|
|
placement: 'top',
|
|
}).on('mouseenter', function () {
|
|
var _this = this;
|
|
$(this).popover('show');
|
|
$(this).siblings('.popover').on('mouseleave', function () {
|
|
$(_this).popover('hide');
|
|
});
|
|
}).on('mouseleave', function () {
|
|
var _this = this;
|
|
setTimeout(function () {
|
|
if (!$('.popover:hover').length) {
|
|
$(_this).popover('hide')
|
|
}
|
|
}, 100);
|
|
});
|
|
});
|
|
|
|
// kadse :D greetz gz
|
|
(function() {
|
|
new Image().src = "/images/catfart/cutf.png";
|
|
var n = document.createElement("div");
|
|
var a = new Audio();
|
|
|
|
a.addEventListener("pause", function () {
|
|
n.setAttribute("class", "catfart");
|
|
});
|
|
|
|
a.addEventListener("play", function () {
|
|
n.setAttribute("class", "catfart farting");
|
|
});
|
|
|
|
n.addEventListener("mouseover", function () {
|
|
if (!a.paused) return;
|
|
a.src = "/images/catfart/pupsi" + (Math.random()*28|0) + ".mp3";
|
|
a.play();
|
|
});
|
|
|
|
n.setAttribute("class", "catfart");
|
|
document.body.appendChild(n);
|
|
})();
|
|
|
|
(function() {
|
|
var v = document.getElementById("video");
|
|
if (v == null) return;
|
|
var p = v.parentNode;
|
|
p.style.marginBottom = "3px";
|
|
|
|
var bar = document.createElement("div");
|
|
var outerBar = document.createElement("div");
|
|
outerBar.appendChild(bar);
|
|
p.appendChild(outerBar);
|
|
|
|
$(outerBar).css({
|
|
height: "3px", width: "100%",
|
|
overflow: "hidden", willChange: "transform",
|
|
position: "absolute", bottom: "0"
|
|
});
|
|
|
|
$(bar).css({
|
|
height: "inherit", width: "inherit",
|
|
position: "absolute", transform: "translateX(-100%)",
|
|
backgroundColor: "rgba(31, 178, 176, 0.4)"
|
|
});
|
|
|
|
var update = function () {
|
|
requestAnimationFrame(update);
|
|
if (v.paused) return;
|
|
var perc = 100 / v.duration * v.currentTime;
|
|
bar.style.transform = "translateX("+(-100 + perc)+"%)";
|
|
};
|
|
update();
|
|
})();
|
|
|
|
|
|
(function($) {
|
|
var comments = localStorage.comments;
|
|
if (comments === undefined) localStorage.comments = true;
|
|
comments = comments === undefined || comments === "true";
|
|
$(".aside").toggle(comments);
|
|
$("#toggle").click(function(){$(".aside").fadeToggle(localStorage.comments = !(localStorage.comments == "true"))});
|
|
})(jQuery);
|
|
|
|
|
|
$(function() {
|
|
function get_loc(e) {
|
|
return [
|
|
(e.clientX + $('div#thumb').width() >= $(window).width() - 10) ? e.pageX - 5 - $('div#thumb').width() : e.pageX + 5,
|
|
(e.clientY + $('div#thumb').height() >= $(window).height() - 10) ? e.pageY - 5 - $('div#thumb').height() : e.pageY + 5
|
|
];
|
|
}
|
|
|
|
$('[data-thumb]').on('mouseenter', function(e) {
|
|
var id = $(this).data('thumb');
|
|
var lnk = '/thumbs/' + id + '.gif';
|
|
var loc = get_loc(e);
|
|
$(document.body).prepend('<div id="thumb"></div>');
|
|
$('div#thumb').prepend('<img id="thumb"/>');
|
|
$('img#thumb').text('Loading...');
|
|
$('div#thumb').css({
|
|
'position': 'absolute',
|
|
'left': loc[0],
|
|
'top': loc[1],
|
|
'z-index': '5',
|
|
'border': '1px white solid',
|
|
'box-shadow': '5px 5px 7px 0px rgba(0,0,0,0.75)',
|
|
'color': 'white',
|
|
'background-color': '#181818'
|
|
});
|
|
var img = $('img#thumb');
|
|
var thumb = $('<img/>');
|
|
thumb.load(function() {
|
|
img.attr("src", $(this).attr("src"));
|
|
loc = get_loc(e);
|
|
$('div#thumb').css({
|
|
'left': loc[0],
|
|
'top': loc[1]
|
|
});
|
|
});
|
|
thumb.attr("src", lnk);
|
|
}).on('mousemove', function(e) {
|
|
$('div#thumb').css({
|
|
'left': get_loc(e)[0],
|
|
'top': get_loc(e)[1]
|
|
});
|
|
}).on('mouseleave', function() {
|
|
$('#thumb').remove();
|
|
});
|
|
});
|
|
|
|
//Pagination
|
|
var paginate = function(pagination, options) {
|
|
var type = options.hash.type || 'middle';
|
|
var ret = '';
|
|
var pageCount = Number(pagination.pageCount);
|
|
var page = Number(pagination.page);
|
|
var limit;
|
|
if (options.hash.limit) limit = +options.hash.limit;
|
|
//page pageCount
|
|
var newContext = {};
|
|
switch (type) {
|
|
case 'middle':
|
|
if (typeof limit === 'number') {
|
|
var i = 0;
|
|
var leftCount = Math.ceil(limit / 2) - 1;
|
|
var rightCount = limit - leftCount - 1;
|
|
if (page + rightCount > pageCount)
|
|
leftCount = limit - (pageCount - page) - 1;
|
|
if (page - leftCount < 1)
|
|
leftCount = page - 1;
|
|
var start = page - leftCount;
|
|
while (i < limit && i < pageCount) {
|
|
newContext = { n: start };
|
|
if (start === page) newContext.active = true;
|
|
ret = ret + options.fn(newContext);
|
|
start++;
|
|
i++;
|
|
}
|
|
}
|
|
else {
|
|
for (var i = 1; i <= pageCount; i++) {
|
|
newContext = { n: i };
|
|
if (i === page) newContext.active = true;
|
|
ret = ret + options.fn(newContext);
|
|
}
|
|
}
|
|
break;
|
|
case 'previous':
|
|
if (page === 1) {
|
|
newContext = { disabled: true, n: 1 }
|
|
}
|
|
else {
|
|
newContext = { n: page - 1 }
|
|
}
|
|
ret = ret + options.fn(newContext);
|
|
break;
|
|
case 'next':
|
|
newContext = {};
|
|
if (page === pageCount) {
|
|
newContext = { disabled: true, n: pageCount }
|
|
}
|
|
else {
|
|
newContext = { n: page + 1 }
|
|
}
|
|
ret = ret + options.fn(newContext);
|
|
break;
|
|
case 'first':
|
|
if (page === 1) {
|
|
newContext = { disabled: true, n: 1 }
|
|
}
|
|
else {
|
|
newContext = { n: 1 }
|
|
}
|
|
ret = ret + options.fn(newContext);
|
|
break;
|
|
case 'last':
|
|
if (page === pageCount) {
|
|
newContext = { disabled: true, n: pageCount }
|
|
}
|
|
else {
|
|
newContext = { n: pageCount }
|
|
}
|
|
ret = ret + options.fn(newContext);
|
|
break;
|
|
}
|
|
return ret;
|
|
};
|
|
|
|
|
|
//enable bootstrap tooltips and timeago
|
|
$(function () {
|
|
var s = $.timeago.settings;
|
|
var str = s.strings;
|
|
s.refreshMillis = 1000;
|
|
s.allowFuture = true;
|
|
s.localeTitle = true;
|
|
//same format as laravel diffForHumans()
|
|
str.seconds = "%d seconds";
|
|
str.minute = "1 minute";
|
|
str.hour = "1 hour";
|
|
str.hours = "%d hours";
|
|
str.day = "1 day";
|
|
str.month = "1 month";
|
|
str.year = "1 year";
|
|
str.suffixFromNow = null;
|
|
$('time.timeago').timeago();
|
|
$('[data-toggle="tooltip"]').tooltip();
|
|
});
|
|
|
|
// Notifications
|
|
var messagesBadge = $('ul.navbar-right > li > a > span.badge');
|
|
var activeMessage;
|
|
if(messagesBadge.text() > 0) {
|
|
messagesBadge.css('visibility', 'visible');
|
|
}
|
|
|
|
if(/\/user\/.+\/comments/i.test(location.href)) {
|
|
//Comment View
|
|
(function($) {
|
|
if(typeof Handlebars == "undefined") return; // only on profilelayout
|
|
|
|
Handlebars.registerHelper('paginate', paginate);
|
|
|
|
var comlist = Handlebars.compile($('#comlist').html());
|
|
var pagination = Handlebars.compile($('#paginationtmpl').html());
|
|
var jsondata = {};
|
|
var username = location.href.match(/\/user\/(.+)\/comments/i)[1];
|
|
|
|
var getMessages = function(url) {
|
|
var baseUrl = '/api/comments';
|
|
if(!url) url = baseUrl;
|
|
|
|
$.getJSON(url, { 'username': username })
|
|
.done(function(data) {
|
|
$('.spinner').hide();
|
|
jsondata = data;
|
|
$('#list').html(comlist(data));
|
|
$('time.timeago').timeago();
|
|
$('time[data-toggle="tooltip"]').tooltip();
|
|
var page = {
|
|
pagination: {
|
|
page: data.current_page,
|
|
pageCount: data.last_page
|
|
}
|
|
};
|
|
|
|
$('#pagination').html(pagination(page));
|
|
|
|
$('#pagination a').on('click touchdown', function(e) {
|
|
e.preventDefault();
|
|
getMessages(baseUrl + '?page=' + $(this).data('page'));
|
|
});
|
|
});
|
|
};
|
|
getMessages();
|
|
})(jQuery);
|
|
}
|
|
else {
|
|
(function($) {
|
|
if(typeof Handlebars == "undefined" || !$('#msglist').length) return; // only on profilelayout
|
|
|
|
Handlebars.registerHelper('paginate', paginate);
|
|
|
|
|
|
var msglist = Handlebars.compile($('#msglist').html());
|
|
var msgtmpl = Handlebars.compile($('#msgtmpl').html());
|
|
var pagination = Handlebars.compile($('#paginationtmpl').html());
|
|
var jsondata = {};
|
|
|
|
var getMessages = function(url) {
|
|
var baseUrl = '/api/messages';
|
|
if(!url) url = baseUrl;
|
|
|
|
$.getJSON(url)
|
|
.done(function(data) {
|
|
$('.spinner').hide();
|
|
jsondata = data;
|
|
$('#list').html(msglist(data));
|
|
if(typeof activeMessage != "undefined") $('#listitems a[data-id="' + activeMessage + '"]').addClass('active');
|
|
|
|
var page = {
|
|
pagination: {
|
|
page: data.current_page,
|
|
pageCount: data.last_page
|
|
}
|
|
};
|
|
|
|
$('#pagination').html(pagination(page));
|
|
|
|
$('#pagination a').on('click touchdown', function(e) {
|
|
e.preventDefault();
|
|
getMessages(baseUrl + '?page=' + $(this).data('page'));
|
|
});
|
|
|
|
$('#listitems a').on('click touchdown', function(e) {
|
|
e.preventDefault();
|
|
var self = $(this);
|
|
var i = self.data('index');
|
|
activeMessage = $(this).data('id');
|
|
|
|
$('#message').html(msgtmpl(jsondata.data[i]));
|
|
if(!jsondata.data[i].read) {
|
|
|
|
$.post('/api/messages/read','m_ids[]=' + self.data('id'))
|
|
.done(function(data) {
|
|
self.removeClass('list-group-item-info');
|
|
messagesBadge.text(messagesBadge.text() - 1);
|
|
if(messagesBadge.text() <= 0) {
|
|
messagesBadge.css('visibility', 'hidden');
|
|
}
|
|
});
|
|
|
|
}
|
|
$('a').removeClass('active');
|
|
self.addClass('active');
|
|
$('time.timeago').timeago();
|
|
$('time[data-toggle="tooltip"]').tooltip();
|
|
});
|
|
});
|
|
};
|
|
getMessages();
|
|
})(jQuery);
|
|
}
|
|
|
|
function readAll() {
|
|
$.ajax({
|
|
url: '/api/messages/readall',
|
|
success: function(data) {
|
|
if(data == 1) {
|
|
flash('success', 'Marked all messages as read');
|
|
$('.list-group-item-info').removeClass('list-group-item-info');
|
|
messagesBadge.text('0');
|
|
messagesBadge.css('visibility', 'hidden');
|
|
}
|
|
else {
|
|
flash('error', 'Failed to mark all messages as read');
|
|
}
|
|
},
|
|
error: function(jqxhr, status, error) {
|
|
flash('error', 'Failed to mark all messages as read');
|
|
}
|
|
});
|
|
}
|
|
|
|
$('ul.dropdown-menu').on('click touchdown', function(e) {
|
|
e.stopPropagation();
|
|
});
|
|
|
|
function deleteComment(self) {
|
|
var comment = self.closest('div[data-id]');
|
|
var id = comment.data('id');
|
|
var username = $(comment.children('.panel-footer').children('a')[0]).text();
|
|
do {
|
|
var reason = prompt('Reason for deleting comment ' + id + ' by ' + username);
|
|
if(reason === null)
|
|
return;
|
|
reason = reason.trim();
|
|
} while(!reason);
|
|
$.ajax({
|
|
url: '/api/comments/' + id + '/delete',
|
|
method: 'POST',
|
|
data: { reason: reason },
|
|
success: function(retval) {
|
|
if(retval == 'success') {
|
|
flash('success', 'Comment deleted');
|
|
comment.removeClass('panel-default').addClass('panel-danger');
|
|
comment.find('.panel-footer').children('a[onclick="deleteComment($(this))"]').replaceWith('<a href="#" onclick="restoreComment($(this))"><i style="color:green"; class="fa fa-refresh" aria-hidden="true"></i></a>');
|
|
comment.find('.panel-footer > a[onclick="editComment($(this))"]').remove();
|
|
}
|
|
else if(retval == 'invalid_request') flash('error', 'Invalid request');
|
|
else if(retval == 'not_logged_in') flash('error', 'Not logged in');
|
|
else if(retval == 'insufficient_permissions') flash('error', 'Insufficient permissions');
|
|
else flash('error', 'Error deleting comment');
|
|
},
|
|
error: function(jqxhr, status, error) {
|
|
flash('error', 'Error deleting comment');
|
|
}
|
|
});
|
|
}
|
|
|
|
function restoreComment(self) {
|
|
var comment = self.closest('div[data-id]');
|
|
var id = comment.data('id');
|
|
var username = $(comment.children('.panel-footer').children('a')[0]).text();
|
|
do {
|
|
var reason = prompt('Reason for restoring comment ' + id + ' by ' + username);
|
|
if(reason === null)
|
|
return;
|
|
reason = reason.trim();
|
|
} while(!reason);
|
|
$.ajax({
|
|
url: '/api/comments/' + id + '/restore',
|
|
method: 'POST',
|
|
data: { reason: reason },
|
|
success: function(retval) {
|
|
if(retval == 'success') {
|
|
flash('success', 'Comment restored');
|
|
comment.removeClass('panel-danger').addClass('panel-default');
|
|
comment.find('.panel-footer').children('a[onclick]').replaceWith('<a href="#" onclick="deleteComment($(this))"><i style="color:red"; class="fa fa-times" aria-hidden="true"></i></a> <a href="#" onclick="editComment($(this))"><i style="color:cyan;" class="fa fa-pencil-square" aria-hidden="true"></i></a>');
|
|
}
|
|
else if(retval == 'invalid_request') flash('error', 'Invalid request');
|
|
else if(retval == 'not_logged_in') flash('error', 'Not logged in');
|
|
else if(retval == 'insufficient_permissions') flash('error', 'Insufficient permissions');
|
|
else if(retval == 'comment_not_deleted') flash('error', 'Comment is not deleted');
|
|
else flash('error', 'Error restoring comment');
|
|
},
|
|
error: function(jqxhr, status, error) {
|
|
flash('error', 'Error restoring comment');
|
|
}
|
|
});
|
|
}
|
|
|
|
function editComment(self) {
|
|
var comment = self.closest('div[data-id]');
|
|
var body = comment.find('.panel-body');
|
|
var id = comment.data('id');
|
|
$.ajax({
|
|
url: '/api/comments/' + id,
|
|
success: function(retval) {
|
|
if(retval.error == 'null') {
|
|
var textarea = $('<textarea class="form-control">');
|
|
body.replaceWith(textarea);
|
|
textarea.val($('<div>').html(retval.comment).text());
|
|
self.prev().remove();
|
|
self.replaceWith('<a href="#" class="saveCommentEdit">[save]</a> <a href="#" class="abortCommentEdit">[abort]</a>');
|
|
comment.find('.abortCommentEdit').on('click', function(e) {
|
|
e.preventDefault();
|
|
$(this).prev().remove();
|
|
$(this).replaceWith('<a class="delete_comment" href="#" onclick="deleteComment($(this))">[del]</a> <a class="edit_comment" href="#" onclick="editComment($(this))">[edit]</a>');
|
|
textarea.replaceWith(body);
|
|
});
|
|
comment.find('.saveCommentEdit').on('click', function(e) {
|
|
e.preventDefault();
|
|
var _this = $(this);
|
|
$.ajax({
|
|
url: '/api/comments/' + id + '/edit',
|
|
method: 'POST',
|
|
data: { comment: textarea.val() },
|
|
success: function(retval) {
|
|
if(retval.error == 'null') {
|
|
body.html(retval.rendered_comment);
|
|
flash('success', 'Comment edited successfully');
|
|
body.find('.comment_clickable_timestamp').on('click', commentClickableTimestamp);
|
|
}
|
|
else if(retval.error == 'invalid_request')
|
|
flash('error', 'Invalid request was sent by your browser');
|
|
else if(retval.error == 'not_logged_in')
|
|
flash('error', 'Not logged in');
|
|
else if(retval.error == 'insufficient_permissions')
|
|
flash('error', 'Insufficient permissions');
|
|
else if(retval.error == 'comment_not_found')
|
|
flash('error', 'Comment does not exist');
|
|
else
|
|
flash('error', 'Error editing comment');
|
|
},
|
|
error: function(jqxhr, status, error) {
|
|
flash('error', 'Error editing comment');
|
|
},
|
|
complete: function() {
|
|
textarea.replaceWith(body);
|
|
_this.next().remove();
|
|
_this.replaceWith('<a class="delete_comment" href="#" onclick="deleteComment($(this))">[del]</a> <a class="edit_comment" href="#" onclick="editComment($(this))">[edit]</a>');
|
|
}
|
|
});
|
|
});
|
|
}
|
|
else if(retval.error == 'comment_not_found')
|
|
flash('error', 'Comment does not exist');
|
|
else
|
|
flash('error', 'Error editing comment');
|
|
},
|
|
error: function(jqxhr, status, error) {
|
|
flash('error', 'Failed receiving non-rendered comment from API');
|
|
}
|
|
});
|
|
}
|
|
|
|
/*$(function () {
|
|
var cBar = $('.vjs-control-bar');
|
|
var cBarStatus = false;
|
|
$('video').on('mousemove', function () {
|
|
if(cBarStatus) return;
|
|
cBar.css('display', 'flex');
|
|
cBarStatus = true;
|
|
}).on('mouseleave', function (e) {
|
|
if($(e.relatedTarget).is('[class^="vjs"]') || !cBarStatus) return;
|
|
cBar.hide();
|
|
cBarStatus = false;
|
|
});
|
|
$('[class^="vjs"]').on('mouseleave', function (e) {
|
|
if(e.relatedTarget == $('video').get(0) || $(e.relatedTarget).is('[class^="vjs"]') || !cBarStatus) return;
|
|
cBar.hide();
|
|
cBarStatus = false;
|
|
});
|
|
});*/
|
|
|
|
//upload
|
|
$(function() {
|
|
if(!/\/upload/.test(location.href))
|
|
return;
|
|
var defaultPreview = $('#dragndrop-text').html();
|
|
var defaultDragNDropColor = $('#dragndrop').css('color');
|
|
var defaultDragNDropBorderColor = $('#dragndrop').css('border-left-color');
|
|
var defaultDragNDropBackgroundColor = $('#dragndrop').css('background-color');
|
|
var counter = 0;
|
|
var currentFile;
|
|
var jqXHR;
|
|
var tags = $('#tags_upload');
|
|
var nsfwCheckbox = $('#nsfw');
|
|
function applyDefaultDragNDropCSS() {
|
|
$('#dragndrop').css({
|
|
'color': defaultDragNDropColor,
|
|
'border-color': defaultDragNDropBorderColor,
|
|
'background-color': defaultDragNDropBackgroundColor
|
|
});
|
|
}
|
|
function humanFileSize(size) {
|
|
var i = Math.floor(Math.log(size) / Math.log(1024));
|
|
return (size / Math.pow(1024, i)).toFixed(2) + ' ' + ['B', 'kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'][i];
|
|
}
|
|
function dragndropLinkClickHandler(e) {
|
|
e.preventDefault();
|
|
$('input[type="file"]').trigger('click');
|
|
}
|
|
function restoreDefaultPreview() {
|
|
$('#dragndrop-link').on('click', dragndropLinkClickHandler);
|
|
$('#dragndrop-link').attr('href', '#');
|
|
$('#dragndrop-text').html(defaultPreview);
|
|
}
|
|
function createPreview(file) {
|
|
$('#dragndrop-link').removeAttr('href').off('click');
|
|
$('#dragndrop-text').html('<video id="video_preview" src="' + URL.createObjectURL(file) + '" autoplay controls loop></video><span class="upload-info">' + file.name + ' — ' + humanFileSize(file.size) + ' — <a id="dragndrop-clear" class="fa fa-times" href="#"></a></span><div class="progress progress-striped" style="display: none; margin-left: 10px; margin-right: 10px;"><div class="progress-bar progress-bar-custom" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100"><span class="upload-info sr-only">0%</span></div></div><span class="upload-info"><span id="upload-stats" style="display: none;"></span></span>');
|
|
$('#video_preview').prop('volume', 0);
|
|
$('#dragndrop-clear').on('click', function(e) {
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
currentFile = null;
|
|
$(this).off('click');
|
|
applyDefaultDragNDropCSS();
|
|
restoreDefaultPreview();
|
|
if(jqXHR && jqXHR.statusText != "abort") {
|
|
jqXHR.abort();
|
|
jqXHR = null;
|
|
}
|
|
});
|
|
}
|
|
function checkFile(file) {
|
|
var maxFileSize = 1e8;
|
|
var tooBig = file.size > maxFileSize;
|
|
var invalid = file.type !== "video/webm";
|
|
if((tooBig && $('#dragndrop').data('uploadlimit')) || invalid) {
|
|
flash('error', invalid ? 'Invalid file' : `File too big. Max ${humanFileSize(maxFileSize)}`);
|
|
applyDefaultDragNDropCSS();
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
function submitForm(videotitle, interpret, songtitle, imgsource, category, tags, file) {
|
|
var lastState = {
|
|
'loaded': 0,
|
|
'secondsElapsed': 0
|
|
};
|
|
var speed = [];
|
|
var lastSpeedIndex = 0;
|
|
function interval() {
|
|
var avgSpeed = 0;
|
|
var length = speed.length;
|
|
var i;
|
|
for(i = lastSpeedIndex; i < length; i++)
|
|
avgSpeed += speed[i];
|
|
avgSpeed = avgSpeed / (i - lastSpeedIndex);
|
|
lastSpeedIndex = i;
|
|
$('#upload-stats').text('Speed: ' + humanFileSize(Math.floor(avgSpeed)) + '/s Uploaded: ' + humanFileSize(lastState.loaded));
|
|
}
|
|
var statsInterval;
|
|
var formData = new FormData();
|
|
formData.append('videotitle', videotitle);
|
|
formData.append('interpret', interpret);
|
|
formData.append('songtitle', songtitle);
|
|
formData.append('imgsource', imgsource);
|
|
formData.append('category', category);
|
|
formData.append('tags', tags);
|
|
formData.append('file', file);
|
|
$('.progress-striped, #upload-stats').css('opacity', 0).slideDown('fast').animate({opacity: 1}, {queue: false, duration: 'fast'});
|
|
jqXHR = $.ajax({
|
|
url: '/api/video/upload',
|
|
type: 'POST',
|
|
data: formData,
|
|
processData: false,
|
|
contentType: false,
|
|
success: function(cb) {
|
|
switch(cb.error) {
|
|
case 'null':
|
|
if(cb.video_id) {
|
|
flash('success', 'Upload successful: <a href="/' + cb.video_id + '">/' + cb.video_id + '</a>. Redirect in 3 seconds...');
|
|
setTimeout(function() {
|
|
location.href = '/' + cb.video_id;
|
|
}, 3000);
|
|
}
|
|
else
|
|
flash('error', 'Upload failed');
|
|
break;
|
|
case 'invalid_request':
|
|
flash('error', 'Invalid request');
|
|
break;
|
|
case 'not_logged_in':
|
|
flash('error', 'Not logged in');
|
|
break;
|
|
case 'uploadlimit_reached':
|
|
flash('error', 'Uploadlimit reached');
|
|
break;
|
|
case 'invalid_file':
|
|
flash('error', 'Invalid file');
|
|
break;
|
|
case 'file_too_big':
|
|
flash('error', 'File too big. Check the max upload size.');
|
|
break;
|
|
case 'already_exists':
|
|
if(cb.video_id)
|
|
flash('error', 'Video already exists: <a href="/' + cb.video_id + '">/' + cb.video_id + '</a>');
|
|
else
|
|
flash('error', 'Video already existed but has been deleted');
|
|
break;
|
|
case 'erroneous_file_encoding':
|
|
flash('error', 'Erroneous file encoding. <a href="/webm">Try reencoding it</a>');
|
|
break;
|
|
default:
|
|
flash('error', 'Upload failed');
|
|
break;
|
|
}
|
|
if(cb.error != 'null') {
|
|
$('.progress-bar-custom').css('background-color', 'red');
|
|
$('.progress-bar-custom').text('Upload failed');
|
|
}
|
|
$('#upload-stats').text('Speed: ' + humanFileSize(Math.floor(speed.average())) + '/s Uploaded: ' + humanFileSize(currentFile.size));
|
|
},
|
|
error: function(jqXHR, status, error) {
|
|
jqXHR = null;
|
|
if(error == 'abort') {
|
|
flash('info', 'Upload aborted');
|
|
return;
|
|
}
|
|
flash('error', 'Upload failed');
|
|
$('.progress-bar-custom').css('background-color', 'red');
|
|
$('.progress-bar-custom').text('Upload failed');
|
|
},
|
|
complete: function() {
|
|
clearInterval(statsInterval);
|
|
},
|
|
xhr: function() {
|
|
var xhr = $.ajaxSettings.xhr();
|
|
var started_at = new Date();
|
|
$('.progress-bar-custom').css('background-color', 'rgba(47, 196, 47, 1)');
|
|
xhr.upload.onprogress = function(e) {
|
|
var percentage = Math.floor(e.loaded / e.total * 100);
|
|
var secondsElapsed = (new Date().getTime() - started_at.getTime()) / 1000;
|
|
var bytesPerSecond = (e.loaded - lastState.loaded) / (secondsElapsed - lastState.secondsElapsed);
|
|
$('.progress-bar-custom').css('width', percentage + '%');
|
|
$('.progress-bar-custom').text(percentage + '%');
|
|
lastState.secondsElapsed = secondsElapsed;
|
|
lastState.loaded = e.loaded;
|
|
speed.push(bytesPerSecond);
|
|
if(!statsInterval) {
|
|
interval();
|
|
statsInterval = setInterval(interval, 500);
|
|
}
|
|
};
|
|
return xhr;
|
|
}
|
|
});
|
|
}
|
|
$('input[type="file"]').on('change', function(e) {
|
|
if(!this.files.length)
|
|
return;
|
|
var file = this.files[0];
|
|
if(checkFile(file)) {
|
|
currentFile = file;
|
|
createPreview(file);
|
|
}
|
|
$(this).wrap('<form>').closest('form').get(0).reset();
|
|
$(this).unwrap();
|
|
});
|
|
$('#dragndrop-link').on('click', dragndropLinkClickHandler);
|
|
$(document).on('dragenter', function(e) {
|
|
e.preventDefault();
|
|
counter++;
|
|
var dt = e.originalEvent.dataTransfer;
|
|
if(dt.types != null && (dt.types.indexOf ? dt.types.indexOf('Files') === 0 : dt.types.contains('application/x-moz-file'))) {
|
|
$('#dragndrop').css({
|
|
'color': '#BBB',
|
|
'border-color': '#656464',
|
|
'background-color': '#323234'
|
|
});
|
|
}
|
|
}).on('dragleave', function() {
|
|
counter--;
|
|
if(counter === 0)
|
|
applyDefaultDragNDropCSS();
|
|
}).on('dragover', function(e) {
|
|
e.preventDefault();
|
|
}).on('drop', function(e) {
|
|
e.preventDefault();
|
|
if(!$(e.target).is('#dragndrop-text')) {
|
|
applyDefaultDragNDropCSS();
|
|
}
|
|
});
|
|
$('#dragndrop-text').on('dragover', function(e) {
|
|
var dt = e.originalEvent.dataTransfer;
|
|
var effect = dt.effectAllowed;
|
|
dt.dropEffect = 'move' === effect || 'linkMove' === effect ? 'move' : 'copy';
|
|
}).on('drop', function(e) {
|
|
if(!e.originalEvent.dataTransfer.files.length)
|
|
return;
|
|
if(jqXHR && jqXHR.statusText != "abort") {
|
|
jqXHR.abort();
|
|
currentFile = null;
|
|
restoreDefaultPreview();
|
|
}
|
|
var file = e.originalEvent.dataTransfer.files[0];
|
|
applyDefaultDragNDropCSS();
|
|
if(checkFile(file)) {
|
|
currentFile = file;
|
|
createPreview(file);
|
|
counter = 0;
|
|
}
|
|
});
|
|
$('button#btn-upload').on('click', function() {
|
|
if(!currentFile) {
|
|
flash('error', 'No file selected');
|
|
return;
|
|
}
|
|
if(jqXHR && (jqXHR.readyState == 0 || jqXHR.readyState == 1 || jqXHR.readyState == 3)) {
|
|
flash('info', 'Already uploading');
|
|
return;
|
|
}
|
|
submitForm($('#videotitle').val(), $('#interpret').val(), $('#songtitle').val(), $('#imgsource').val(), $('#category').val(), tags.tagsinput('items'), currentFile);
|
|
});
|
|
tags.on('itemRemoved', function(e) {
|
|
if(e.item === 'nsfw') {
|
|
nsfwCheckbox.prop('checked', false);
|
|
$(this).tagsinput('add', 'sfw');
|
|
}
|
|
else if(e.item === 'sfw') {
|
|
nsfwCheckbox.prop('checked', true);
|
|
$(this).tagsinput('add', 'nsfw');
|
|
}
|
|
});
|
|
nsfwCheckbox.on('change', function() {
|
|
if(this.checked) {
|
|
tags.tagsinput('remove', 'sfw');
|
|
tags.tagsinput('add', 'nsfw');
|
|
}
|
|
else {
|
|
tags.tagsinput('remove', 'nsfw');
|
|
tags.tagsinput('add', 'sfw');
|
|
}
|
|
});
|
|
nsfwCheckbox.trigger('change');
|
|
});
|
|
|
|
$(function() {
|
|
$('.delete_video').on('click', function(e) {
|
|
e.preventDefault();
|
|
do {
|
|
var reason = prompt('Reason for deleting video ' + video.id + ' by ' + video.user);
|
|
if(reason === null)
|
|
return;
|
|
reason = reason.trim();
|
|
} while(!reason);
|
|
video.delete(reason, (success, error, warnings) => {
|
|
if(success) {
|
|
flash('success', 'Video deleted. Redirect in 3 seconds...');
|
|
setTimeout(() => location.href = '/', 3000);
|
|
for(let warn of warnings)
|
|
flash('warning', warn);
|
|
}
|
|
else
|
|
flash('error', 'Error deleting video');
|
|
});
|
|
});
|
|
});
|
|
|
|
function formatText(tag) {
|
|
var Field = document.getElementById('cinput');
|
|
var val = Field.value;
|
|
var selected_txt = val.substring(Field.selectionStart, Field.selectionEnd);
|
|
var before_txt = val.substring(0, Field.selectionStart);
|
|
var after_txt = val.substr(Field.selectionEnd);
|
|
var str1 = before_txt + '[' + tag + ']' + selected_txt;
|
|
var len = str1.length;
|
|
Field.value = str1 + '[/' + tag + ']' + after_txt;
|
|
Field.focus();
|
|
Field.setSelectionRange(len, len);
|
|
}
|
|
|
|
//Insert the emojis into the text area
|
|
function formatTextEmoji(tag) {
|
|
var Field = document.getElementById('cinput');
|
|
var val = Field.value;
|
|
var selected_txt = val.substring(Field.selectionStart, Field.selectionEnd);
|
|
var before_txt = val.substring(0, Field.selectionStart);
|
|
var after_txt = val.substr(Field.selectionEnd);
|
|
var str1 = before_txt + ':' + tag + ':' + selected_txt;
|
|
var len = str1.length;
|
|
Field.value = str1 + '' + '' + after_txt;
|
|
Field.focus();
|
|
Field.setSelectionRange(len, len);
|
|
}
|
|
|
|
// Copy Link
|
|
function Copy() {
|
|
var Url = document.getElementById("url");
|
|
Url.innerHTML = window.location.href;
|
|
console.log(Url.innerHTML)
|
|
Url.select();
|
|
document.execCommand("copy");
|
|
}
|
|
|
|
//Toggle the Emojibar
|
|
$(".header").click(function () {
|
|
$header = $(this);
|
|
$content = $(".emojis-box");
|
|
$content.slideToggle(350, function () {
|
|
});
|
|
});
|
|
|
|
//Anime Thumbnailer
|
|
$(".anime-thumb-opener").click(function () {
|
|
$header = $(this);
|
|
$content = $(".anime-thumb");
|
|
$content.slideToggle(350, function () {
|
|
});
|
|
});
|
|
/*
|
|
window.onload = function (){
|
|
var video = document.getElementById('video_html5_api');
|
|
var thecanvas = document.getElementById('thecanvas');
|
|
var img = document.getElementById('thumbnail_img');
|
|
|
|
video.setAttribute('crossOrigin', 'anonymous');
|
|
|
|
video.addEventListener('pause', function(){
|
|
draw( video, thecanvas, img);
|
|
}, false);
|
|
};
|
|
|
|
function draw( video, thecanvas, img ){
|
|
img.setAttribute('crossOrigin', 'anonymous');
|
|
var context = thecanvas.getContext('2d');
|
|
context.drawImage( video, 0, 0, thecanvas.width, thecanvas.height);
|
|
var dataURL = thecanvas.toDataURL();
|
|
img.setAttribute('src', dataURL);
|
|
} */
|
|
|
|
/*if(/linux/i.test(navigator.platform) && /firefox/i.test(navigator.userAgent) && !/firefox\/65\.0/i.test(navigator.userAgent)) {
|
|
var Flummi = document.getElementById("bg");
|
|
Flummi.remove();
|
|
document.querySelector(".fa-adjust").style.color = "#5d5d5d";
|
|
document.getElementById("togglebg").setAttribute('title', "Sorry, your version of Firefox can't handle the w0bm background at the moment, try out Firefox Nightly or Chromium for the background to work!");
|
|
// Danke Flummi xD
|
|
}*/
|
|
|
|
// Vielen Dank an Flummi!
|
|
// This code snippet makes full and valid urls clickable in the info box!
|
|
|
|
//const infoboxContent = document.querySelector("button#infobox");
|
|
//if(infoboxContent)
|
|
// infoboxContent.dataset.content = infoboxContent.dataset.content.replace(/(https?:\/\/[^\s]+)/g, "<a href='$1' target='_blank' rel='extern'>$1</a>");
|
|
// uncommenting this because of problematic replacement and possible abuse
|
|
|
|
|
|
//This was supposed to work for urls that are not in a correct url-sheme such as z0r.de/1337 but ehm itz out of biz cuz uhm xD https://f0ck.it/uploads/%5B2019%5D_firefox_YapokIcyShoveler.png
|
|
//infoboxContent.dataset.content = infoboxContent.dataset.content.replace(/((https?:\/\/)?[\w-]+(\.[\w-]+)+\.?(:\d+)?(\/\S*)?)?/gi, "<a href='$1'>$1</a>");
|
|
|
|
document.querySelectorAll("#layoutSwitcher [id^=layout]").forEach(el => el.addEventListener("click", async function(e) {
|
|
e.preventDefault();
|
|
const response = await fetch("/api/user/layout?layout=" + this.id.replace("layout", ""));
|
|
if(response.ok)
|
|
location.reload();
|
|
else
|
|
console.warn(response.status, await response.text());
|
|
}));
|
|
|
|
if( /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ) {
|
|
newlink = document.createElement('a');
|
|
newlink.setAttribute('class', 'mobiledetected');
|
|
newlink.setAttribute('href', '/api/user/layout?layout=5');
|
|
}
|
|
|
|
var isMobile = false; //initiate as false
|
|
// device detection
|
|
if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|ipad|iris|kindle|Android|Silk|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(navigator.userAgent)
|
|
|| /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(navigator.userAgent.substr(0,4))) {
|
|
isMobile = true;
|
|
window.location.href = "https://w0bm.com/api/user/layout?layout=5";
|
|
} |