2020-09-27 16:36:33 +00:00
|
|
|
// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPLv3-or-later
|
2017-01-07 14:49:13 +00:00
|
|
|
/*
|
2020-01-19 06:05:23 +00:00
|
|
|
* The file contains functions for text editing and commenting
|
2016-05-07 22:29:33 +00:00
|
|
|
*/
|
|
|
|
|
2019-01-29 14:25:22 +00:00
|
|
|
// Lifted from https://css-tricks.com/snippets/jquery/move-cursor-to-end-of-textarea-or-input/
|
2021-01-22 13:38:44 +00:00
|
|
|
jQuery.fn.putCursorAtEnd = function () {
|
|
|
|
return this.each(function () {
|
2019-01-29 14:25:22 +00:00
|
|
|
// Cache references
|
|
|
|
var $el = $(this),
|
|
|
|
el = this;
|
|
|
|
|
|
|
|
// Only focus if input isn't already
|
|
|
|
if (!$el.is(":focus")) {
|
|
|
|
$el.focus();
|
|
|
|
}
|
|
|
|
|
|
|
|
// If this function exists... (IE 9+)
|
|
|
|
if (el.setSelectionRange) {
|
|
|
|
// Double the length because Opera is inconsistent about whether a carriage return is one character or two.
|
|
|
|
var len = $el.val().length * 2;
|
|
|
|
|
|
|
|
// Timeout seems to be required for Blink
|
2021-01-22 13:38:44 +00:00
|
|
|
setTimeout(function () {
|
2019-01-29 14:25:22 +00:00
|
|
|
el.setSelectionRange(len, len);
|
|
|
|
}, 1);
|
|
|
|
} else {
|
|
|
|
// As a fallback, replace the contents with itself
|
|
|
|
// Doesn't work in Chrome, but Chrome supports setSelectionRange
|
|
|
|
$el.val($el.val());
|
|
|
|
}
|
|
|
|
|
|
|
|
// Scroll to the bottom, in case we're in a tall textarea
|
|
|
|
// (Necessary for Firefox and Chrome)
|
|
|
|
this.scrollTop = 999999;
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
2018-10-24 16:09:54 +00:00
|
|
|
function commentGetLink(id, prompttext) {
|
|
|
|
reply = prompt(prompttext);
|
2021-01-22 13:38:44 +00:00
|
|
|
if (reply && reply.length) {
|
2018-10-24 14:20:10 +00:00
|
|
|
reply = bin2hex(reply);
|
2021-02-16 15:20:51 +00:00
|
|
|
$.get("parseurl?noAttachment=1&binurl=" + reply, function (data) {
|
2018-10-24 14:20:10 +00:00
|
|
|
addCommentText(data, id);
|
|
|
|
});
|
|
|
|
}
|
2018-10-17 19:05:45 +00:00
|
|
|
}
|
|
|
|
|
2018-10-24 14:20:10 +00:00
|
|
|
function addCommentText(data, id) {
|
2019-02-02 02:12:36 +00:00
|
|
|
// get the textfield
|
|
|
|
var textfield = document.getElementById("comment-edit-text-" + id);
|
|
|
|
// check if the textfield does have the default-value
|
|
|
|
commentOpenUI(textfield, id);
|
|
|
|
// save already existent content
|
|
|
|
var currentText = $("#comment-edit-text-" + id).val();
|
|
|
|
//insert the data as new value
|
|
|
|
textfield.value = currentText + data;
|
|
|
|
autosize.update($("#comment-edit-text-" + id));
|
2018-10-17 19:05:45 +00:00
|
|
|
}
|
|
|
|
|
2018-10-24 14:20:10 +00:00
|
|
|
function commentLinkDrop(event, id) {
|
2019-02-02 02:12:36 +00:00
|
|
|
var reply = event.dataTransfer.getData("text/uri-list");
|
|
|
|
event.target.textContent = reply;
|
|
|
|
event.preventDefault();
|
|
|
|
if (reply && reply.length) {
|
|
|
|
reply = bin2hex(reply);
|
2021-02-16 15:20:51 +00:00
|
|
|
$.get("parseurl?noAttachment=1&binurl=" + reply, function (data) {
|
2018-10-24 14:20:10 +00:00
|
|
|
addCommentText(data, id);
|
2019-02-02 02:12:36 +00:00
|
|
|
});
|
|
|
|
}
|
2018-10-17 19:05:45 +00:00
|
|
|
}
|
|
|
|
|
2018-10-24 14:20:10 +00:00
|
|
|
function commentLinkDropper(event) {
|
2019-02-02 02:12:36 +00:00
|
|
|
var linkFound = event.dataTransfer.types.contains("text/uri-list");
|
|
|
|
if (linkFound) {
|
|
|
|
event.preventDefault();
|
|
|
|
}
|
2018-10-17 19:05:45 +00:00
|
|
|
}
|
|
|
|
|
2019-10-11 20:12:36 +00:00
|
|
|
function insertFormattingToPost(BBCode) {
|
2018-09-20 15:23:29 +00:00
|
|
|
textarea = document.getElementById("profile-jot-text");
|
2018-09-20 15:20:57 +00:00
|
|
|
|
2019-10-11 20:12:36 +00:00
|
|
|
insertBBCodeInTextarea(BBCode, textarea);
|
2018-09-20 15:20:57 +00:00
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
2016-05-07 22:29:33 +00:00
|
|
|
|
|
|
|
function showThread(id) {
|
2021-01-22 13:38:44 +00:00
|
|
|
$("#collapsed-comments-" + id).show();
|
|
|
|
$("#collapsed-comments-" + id + " .collapsed-comments").show();
|
2016-05-07 22:29:33 +00:00
|
|
|
}
|
|
|
|
function hideThread(id) {
|
2021-01-22 13:38:44 +00:00
|
|
|
$("#collapsed-comments-" + id).hide();
|
|
|
|
$("#collapsed-comments-" + id + " .collapsed-comments").hide();
|
2016-05-07 22:29:33 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function cmtBbOpen(id) {
|
|
|
|
$("#comment-edit-bb-" + id).show();
|
|
|
|
}
|
|
|
|
function cmtBbClose(id) {
|
|
|
|
$("#comment-edit-bb-" + id).hide();
|
|
|
|
}
|
|
|
|
|
2021-01-22 13:38:44 +00:00
|
|
|
function commentExpand(id) {
|
2016-05-07 22:29:33 +00:00
|
|
|
$("#mod-cmnt-wrap-" + id).show();
|
2019-02-15 03:28:38 +00:00
|
|
|
closeMenu("comment-fake-form-" + id);
|
|
|
|
openMenu("item-comments-" + id);
|
|
|
|
$("#comment-edit-text-" + id)
|
|
|
|
.putCursorAtEnd()
|
|
|
|
.addClass("comment-edit-text-full")
|
|
|
|
.removeClass("comment-edit-text-empty");
|
|
|
|
|
2016-05-07 22:29:33 +00:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2021-01-22 13:38:44 +00:00
|
|
|
function commentClose(obj, id) {
|
|
|
|
if (obj.value === "" || obj.value === obj.dataset.default) {
|
2019-02-15 03:28:38 +00:00
|
|
|
$("#comment-edit-text-" + id)
|
|
|
|
.removeClass("comment-edit-text-full")
|
|
|
|
.addClass("comment-edit-text-empty");
|
2016-05-07 22:29:33 +00:00
|
|
|
$("#mod-cmnt-wrap-" + id).hide();
|
2019-02-15 03:28:38 +00:00
|
|
|
openMenu("comment-fake-form-" + id);
|
|
|
|
closeMenu("item-comments-" + id);
|
2016-05-07 22:29:33 +00:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
function showHideCommentBox(id) {
|
2021-01-22 13:38:44 +00:00
|
|
|
var $el = $("#comment-edit-form-" + id);
|
|
|
|
if ($el.is(":visible")) {
|
2019-02-15 03:28:38 +00:00
|
|
|
$el.hide();
|
2017-05-21 17:40:51 +00:00
|
|
|
} else {
|
2019-02-15 03:28:38 +00:00
|
|
|
$el.show();
|
2016-05-07 22:29:33 +00:00
|
|
|
}
|
|
|
|
}
|
2016-05-07 23:31:30 +00:00
|
|
|
|
|
|
|
function commentOpenUI(obj, id) {
|
2019-02-15 03:28:38 +00:00
|
|
|
closeMenu("comment-fake-form-" + id);
|
|
|
|
openMenu("item-comments-" + id);
|
|
|
|
$("#comment-edit-text-" + id)
|
|
|
|
.putCursorAtEnd()
|
2021-01-22 13:38:44 +00:00
|
|
|
.addClass("comment-edit-text-full")
|
|
|
|
.removeClass("comment-edit-text-empty")
|
|
|
|
.attr("tabindex", "9"); // Choose an arbitrary tab index that's greater than what we're using in jot (3 of them)
|
|
|
|
$("#comment-edit-submit-" + id).attr("tabindex", "10"); // The submit button gets tabindex + 1
|
2017-02-16 12:06:11 +00:00
|
|
|
// initialize autosize for this comment
|
|
|
|
autosize($("#comment-edit-text-" + id + ".text-autosize"));
|
2016-05-07 23:31:30 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function commentCloseUI(obj, id) {
|
2021-01-22 13:38:44 +00:00
|
|
|
if (obj.value === "" || obj.value === obj.dataset.default) {
|
2019-02-15 03:28:38 +00:00
|
|
|
$("#comment-edit-text-" + id)
|
2021-01-22 13:38:44 +00:00
|
|
|
.removeClass("comment-edit-text-full")
|
|
|
|
.addClass("comment-edit-text-empty")
|
|
|
|
.removeAttr("tabindex");
|
|
|
|
$("#comment-edit-submit-" + id).removeAttr("tabindex");
|
2019-02-15 03:28:38 +00:00
|
|
|
openMenu("comment-fake-form-" + id);
|
|
|
|
closeMenu("item-comments-" + id);
|
2017-02-16 12:06:11 +00:00
|
|
|
// destroy the automatic textarea resizing
|
|
|
|
autosize.destroy($("#comment-edit-text-" + id + ".text-autosize"));
|
|
|
|
}
|
2016-05-07 23:31:30 +00:00
|
|
|
}
|
2016-05-09 19:08:11 +00:00
|
|
|
|
|
|
|
function jotTextOpenUI(obj) {
|
2021-01-22 13:38:44 +00:00
|
|
|
if (obj.value === "" || obj.value === obj.dataset.default) {
|
2019-02-15 03:28:38 +00:00
|
|
|
var $el = $(".modal-body #profile-jot-text");
|
|
|
|
$el.addClass("profile-jot-text-full").removeClass("profile-jot-text-empty");
|
2016-08-23 14:48:13 +00:00
|
|
|
// initiale autosize for the jot
|
2019-02-15 03:28:38 +00:00
|
|
|
autosize($el);
|
2016-05-09 19:08:11 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function jotTextCloseUI(obj) {
|
2021-01-22 13:38:44 +00:00
|
|
|
if (obj.value === "" || obj.value === obj.dataset.default) {
|
2019-02-15 03:28:38 +00:00
|
|
|
var $el = $(".modal-body #profile-jot-text");
|
|
|
|
$el.removeClass("profile-jot-text-full").addClass("profile-jot-text-empty");
|
2016-08-23 14:48:13 +00:00
|
|
|
// destroy the automatic textarea resizing
|
2019-02-15 03:28:38 +00:00
|
|
|
autosize.destroy($el);
|
2016-05-09 19:08:11 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-05-21 17:40:51 +00:00
|
|
|
function commentOpen(obj, id) {
|
2021-01-22 13:38:44 +00:00
|
|
|
if (obj.value === "" || obj.value === obj.dataset.default) {
|
2019-02-15 03:28:38 +00:00
|
|
|
$("#comment-edit-text-" + id)
|
|
|
|
.putCursorAtEnd()
|
|
|
|
.addClass("comment-edit-text-full")
|
|
|
|
.removeClass("comment-edit-text-empty");
|
2016-05-07 23:31:30 +00:00
|
|
|
$("#mod-cmnt-wrap-" + id).show();
|
2019-02-15 03:28:38 +00:00
|
|
|
closeMenu("comment-fake-form-" + id);
|
|
|
|
openMenu("item-comments-" + id);
|
2016-05-07 23:31:30 +00:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2017-05-21 17:40:51 +00:00
|
|
|
function confirmDelete() {
|
|
|
|
return confirm(aStr.delitem);
|
|
|
|
}
|
2016-05-11 14:04:11 +00:00
|
|
|
|
2021-01-20 23:44:30 +00:00
|
|
|
function confirmBlock() {
|
|
|
|
return confirm(aStr.blockAuthor);
|
|
|
|
}
|
|
|
|
|
2023-01-09 16:23:39 +00:00
|
|
|
function confirmIgnore() {
|
|
|
|
return confirm(aStr.ignoreAuthor);
|
|
|
|
}
|
|
|
|
|
2023-05-20 12:24:19 +00:00
|
|
|
function confirmCollapse() {
|
|
|
|
return confirm(aStr.collapseAuthor);
|
|
|
|
}
|
|
|
|
|
2023-07-09 20:14:53 +00:00
|
|
|
function confirmIgnoreServer() {
|
|
|
|
return confirm(aStr.ignoreServer + "\n" + aStr.ignoreServerDesc);
|
|
|
|
}
|
|
|
|
|
2017-03-13 16:12:13 +00:00
|
|
|
/**
|
|
|
|
* Hide and removes an item element from the DOM after the deletion url is
|
|
|
|
* successful, restore it else.
|
|
|
|
*
|
|
|
|
* @param {string} url The item removal URL
|
|
|
|
* @param {string} elementId The DOM id of the item element
|
|
|
|
* @returns {undefined}
|
|
|
|
*/
|
|
|
|
function dropItem(url, elementId) {
|
2021-01-20 23:44:30 +00:00
|
|
|
if (confirmDelete()) {
|
|
|
|
$("body").css("cursor", "wait");
|
|
|
|
|
|
|
|
var $el = $(document.getElementById(elementId));
|
|
|
|
|
|
|
|
$el.fadeTo('fast', 0.33, function () {
|
|
|
|
$.get(url).then(function() {
|
|
|
|
$el.remove();
|
|
|
|
}).fail(function() {
|
|
|
|
// @todo Show related error message
|
|
|
|
$el.show();
|
|
|
|
}).always(function() {
|
|
|
|
$("body").css('cursor', 'auto');
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
2016-09-07 01:22:02 +00:00
|
|
|
|
2021-01-20 23:44:30 +00:00
|
|
|
/**
|
|
|
|
* Blocks an author and hide and removes an item element from the DOM after the block is
|
|
|
|
* successful, restore it else.
|
|
|
|
*
|
|
|
|
* @param {string} url The item removal URL
|
|
|
|
* @param {string} elementId The DOM id of the item element
|
|
|
|
* @returns {undefined}
|
|
|
|
*/
|
|
|
|
function blockAuthor(url, elementId) {
|
|
|
|
if (confirmBlock()) {
|
2021-01-22 13:38:44 +00:00
|
|
|
$("body").css("cursor", "wait");
|
2017-03-13 16:12:13 +00:00
|
|
|
|
|
|
|
var $el = $(document.getElementById(elementId));
|
|
|
|
|
2021-01-22 13:38:44 +00:00
|
|
|
$el.fadeTo("fast", 0.33, function () {
|
|
|
|
$.get(url)
|
|
|
|
.then(function () {
|
|
|
|
$el.remove();
|
|
|
|
})
|
|
|
|
.fail(function () {
|
|
|
|
// @todo Show related error message
|
|
|
|
$el.show();
|
|
|
|
})
|
|
|
|
.always(function () {
|
|
|
|
$("body").css("cursor", "auto");
|
|
|
|
});
|
2016-05-11 14:04:11 +00:00
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
2023-01-09 16:23:39 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Ignored an author and hide and removes an item element from the DOM after the block is
|
|
|
|
* successful, restore it else.
|
|
|
|
*
|
|
|
|
* @param {string} url The item removal URL
|
|
|
|
* @param {string} elementId The DOM id of the item element
|
|
|
|
* @returns {undefined}
|
|
|
|
*/
|
|
|
|
function ignoreAuthor(url, elementId) {
|
|
|
|
if (confirmIgnore()) {
|
|
|
|
$("body").css("cursor", "wait");
|
|
|
|
|
|
|
|
var $el = $(document.getElementById(elementId));
|
|
|
|
|
|
|
|
$el.fadeTo("fast", 0.33, function () {
|
|
|
|
$.get(url)
|
|
|
|
.then(function () {
|
|
|
|
$el.remove();
|
|
|
|
})
|
|
|
|
.fail(function () {
|
|
|
|
// @todo Show related error message
|
|
|
|
$el.show();
|
|
|
|
})
|
|
|
|
.always(function () {
|
|
|
|
$("body").css("cursor", "auto");
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
2023-05-20 12:24:19 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Collapse author posts
|
|
|
|
*
|
|
|
|
* @param {string} url The item collapse URL
|
|
|
|
* @param {string} elementId The DOM id of the item element
|
|
|
|
* @returns {undefined}
|
|
|
|
*/
|
|
|
|
function collapseAuthor(url, elementId) {
|
|
|
|
if (confirmCollapse()) {
|
|
|
|
$("body").css("cursor", "wait");
|
|
|
|
|
|
|
|
var $el = $(document.getElementById(elementId));
|
|
|
|
|
|
|
|
$el.fadeTo("fast", 0.33, function () {
|
|
|
|
$.get(url)
|
|
|
|
.then(function () {
|
|
|
|
//$el.remove();
|
|
|
|
})
|
|
|
|
.fail(function () {
|
|
|
|
// @todo Show related error message
|
|
|
|
$el.show();
|
|
|
|
})
|
|
|
|
.always(function () {
|
|
|
|
$("body").css("cursor", "auto");
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
2023-07-09 20:14:53 +00:00
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Ignore author server
|
|
|
|
*
|
|
|
|
* @param {string} url The server ignore URL
|
|
|
|
* @param {string} elementId The DOM id of the item element
|
|
|
|
* @returns {undefined}
|
|
|
|
*/
|
|
|
|
function ignoreServer(url, elementId) {
|
|
|
|
if (confirmIgnoreServer()) {
|
|
|
|
$("body").css("cursor", "wait");
|
|
|
|
|
|
|
|
var $el = $(document.getElementById(elementId));
|
|
|
|
|
|
|
|
$el.fadeTo("fast", 0.33, function () {
|
|
|
|
$.post(url)
|
|
|
|
.then(function () {
|
|
|
|
$el.remove();
|
|
|
|
})
|
|
|
|
.fail(function () {
|
|
|
|
// @todo Show related error message
|
|
|
|
$el.fadeTo("fast", 1);
|
|
|
|
})
|
|
|
|
.always(function () {
|
|
|
|
$("body").css("cursor", "auto");
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
2020-09-27 18:00:06 +00:00
|
|
|
// @license-end
|