thread.js
158 lines
| 4.8 KiB
| application/javascript
|
JavascriptLexer
neko259
|
r332 | /* | |
@licstart The following is the entire license notice for the | |||
JavaScript code in this page. | |||
Copyright (C) 2013 neko259 | |||
The JavaScript code in this page is free software: you can | |||
redistribute it and/or modify it under the terms of the GNU | |||
General Public License (GNU GPL) as published by the Free Software | |||
Foundation, either version 3 of the License, or (at your option) | |||
any later version. The code is distributed WITHOUT ANY WARRANTY; | |||
without even the implied warranty of MERCHANTABILITY or FITNESS | |||
FOR A PARTICULAR PURPOSE. See the GNU GPL for more details. | |||
As additional permission under GNU GPL version 3 section 7, you | |||
may distribute non-source (e.g., minimized or compacted) forms of | |||
that code without the copy of the GNU GPL normally required by | |||
section 4, provided you include this license notice and a URL | |||
through which recipients can access the Corresponding Source. | |||
@licend The above is the entire license notice | |||
for the JavaScript code in this page. | |||
*/ | |||
neko259
|
r1108 | var CLOSE_BUTTON = '#form-close-button'; | |
neko259
|
r1289 | var REPLY_TO_MSG = '.reply-to-message'; | |
var REPLY_TO_MSG_ID = '#reply-to-message-id'; | |||
neko259
|
r970 | var $html = $("html, body"); | |
Pavel Ryapolov
|
r106 | function moveCaretToEnd(el) { | |
if (typeof el.selectionStart == "number") { | |||
el.selectionStart = el.selectionEnd = el.value.length; | |||
} else if (typeof el.createTextRange != "undefined") { | |||
el.focus(); | |||
var range = el.createTextRange(); | |||
range.collapse(false); | |||
range.select(); | |||
} | |||
} | |||
neko259
|
r1056 | function getForm() { | |
return $('.post-form-w'); | |||
} | |||
neko259
|
r1059 | function resetFormPosition() { | |
neko259
|
r1056 | var form = getForm(); | |
form.insertAfter($('.thread')); | |||
neko259
|
r1108 | ||
$(CLOSE_BUTTON).hide(); | |||
neko259
|
r1289 | $(REPLY_TO_MSG).hide(); | |
neko259
|
r1108 | } | |
function showFormAfter(blockToInsertAfter) { | |||
var form = getForm(); | |||
form.insertAfter(blockToInsertAfter); | |||
$(CLOSE_BUTTON).show(); | |||
form.show(); | |||
neko259
|
r1289 | $(REPLY_TO_MSG_ID).text(blockToInsertAfter.attr('id')); | |
$(REPLY_TO_MSG).show(); | |||
neko259
|
r1056 | } | |
neko259
|
r97 | function addQuickReply(postId) { | |
neko259
|
r1108 | // If we click "reply" on the same post, it means "cancel" | |
if (getForm().prev().attr('id') == postId) { | |||
resetFormPosition(); | |||
} else { | |||
var blockToInsert = null; | |||
neko259
|
r1516 | var textAreaJq = $('textarea'); | |
var postLinkRaw = '[post]' + postId + '[/post]' | |||
var textToAdd = ''; | |||
neko259
|
r1084 | ||
neko259
|
r1108 | if (postId != null) { | |
var post = $('#' + postId); | |||
neko259
|
r1056 | ||
neko259
|
r1516 | // If this is not OP, add reflink to the post. If there already is | |
// the same reflink, don't add it again. | |||
if (!post.is(':first-child') && textAreaJq.val().indexOf(postLinkRaw) < 0) { | |||
textToAdd += postLinkRaw + '\n'; | |||
} | |||
textAreaJq.val(textAreaJq.val()+ textToAdd); | |||
neko259
|
r1108 | blockToInsert = post; | |
} else { | |||
blockToInsert = $('.thread'); | |||
neko259
|
r1056 | } | |
neko259
|
r1513 | showFormAfter(blockToInsert); | |
neko259
|
r1517 | ||
textAreaJq.focus(); | |||
neko259
|
r1514 | ||
neko259
|
r1517 | var textarea = document.getElementsByTagName('textarea')[0]; | |
moveCaretToEnd(textarea); | |||
} | |||
neko259
|
r1513 | } | |
neko259
|
r1056 | ||
neko259
|
r1521 | function addQuickQuote() { | |
neko259
|
r1575 | var textAreaJq = $('textarea'); | |
var quoteButton = $("#quote-button"); | |||
var postId = quoteButton.attr('data-post-id'); | |||
if (postId != null && getForm().prev().attr('id') != postId) { | |||
addQuickReply(postId); | |||
} | |||
neko259
|
r1513 | var textToAdd = ''; | |
var selection = window.getSelection().toString(); | |||
neko259
|
r1521 | if (selection.length == 0) { | |
neko259
|
r1575 | selection = quoteButton.attr('data-text'); | |
neko259
|
r1521 | } | |
neko259
|
r1513 | if (selection.length > 0) { | |
textToAdd += '[quote]' + selection + '[/quote]\n'; | |||
} | |||
neko259
|
r97 | ||
neko259
|
r1575 | textAreaJq.val(textAreaJq.val() + textToAdd); | |
neko259
|
r1513 | ||
textAreaJq.focus(); | |||
neko259
|
r1514 | ||
neko259
|
r1513 | var textarea = document.getElementsByTagName('textarea')[0]; | |
moveCaretToEnd(textarea); | |||
neko259
|
r97 | } | |
neko259
|
r671 | ||
neko259
|
r686 | function scrollToBottom() { | |
neko259
|
r970 | $html.animate({scrollTop: $html.height()}, "fast"); | |
neko259
|
r1056 | } | |
neko259
|
r1108 | ||
neko259
|
r1521 | function showQuoteButton() { | |
var selection = window.getSelection().getRangeAt(0).getBoundingClientRect(); | |||
var quoteButton = $("#quote-button"); | |||
if (selection.width > 0) { | |||
// quoteButton.offset({ top: selection.top - selection.height, left: selection.left }); | |||
quoteButton.css({top: selection.top + $(window).scrollTop() - 30, left: selection.left}); | |||
quoteButton.show(); | |||
var text = window.getSelection().toString(); | |||
quoteButton.attr('data-text', text); | |||
neko259
|
r1575 | ||
var rect = window.getSelection().getRangeAt(0).getBoundingClientRect(); | |||
var element = $(document.elementFromPoint(rect.x, rect.y)); | |||
var postParent = element.parents('.post'); | |||
if (postParent.length > 0) { | |||
quoteButton.attr('data-post-id', postParent.attr('id')); | |||
} else { | |||
quoteButton.attr('data-post-id', null); | |||
} | |||
neko259
|
r1521 | } else { | |
quoteButton.hide(); | |||
} | |||
} | |||
$(document).ready(function() { | |||
$('body').on('mouseup', function() { | |||
showQuoteButton(); | |||
}); | |||
$("#quote-button").click(function() { | |||
addQuickQuote(); | |||
}) | |||
}); |