1
0
mirror of https://github.com/vichan-devel/vichan.git synced 2024-12-18 10:25:55 +01:00
vichan/js/quick-reply.js

366 lines
11 KiB
JavaScript
Raw Normal View History

2012-03-14 09:41:56 +01:00
/*
* quick-reply.js
2012-03-31 02:13:11 +02:00
* https://github.com/savetheinternet/Tinyboard/blob/master/js/quick-reply.js
2012-03-14 09:41:56 +01:00
*
* Released under the MIT license
* Copyright (c) 2013 Michael Save <savetheinternet@tinyboard.org>
2012-03-14 09:41:56 +01:00
*
* Usage:
* $config['additional_javascript'][] = 'js/jquery.min.js';
2013-09-15 03:18:46 +02:00
* $config['additional_javascript'][] = 'js/jquery-ui.custom.min.js'; // Optional; if you want the form to be draggable.
* $config['additional_javascript'][] = 'js/quick-reply.js';
2012-03-14 09:41:56 +01:00
*
*/
2013-09-15 02:29:35 +02:00
var do_css = function() {
$('#quick-reply-css').remove();
// Find background of reply posts
var dummy_reply = $('<div class="post reply"></div>').appendTo($('body'));
2013-09-15 12:19:39 +02:00
var reply_background = dummy_reply.css('backgroundColor');
2013-09-15 05:00:36 +02:00
var reply_border_style = dummy_reply.css('borderStyle');
var reply_border_color = dummy_reply.css('borderColor');
var reply_border_width = dummy_reply.css('borderWidth');
2013-09-15 02:29:35 +02:00
dummy_reply.remove();
$('<style type="text/css" id="quick-reply-css">\
#quick-reply {\
position: fixed;\
right: 0;\
top: 5%;\
float: right;\
display: block;\
padding: 0 0 0 0;\
2013-09-16 00:11:54 +02:00
width: 300px;\
}\
#quick-reply table {\
border-collapse: collapse;\
2013-09-15 03:24:06 +02:00
background: ' + reply_background + ';\
2013-09-15 05:00:36 +02:00
border-style: ' + reply_border_style + ';\
border-width: ' + reply_border_width + ';\
border-color: ' + reply_border_color + ';\
margin: 0;\
width: 100%;\
}\
#quick-reply tr td:nth-child(2) {\
white-space: nowrap;\
text-align: right;\
padding-right: 4px;\
}\
#quick-reply tr td:nth-child(2) input[type="submit"] {\
width: 100%;\
}\
#quick-reply th, #quick-reply td {\
margin: 0;\
padding: 0;\
}\
#quick-reply th {\
text-align: center;\
padding: 2px 0;\
border: 1px solid #222;\
}\
2013-09-15 19:20:11 +02:00
#quick-reply th .handle {\
float: left;\
2013-09-16 00:11:54 +02:00
width: 100%;\
2013-09-15 19:20:11 +02:00
display: inline-block;\
}\
#quick-reply th .close-btn {\
float: right;\
padding: 0 5px;\
}\
#quick-reply input[type="text"], #quick-reply select {\
width: 100%;\
padding: 2px;\
font-size: 10pt;\
box-sizing: border-box;\
-webkit-box-sizing:border-box;\
-moz-box-sizing: border-box;\
}\
#quick-reply textarea {\
width: 100%;\
box-sizing: border-box;\
-webkit-box-sizing:border-box;\
-moz-box-sizing: border-box;\
font-size: 10pt;\
2013-09-15 05:00:36 +02:00
resize: vertical;\
}\
#quick-reply input, #quick-reply select, #quick-reply textarea {\
margin: 0 0 1px 0;\
}\
#quick-reply input[type="file"] {\
padding: 5px 2px;\
}\
#quick-reply .nonsense {\
display: none;\
}\
#quick-reply td.submit {\
width: 1%;\
}\
2013-09-16 00:11:54 +02:00
#quick-reply td.recaptcha {\
text-align: center;\
padding: 0 0 1px 0;\
}\
#quick-reply td.recaptcha span {\
display: inline-block;\
width: 100%;\
background: white;\
border: 1px solid #ccc;\
cursor: pointer;\
}\
#quick-reply td.recaptcha-response {\
padding: 0 0 1px 0;\
}\
@media screen and (max-width: 800px) {\
#quick-reply {\
display: none !important;\
}\
}\
</style>').appendTo($('head'));
2013-09-15 02:29:35 +02:00
};
var show_quick_reply = function(){
if($('div.banner').length == 0)
return;
if($('#quick-reply').length != 0)
return;
do_css();
var $postForm = $('form[name="post"]').clone();
$postForm.clone();
2012-03-14 09:41:56 +01:00
$dummyStuff = $('<div class="nonsense"></div>').appendTo($postForm);
$postForm.find('table tr').each(function() {
var $th = $(this).children('th:first');
var $td = $(this).children('td:first');
if ($th.length && $td.length) {
$td.attr('colspan', 2);
if ($td.find('input[type="text"]').length) {
// Replace <th> with input placeholders
$td.find('input[type="text"]')
.removeAttr('size')
.attr('placeholder', $th.clone().children().remove().end().text());
}
// Move anti-spam nonsense and remove <th>
2013-09-15 06:03:27 +02:00
$th.contents().filter(function() {
return this.nodeType == 3; // Node.TEXT_NODE
}).remove();
$th.contents().appendTo($dummyStuff);
$th.remove();
if ($td.find('input[name="password"]').length) {
// Hide password field
$(this).hide();
}
// Fix submit button
if ($td.find('input[type="submit"]').length) {
$td.removeAttr('colspan');
$('<td class="submit"></td>').append($td.find('input[type="submit"]')).insertAfter($td);
}
2013-09-16 00:11:54 +02:00
// reCAPTCHA
if ($td.find('#recaptcha_widget_div').length) {
// Just show the image, and have it interact with the real form.
var $captchaimg = $td.find('#recaptcha_image img');
$captchaimg
.removeAttr('id')
.removeAttr('style')
.addClass('recaptcha_image')
.click(function() {
$('#recaptcha_reload').click();
});
// When we get a new captcha...
$('#recaptcha_response_field').focus(function() {
if ($captchaimg.attr('src') != $('#recaptcha_image img').attr('src')) {
$captchaimg.attr('src', $('#recaptcha_image img').attr('src'));
$postForm.find('input[name="recaptcha_challenge_field"]').val($('#recaptcha_challenge_field').val());
$postForm.find('input[name="recaptcha_response_field"]').val('').focus();
}
});
$postForm.submit(function() {
setTimeout(function() {
$('#recaptcha_reload').click();
}, 200);
});
// Make a new row for the response text
var $newRow = $('<tr><td class="recaptcha-response" colspan="2"></td></tr>');
$newRow.children().first().append(
$td.find('input').removeAttr('style')
);
$newRow.find('#recaptcha_response_field')
.removeAttr('id')
.addClass('recaptcha_response_field')
.attr('placeholder', $('#recaptcha_response_field').attr('placeholder'));
$('#recaptcha_response_field').addClass('recaptcha_response_field')
$td.replaceWith($('<td class="recaptcha" colspan="2"></td>').append($('<span></span>').append($captchaimg)));
$newRow.insertAfter(this);
}
// Upload section
if ($td.find('input[type="file"]').length) {
if ($td.find('input[name="file_url"]').length) {
$file_url = $td.find('input[name="file_url"]');
// Make a new row for it
2013-09-16 00:11:54 +02:00
var $newRow = $('<tr><td colspan="2"></td></tr>');
$file_url.clone().attr('placeholder', _('Upload URL')).appendTo($newRow.find('td'));
$file_url.parent().remove();
$newRow.insertBefore(this);
$td.find('label').remove();
$td.contents().filter(function() {
return this.nodeType == 3; // Node.TEXT_NODE
}).remove();
$td.find('input[name="file_url"]').removeAttr('id');
}
if ($(this).find('input[name="spoiler"]').length) {
$td.removeAttr('colspan');
}
}
// Remove mod controls, because it looks shit.
if ($td.find('input[type="checkbox"]').length) {
var tr = this;
$td.find('input[type="checkbox"]').each(function() {
if ($(this).attr('name') == 'spoiler') {
$td.find('label').remove();
$(this).attr('id', 'q-spoiler-image');
$postForm.find('input[type="file"]').parent()
.removeAttr('colspan')
.after($('<td class="spoiler"></td>').append(this, ' ', $('<label for="q-spoiler-image">').text(_('Spoiler Image'))));
} else {
$(tr).remove();
}
});
}
2013-09-16 04:16:20 +02:00
$td.find('small').hide();
}
2012-03-14 09:41:56 +01:00
});
$postForm.find('textarea[name="body"]').removeAttr('id').removeAttr('cols').attr('placeholder', _('Comment'));
2013-09-15 06:03:27 +02:00
2013-09-16 00:11:54 +02:00
$postForm.find('textarea:not([name="body"]),input[type="hidden"]').removeAttr('id').appendTo($dummyStuff);
2013-09-15 06:03:27 +02:00
$postForm.find('br').remove();
2013-09-15 19:20:11 +02:00
$postForm.find('table').prepend('<tr><th colspan="2">\
2013-09-16 00:11:54 +02:00
<span class="handle">\
<a class="close-btn" href="javascript:void(0)">X</a>\
' + _('Quick Reply') + '\
</span>\
2013-09-15 19:20:11 +02:00
</th></tr>');
$postForm.attr('id', 'quick-reply');
2013-09-15 03:28:32 +02:00
$postForm.appendTo($('body')).hide();
2013-09-15 19:51:36 +02:00
$origPostForm = $('form[name="post"]:first');
// Synchronise body text with original post form
2013-09-15 19:51:36 +02:00
$origPostForm.find('textarea[name="body"]').bind('change input propertychange', function() {
$postForm.find('textarea[name="body"]').val($(this).val());
});
$postForm.find('textarea[name="body"]').bind('change input propertychange', function() {
2013-09-15 19:51:36 +02:00
$origPostForm.find('textarea[name="body"]').val($(this).val());
});
$postForm.find('textarea[name="body"]').focus(function() {
$origPostForm.find('textarea[name="body"]').removeAttr('id');
$(this).attr('id', 'body');
});
$origPostForm.find('textarea[name="body"]').focus(function() {
$postForm.find('textarea[name="body"]').removeAttr('id');
$(this).attr('id', 'body');
});
// Synchronise other inputs
2013-09-15 19:51:36 +02:00
$origPostForm.find('input[type="text"],select').bind('change input propertychange', function() {
2013-09-14 23:40:49 +02:00
$postForm.find('[name="' + $(this).attr('name') + '"]').val($(this).val());
});
2013-09-14 23:37:57 +02:00
$postForm.find('input[type="text"],select').bind('change input propertychange', function() {
2013-09-15 19:51:36 +02:00
$origPostForm.find('[name="' + $(this).attr('name') + '"]').val($(this).val());
2013-09-15 00:00:02 +02:00
});
2013-09-15 03:18:46 +02:00
2013-09-15 19:20:11 +02:00
if (typeof $postForm.draggable != 'undefined') {
2013-09-15 03:18:46 +02:00
if (localStorage.quickReplyPosition) {
var offset = JSON.parse(localStorage.quickReplyPosition);
if (offset.right > $(window).width() - $postForm.width())
offset.right = $(window).width() - $postForm.width();
if (offset.top > $(window).height() - $postForm.height())
offset.top = $(window).height() - $postForm.height();
$postForm.css('right', offset.right).css('top', offset.top);
}
$postForm.draggable({
2013-09-15 19:20:11 +02:00
handle: 'th .handle',
2013-09-15 03:18:46 +02:00
containment: 'window',
distance: 10,
scroll: false,
stop: function() {
var offset = {
top: $(this).offset().top - $(window).scrollTop(),
right: $(window).width() - $(this).offset().left - $(this).width(),
};
localStorage.quickReplyPosition = JSON.stringify(offset);
$postForm.css('right', offset.right).css('top', offset.top).css('left', 'auto');
}
});
2013-09-15 19:20:11 +02:00
$postForm.find('th .handle').css('cursor', 'move');
2013-09-15 03:18:46 +02:00
}
2013-09-15 19:20:11 +02:00
$postForm.find('th .close-btn').click(function() {
2013-09-15 22:44:33 +02:00
$origPostForm.find('textarea[name="body"]').attr('id', 'body');
2013-09-15 19:20:11 +02:00
$postForm.remove();
});
2013-09-16 00:11:54 +02:00
// Fix bug when table gets too big for form. Shouldn't exist, but crappy CSS etc.
$postForm.show();
$postForm.width($postForm.find('table').width());
$postForm.hide();
2013-09-15 06:03:27 +02:00
$(window).trigger('quick-reply');
2013-09-15 00:00:02 +02:00
2013-09-15 03:28:32 +02:00
$(window).ready(function() {
$(window).scroll(function() {
if ($(this).width() <= 800)
return;
if ($(this).scrollTop() < $origPostForm.offset().top + $origPostForm.height() - 100)
$postForm.fadeOut(100);
else
$postForm.fadeIn(100);
}).on('stylesheet', function() {
do_css();
if ($('link#stylesheet').attr('href')) {
$('link#stylesheet')[0].onload = do_css;
}
2013-09-15 22:44:33 +02:00
}).scroll();
2013-09-15 02:42:50 +02:00
});
};
2012-03-14 09:41:56 +01:00
$(window).on('cite', function(e, id, with_link) {
if ($(this).width() <= 800)
return;
show_quick_reply();
$('#quick-reply textarea').focus();
if (with_link) {
2013-09-15 03:18:46 +02:00
$(window).ready(function() {
if ($('#' + id).length) {
highlightReply(id);
$(window).scrollTop($('#' + id).offset().top);
}
});
}
});