166 lines
5.9 KiB
JavaScript
166 lines
5.9 KiB
JavaScript
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
*
|
|
* This Source Code Form is "Incompatible With Secondary Licenses", as
|
|
* defined by the Mozilla Public License, v. 2.0.
|
|
*/
|
|
|
|
function updateCommentPrivacy(checkbox, id) {
|
|
var comment_elem = document.getElementById('comment_text_'+id).parentNode;
|
|
if (checkbox.checked) {
|
|
if (!comment_elem.className.match('bz_private')) {
|
|
comment_elem.className = comment_elem.className.concat(' bz_private');
|
|
}
|
|
}
|
|
else {
|
|
comment_elem.className =
|
|
comment_elem.className.replace(/(\s*|^)bz_private(\s*|$)/, '$2');
|
|
}
|
|
}
|
|
|
|
/* The functions below expand and collapse comments */
|
|
|
|
function toggle_comment_display(link, comment_id) {
|
|
var comment = document.getElementById('comment_text_' + comment_id);
|
|
if (YAHOO.util.Dom.hasClass(comment, 'collapsed')) {
|
|
expand_comment(link, comment, comment_id);
|
|
} else {
|
|
collapse_comment(link, comment, comment_id);
|
|
}
|
|
}
|
|
|
|
function toggle_all_comments(action) {
|
|
// If for some given ID the comment doesn't exist, this doesn't mean
|
|
// there are no more comments, but that the comment is private and
|
|
// the user is not allowed to view it.
|
|
|
|
var comments = YAHOO.util.Dom.getElementsByClassName('bz_comment_text');
|
|
for (var i = 0; i < comments.length; i++) {
|
|
var comment = comments[i];
|
|
if (!comment)
|
|
continue;
|
|
var id = comment.id.match(/^comment_text_(\d*)$/);
|
|
if (!id)
|
|
continue;
|
|
id = id[1];
|
|
var link = document.getElementById('comment_link_' + id);
|
|
if (action == 'collapse') {
|
|
collapse_comment(link, comment, id);
|
|
} else {
|
|
expand_comment(link, comment, id);
|
|
}
|
|
}
|
|
}
|
|
|
|
function collapse_comment(link, comment, comment_id) {
|
|
link.innerHTML = "[+]";
|
|
YAHOO.util.Dom.addClass(comment, 'collapsed');
|
|
YAHOO.util.Dom.addClass('comment_tag_' + comment_id, 'collapsed');
|
|
}
|
|
|
|
function expand_comment(link, comment, comment_id) {
|
|
link.innerHTML = "[−]";
|
|
YAHOO.util.Dom.addClass('cr' + comment_id, 'collapsed');
|
|
YAHOO.util.Dom.removeClass('c' + comment_id, 'bz_default_collapsed');
|
|
YAHOO.util.Dom.removeClass(comment, 'collapsed');
|
|
YAHOO.util.Dom.removeClass('comment_tag_' + comment_id, 'collapsed');
|
|
}
|
|
|
|
function wrapReplyText(text) {
|
|
// This is -3 to account for "\n> "
|
|
var maxCol = BUGZILLA.constant.COMMENT_COLS - 3;
|
|
var text_lines = text.replace(/[\s\n]+$/, '').split("\n");
|
|
var wrapped_lines = new Array();
|
|
|
|
for (var i = 0; i < text_lines.length; i++) {
|
|
var paragraph = text_lines[i];
|
|
// Don't wrap already-quoted text.
|
|
if (paragraph.indexOf('>') == 0) {
|
|
wrapped_lines.push('> ' + paragraph);
|
|
continue;
|
|
}
|
|
|
|
var replace_lines = new Array();
|
|
while (paragraph.length > maxCol) {
|
|
var testLine = paragraph.substring(0, maxCol);
|
|
var pos = testLine.search(/\s\S*$/);
|
|
|
|
if (pos < 1) {
|
|
// Try to find some ASCII punctuation that's reasonable
|
|
// to break on.
|
|
var punct = '\\-\\./,!;:';
|
|
var punctRe = new RegExp('[' + punct + '][^' + punct + ']+$');
|
|
pos = testLine.search(punctRe) + 1;
|
|
// Try to find some CJK Punctuation that's reasonable
|
|
// to break on.
|
|
if (pos == 0)
|
|
pos = testLine.search(/[\u3000\u3001\u3002\u303E\u303F]/) + 1;
|
|
// If we can't find any break point, we simply break long
|
|
// words. This makes long, punctuation-less CJK text wrap,
|
|
// even if it wraps incorrectly.
|
|
if (pos == 0) pos = maxCol;
|
|
}
|
|
|
|
var wrapped_line = paragraph.substring(0, pos);
|
|
replace_lines.push(wrapped_line);
|
|
paragraph = paragraph.substring(pos);
|
|
// Strip whitespace from the start of the line
|
|
paragraph = paragraph.replace(/^\s+/, '');
|
|
}
|
|
replace_lines.push(paragraph);
|
|
wrapped_lines.push("> " + replace_lines.join("\n> "));
|
|
}
|
|
return wrapped_lines.join("\n") + "\n\n";
|
|
}
|
|
|
|
/* This way, we are sure that browsers which do not support JS
|
|
* won't display this link */
|
|
|
|
function addCollapseLink(count, collapsed, title) {
|
|
document.write(' <a href="#" class="bz_collapse_comment"' +
|
|
' id="comment_link_' + count +
|
|
'" onclick="toggle_comment_display(this, ' + count +
|
|
'); return false;" title="' + title + '">[' +
|
|
(collapsed ? '+' : '−') + ']<\/a> ');
|
|
}
|
|
|
|
function goto_add_comments( anchor ){
|
|
anchor = (anchor || "add_comment");
|
|
// we need this line to expand the comment box
|
|
document.getElementById('comment').focus();
|
|
setTimeout(function(){
|
|
document.location.hash = anchor;
|
|
// firefox doesn't seem to keep focus through the anchor change
|
|
document.getElementById('comment').focus();
|
|
},10);
|
|
return false;
|
|
}
|
|
|
|
if (typeof Node == 'undefined') {
|
|
/* MSIE doesn't define Node, so provide a compatibility object */
|
|
window.Node = {
|
|
TEXT_NODE: 3,
|
|
ENTITY_REFERENCE_NODE: 5
|
|
};
|
|
}
|
|
|
|
/* Concatenates all text from element's childNodes. This is used
|
|
* instead of innerHTML because we want the actual text (and
|
|
* innerText is non-standard).
|
|
*/
|
|
function getText(element) {
|
|
var child, text = "";
|
|
for (var i=0; i < element.childNodes.length; i++) {
|
|
child = element.childNodes[i];
|
|
var type = child.nodeType;
|
|
if (type == Node.TEXT_NODE || type == Node.ENTITY_REFERENCE_NODE) {
|
|
text += child.nodeValue;
|
|
} else {
|
|
/* recurse into nodes of other types */
|
|
text += getText(child);
|
|
}
|
|
}
|
|
return text;
|
|
}
|