|
|
Line 21: |
Line 21: |
| | | |
| document.getElementById('baloogan_image').onclick = handleClick; | | document.getElementById('baloogan_image').onclick = handleClick; |
− |
| |
− |
| |
− |
| |
− |
| |
− |
| |
− |
| |
− |
| |
− |
| |
− |
| |
− | // Discussion mediawiki extension
| |
− | // version 2.1
| |
− | // Copyright (c) 2009-2011 Vladimir Kolmogorov http://commenterra.com
| |
− |
| |
− | CallInitAjaxDiscussion();
| |
− | function CallInitAjaxDiscussion()
| |
− | {
| |
− | if (typeof window.ajax_discussions!='object') return;
| |
− | for (i in window.ajax_discussions)
| |
− | {
| |
− | x = window.ajax_discussions[i];
| |
− | if (!x) continue;
| |
− | window.ajax_discussions[i] = null;
| |
− | InitAjaxDiscussion(x);
| |
− | }
| |
− | }
| |
− |
| |
− | function ScrollToElement(x)
| |
− | {
| |
− | var y = 0;
| |
− | while (x != null)
| |
− | {
| |
− | y += x.offsetTop;
| |
− | x = x.offsetParent;
| |
− | }
| |
− | window.scroll(0,y-20);
| |
− | }
| |
− |
| |
− | function SetDiscussionCookie(cookie_name, value)
| |
− | {
| |
− | document.cookie = 'ajax-discussion-' + cookie_name + '=' + value + '; expires=Wed, 1 Jan 2020 12:0:0 GMT;path=/;';
| |
− | }
| |
− |
| |
− | function GetDiscussionCookie(cookie_name)
| |
− | {
| |
− | var m = RegExp('ajax-discussion-' + cookie_name + '=([^;]*)').exec(document.cookie);
| |
− | if (m) return m[1];
| |
− | return null;
| |
− | }
| |
− |
| |
− |
| |
− | function _DisplayDiscussionTime(t, format)
| |
− | {
| |
− | if (format == 0)
| |
− | {
| |
− | var a = new Date();
| |
− | t = parseInt((a.getTime() - wgDiscussionClientTime.getTime())/1000) + wgDiscussionServerTime - t;
| |
− | if (t < 0) t = 0;
| |
− |
| |
− | var i, a = [60, 60, 24, 7, 30/7, 365*7/30];
| |
− | for (i=0; ; i++)
| |
− | {
| |
− | if (i == 6 || t < a[i]) return D_MSG_NTimeAgo(Math.floor(t), i);
| |
− | t /= a[i];
| |
− | }
| |
− | }
| |
− | else
| |
− | {
| |
− | function display_two_digits(i) { return (i < 10) ? ('0'+i) : i; }
| |
− | var a = new Date(1000*t);
| |
− | return D_MSG_NDate(a.getDate(), a.getMonth()) + ' ' + a.getFullYear() + ", " + display_two_digits(a.getHours()) + ":" + display_two_digits(a.getMinutes());
| |
− | }
| |
− | }
| |
− |
| |
− | function DisplayDiscussionTime(t, edit_t, format)
| |
− | {
| |
− | var s = _DisplayDiscussionTime(t, format);
| |
− | if (edit_t>=0) s += ', ' + D_MSG_lastEdit + ' ' + _DisplayDiscussionTime(edit_t, format);
| |
− | return s;
| |
− | }
| |
− |
| |
− | function LimitDiscussionCommentCharacters(t, limit, counter)
| |
− | {
| |
− | if (limit <= 0) return;
| |
− | while ( 1 )
| |
− | {
| |
− | var n = limit - t.value.replace(/\r/g, '').replace(/\n(> )+/g, '\n').replace(/^(> )+/g, '').length;
| |
− | if (n >= 0) { counter.value = n; return; }
| |
− | t.value = t.value.substring(0, t.value.length+n);
| |
− | }
| |
− | }
| |
− |
| |
− | function _FormatDiscussionComment(input) // duplicated in DiscussionSpecialPage.php
| |
− | {
| |
− | var flag = -1, t = '', q = '';
| |
− | var i, i_max, lines = input.split('\n');
| |
− | for (i_max=lines.length-1; ;i_max--)
| |
− | {
| |
− | if (i_max < 0) return ' ';
| |
− | if (lines[i_max].match(/\S/)) break;
| |
− | }
| |
− | for (i=0; ;i++)
| |
− | {
| |
− | if (lines[i].match(/\S/)) break;
| |
− | }
| |
− | for (; i<=i_max; i++)
| |
− | {
| |
− | var s = lines[i];
| |
− | if (s.substring(0, 2) == '> ')
| |
− | {
| |
− | s = s.substring(2, s.length);
| |
− | if (flag > 0) q += '\n';
| |
− | q += s;
| |
− | flag = 1;
| |
− | }
| |
− | else
| |
− | {
| |
− | s = s.replace(/>/g, '>').replace(/</g, '<');
| |
− | s = s.replace(/(\s)(http:\/\/\S*)/g, '$1<a href="$2">$2</a>').replace(/^(http:\/\/\S*)/, '<a href="$1">$1</a>');
| |
− | var m = /^(\s*)([\s\S]*)$/.exec(s);
| |
− | if (m) s = m[1].replace(/\t/g, ' ').replace(/ /g, ' ') + m[2];
| |
− | if (flag > 0) { t += '<div class="discussion-comment-quote">' + _FormatDiscussionComment(q) + '</div>'; q = ''; }
| |
− | else if (flag == 0) t += '<br />';
| |
− | t += s;
| |
− | flag = 0;
| |
− | }
| |
− | }
| |
− | if (flag > 0) t += '<div class="discussion-comment-quote">' + _FormatDiscussionComment(q) + '</div>';
| |
− | return t;
| |
− | }
| |
− |
| |
− | function FormatDiscussionComment(text)
| |
− | {
| |
− | return _FormatDiscussionComment(text.replace(/\r/g, ''));
| |
− | }
| |
− |
| |
− | function DisplayAdminActions(status)
| |
− | {
| |
− | var s = '';
| |
− | if (status == 2) s += ' <span class="discussion-action0">'+D_MSG_AdminActionHide+'</span> ';
| |
− | else s += ' <a class="discussion-action" onclick="DiscussionChangeCommentStatus(parentNode, 2);return false;">'+D_MSG_AdminActionHide+'</a> ';
| |
− | if (status == 1) s += ' <span class="discussion-action0">'+D_MSG_AdminActionBlock+'</span> ';
| |
− | else s += ' <a class="discussion-action" title="'+D_MSG_CommentWillAppearAsBlocked+'" onclick="DiscussionChangeCommentStatus(parentNode, 1);return false;">'+D_MSG_AdminActionBlock+'</a> ';
| |
− | if (status == 0) s += ' <span class="discussion-action0">'+D_MSG_AdminActionApprove+'</span> ';
| |
− | else s += ' <a class="discussion-action" onclick="DiscussionChangeCommentStatus(parentNode, 0);return false;">'+D_MSG_AdminActionApprove+'</a> ';
| |
− | return s;
| |
− | }
| |
− |
| |
− | function DisplayDiscussionComment(params, c)
| |
− | {
| |
− | var reply_action = '', admin_actions = '', edit_action = '';
| |
− | if (params.can_post > 0)
| |
− | {
| |
− | var h = (c.status != 0) ? ' style="visibility:hidden;"' : '';
| |
− | reply_action = '<a class="discussion-action"'+h+' onclick="\
| |
− | var w=document.getElementById(\''+params.id+'\');\
| |
− | if (!onDiscussionAction(w)) return false;\
| |
− | w.my.post.parent = parentNode.parentNode.parentNode;\
| |
− | PostCommentInit(w);\
| |
− | return false;\
| |
− | ">'+D_MSG_Reply+'</a>';
| |
− | }
| |
− | else if (params.can_post < 0)
| |
− | {
| |
− | reply_action = '<a class="discussion-action discussion-disabled" href="'+params.login_url+'" title="'+D_MSG_PleaseSignIn+'">'+D_MSG_Reply+'</a>';
| |
− | }
| |
− |
| |
− | if (params.can_do_admin) admin_actions = '<div class="discussion-action" style="width:30px;height:1px;"></div><span>'+DisplayAdminActions(c.status)+'</span>';
| |
− |
| |
− | if (wgUserName && c.author_id && c.author_id==wgUserName)
| |
− | {
| |
− | edit_action = '<a class="discussion-action" onclick="\
| |
− | var w=document.getElementById(\''+params.id+'\');\
| |
− | if (!onDiscussionAction(w)) return false;\
| |
− | w.my.post.edit = parentNode.parentNode.parentNode;\
| |
− | PostCommentInit(w);\
| |
− | return false;\
| |
− | ">'+D_MSG_Edit+'</a>';
| |
− | }
| |
− |
| |
− | var header;
| |
− | if (params.can_view < 2 && c.status != 0)
| |
− | {
| |
− | header = '<em>'+D_MSG_ThisCommentHasBeenBlocked+'</em>';
| |
− | }
| |
− | else
| |
− | {
| |
− | header = '<div class="discussion-comment-author">' + c.author + '</div>'
| |
− | + '<div class="discussion-comment-date">(' + DisplayDiscussionTime(c.time, c.edit_time, params.time_format) + ')</div>'
| |
− | + reply_action
| |
− | + admin_actions
| |
− | + edit_action; // DiscussionChangeCommentStatusFinish() assumes that admin_actions follows reply_action immediately
| |
− | }
| |
− |
| |
− | var highlight = (c.id == params.comment_to_highlight) ? '-highlight' : '';
| |
− |
| |
− | return '<div class="discussion-comment-header' + highlight + '">'
| |
− | + header
| |
− | + '<div style="clear:both;"></div>'
| |
− | + '</div>'
| |
− | + '<div class="discussion-comment-text' + highlight + '">'
| |
− | + FormatDiscussionComment(c.text)
| |
− | + '</div>';
| |
− | }
| |
− |
| |
− | //////////////////////// permissions /////////////////////
| |
− | function in_array(x, array)
| |
− | {
| |
− | for (var k=0; k<array.length; k++)
| |
− | {
| |
− | if (array[k] == x) return true;
| |
− | }
| |
− | return false;
| |
− | }
| |
− |
| |
− | function DiscussionCanView(groups, params)
| |
− | {
| |
− | if (in_array(params.moderator_group, groups)) return 2;
| |
− | if (in_array(params.view_group, groups)) return 1;
| |
− | return 0;
| |
− | }
| |
− |
| |
− | function DiscussionCanPost(groups, params)
| |
− | {
| |
− | if (in_array(params.moderator_group, groups)) return 2;
| |
− | if (in_array(params.post_group, groups)) return 2;
| |
− | if (in_array(params.restricted_post_group, groups)) return 1;
| |
− | return 0;
| |
− | }
| |
− |
| |
− | function DiscussionCanDoAdmin(groups, params)
| |
− | {
| |
− | if (in_array(params.moderator_group, groups)) return true;
| |
− | return false;
| |
− | }
| |
− | //////////////////////// permissions end /////////////////
| |
− |
| |
− | function InitAjaxDiscussion(params)
| |
− | {
| |
− | var w = document.getElementById(params.id);
| |
− | if (!w) return;
| |
− |
| |
− | var user = wgUserName, groups = wgUserGroups;
| |
− | if (!user) groups = ["*"];
| |
− | params.can_view = DiscussionCanView(groups, params);
| |
− | if (!params.can_view)
| |
− | {
| |
− | document.getElementById(params.id+'_HEADER_VISIBLE').style.display = 'none';
| |
− | w.innerHTML = '';
| |
− | return;
| |
− | }
| |
− | params.can_post = DiscussionCanPost(groups, params);
| |
− | if (!params.can_post && !wgUserName && (params.post_group == 'user' || params.restricted_post_group == 'user'))
| |
− | {
| |
− | params.can_post = -1; // indicates that the user can post after logging in
| |
− | }
| |
− | params.can_do_admin = DiscussionCanDoAdmin(groups, params);
| |
− |
| |
− | switch (typeof params.page_sizes)
| |
− | {
| |
− | case 'string': params.page_sizes = params.page_sizes.split(','); break;
| |
− | case 'number': params.page_sizes = [params.page_sizes]; break;
| |
− | default: break;
| |
− | }
| |
− | var i;
| |
− | for (i=0; i<params.page_sizes.length; i++)
| |
− | {
| |
− | params.page_sizes[i] = parseInt(params.page_sizes[i]);
| |
− | if (params.page_sizes[i] < 1) params.page_sizes[i] = 1;
| |
− | }
| |
− | params.page_size = params.page_sizes[0];
| |
− | i = parseInt(GetDiscussionCookie('page_size'));
| |
− | if (in_array(i, params.page_sizes)) params.page_size = i;
| |
− |
| |
− | params.retrieve_block_size = 3*params.page_size;
| |
− | params.page_size0 = params.page_size;
| |
− |
| |
− | var time_format = GetDiscussionCookie('time_format');
| |
− | if (time_format === null) time_format = params.time_format;
| |
− | params.time_format = (parseInt(time_format)) ? 1 : 0;
| |
− |
| |
− | w.my = {};
| |
− | w.my.params = params;
| |
− |
| |
− | InitDiscussionHeader(w);
| |
− |
| |
− | w.innerHTML =
| |
− | '<div class="discussion-loading" style="display:none">'+D_MSG_loading+'</div>'
| |
− | + '<div class="discussion-body"><div class="discussion-prev" style="display:none">...</div><div class="discussion-next" style="display:none">...</div></div>'
| |
− | w.my.loading = w.childNodes[0];
| |
− | w.my.body = w.childNodes[1];
| |
− | w.my.footer = document.getElementById(params.id + '_FOOTER');
| |
− | w.my.footer.style.display = 'none';
| |
− |
| |
− | w.my.comment_id_retrieved = 2147483647; // comments with id >= w.my.comment_id_retrieved have been retrieved
| |
− |
| |
− | w.my.comments = [];
| |
− | w.my.received_comment_num = 0;
| |
− | w.my.received_valid_comment_num = 0; // counts only comments that have been added to the DOM tree
| |
− | w.my.show_all = false;
| |
− | w.my.first_visible = null;
| |
− | w.my.last_visible = null;
| |
− |
| |
− | w.my.post = {};
| |
− | w.my.post.input = null;
| |
− | w.my.options_flag = 0;
| |
− |
| |
− | w.my.params.comment_to_highlight = 0;
| |
− | var url = document.location.href;
| |
− | var m = /\#comment=(\d*):(\d*)/.exec(url);
| |
− | if (m && m[1]==params.discussion_id)
| |
− | {
| |
− | w.my.params.comment_to_highlight = parseInt(m[2]);
| |
− | if (w.my.params.comment_to_highlight < 0) w.my.params.comment_to_highlight = 0;
| |
− | }
| |
− | w.my.params.comment_to_highlight_present = 0;
| |
− |
| |
− | var is_hidden;
| |
− | if (params.init_display.match(/\!hide/)) is_hidden = true;
| |
− | else if (params.init_display.match(/\!show/)) is_hidden = false;
| |
− | else
| |
− | {
| |
− | is_hidden = params.init_display.match(/hide/);
| |
− | if (GetDiscussionCookie('hidden') == 1) is_hidden = true;
| |
− | }
| |
− |
| |
− | if (is_hidden && !w.my.params.comment_to_highlight)
| |
− | {
| |
− | SetDiscussionStatus(w, -2);
| |
− | SetDiscussionHeader(w);
| |
− | }
| |
− | else
| |
− | {
| |
− | DisplayCommentsWithFixedStart(w);
| |
− | }
| |
− | }
| |
− |
| |
− | function onDiscussionAction(w)
| |
− | {
| |
− | if (w.my.status) return false;
| |
− | //var x = document.getElementById(w.my.params.id+'_OPTIONS_LINK');
| |
− | //if (x.flag) { x.flag = false; document.getElementById(w.my.params.id+'_OPTIONS').style.display='none'; }
| |
− | return true;
| |
− | }
| |
− |
| |
− | function sortNumber(a,b) { return a - b; }
| |
− |
| |
− | function InitDiscussionHeader(w, params)
| |
− | {
| |
− | var params = w.my.params;
| |
− | SetDiscussionHeader(w);
| |
− | if (w.events_added) return;
| |
− | w.events_added = true;
| |
− |
| |
− | var id = params.id, x;
| |
− |
| |
− | x = document.getElementById(id + '_COMMENT_NUM');
| |
− | x.w = w;
| |
− | addClickHandler(x, function() {
| |
− | if (w.my.status == -2)
| |
− | {
| |
− | SetDiscussionStatus(w, 0);
| |
− | SetDiscussionCookie('hidden', 0);
| |
− | if (!w.my.first_visible) DisplayCommentsWithFixedStart(w);
| |
− | }
| |
− | else
| |
− | {
| |
− | if (!onDiscussionAction(w)) return false;
| |
− | SetDiscussionCookie('hidden', 1);
| |
− | SetDiscussionStatus(w, -2);
| |
− | }
| |
− | return false;
| |
− | } );
| |
− |
| |
− | x = document.getElementById(id + '_POST');
| |
− | x.w = w;
| |
− | x.lastChild.innerHTML = D_MSG_PostComment;
| |
− | if (params.can_post > 0)
| |
− | {
| |
− | addClickHandler(x, function() {
| |
− | if (w.my.status == -2)
| |
− | {
| |
− | SetDiscussionStatus(w, 0);
| |
− | w.my.post_todo = true;
| |
− | if (!w.my.first_visible) DisplayCommentsWithFixedStart(w);
| |
− | }
| |
− | if (!onDiscussionAction(w)) return false;
| |
− | w.my.post_todo = false;
| |
− | w.my.post.parent = null;
| |
− | PostCommentInit(w);
| |
− | return false;
| |
− | } );
| |
− | }
| |
− | else if (params.can_post < 0)
| |
− | {
| |
− | x.href = params.login_url;
| |
− | x.title = D_MSG_PleaseSignIn;
| |
− | }
| |
− | else
| |
− | {
| |
− | x.style.display = 'none';
| |
− | }
| |
− |
| |
− | // options panel TODO
| |
− | }
| |
− |
| |
− | function SetDiscussionHeader(w)
| |
− | {
| |
− | var params = w.my.params;
| |
− | var id = params.id, x;
| |
− | var num = params.comment_num1;
| |
− | var comment_num = D_MSG_NComments(num);
| |
− | if (params.can_view == 2 && params.comment_num2 > 0)
| |
− | {
| |
− | var hnum = ', ' + D_MSG_NHiddenComments(params.comment_num2);
| |
− | num += hnum;
| |
− | comment_num += hnum;
| |
− | }
| |
− |
| |
− | x = document.getElementById(id + '_COMMENT_NUM');
| |
− | x.lastChild.innerHTML = comment_num;
| |
− |
| |
− | if (w.my.status == -2) x.title = 'show';
| |
− | else x.title = 'hide';
| |
− | }
| |
− |
| |
− | function SetDiscussionFooter(w)
| |
− | {
| |
− | if (!(w.my.status == 0 && w.my.received_valid_comment_num))
| |
− | {
| |
− | w.my.footer.style.display = 'none';
| |
− | return;
| |
− | }
| |
− |
| |
− | var sl = '', sr = '';
| |
− |
| |
− | var prev = MoveToNeighbor(w, w.my.first_visible, -1, 0), next = MoveToNeighbor(w, w.my.last_visible, 1, 0);
| |
− | if (w.my.params.recent_link)
| |
− | {
| |
− | sr += ' <a class="discussion-action" href="'+w.my.params.recent_link+'"><b>'+D_MSG_RecentComments+'</b></a> ';
| |
− | }
| |
− | if (!w.my.show_all)
| |
− | {
| |
− | sr += ' <a class="discussion-action" onclick="\
| |
− | var w=document.getElementById(\''+w.my.params.id+'\');\
| |
− | if (!w.my.status) onDiscussionShowAll(w, true);\
| |
− | return false;\
| |
− | "><b>'+D_MSG_ShowAllComments+'</b></a> ';
| |
− | }
| |
− | if (prev)
| |
− | {
| |
− | sl += ' <a style="cursor:pointer;" onclick="\
| |
− | var w=document.getElementById(\''+w.my.params.id+'\');\
| |
− | if (!w.my.status) onDiscussionPrev(w);\
| |
− | return false;\
| |
− | "><b>'+D_MSG_Previous+'</b></a> ';
| |
− | }
| |
− | if (next)
| |
− | {
| |
− | sl += ' <a style="cursor:pointer;" onclick="\
| |
− | var w=document.getElementById(\''+w.my.params.id+'\');\
| |
− | if (!w.my.status) onDiscussionNext(w);\
| |
− | return false;\
| |
− | "><b>'+((w.my.params.incremental && !w.my.show_all) ? D_MSG_More : D_MSG_Next)+'</b></a> ';
| |
− | }
| |
− |
| |
− | w.my.footer.firstChild.firstChild.firstChild.innerHTML = sl;
| |
− | w.my.footer.firstChild.firstChild.lastChild.innerHTML = sr;
| |
− | w.my.footer.style.display = (w.my.params.comment_num1 > 0) ? '' : 'none';
| |
− | }
| |
− |
| |
− | ///////////////////////////////////////
| |
− |
| |
− | // -2:hidden
| |
− | // -1:posting a comment or admin action
| |
− | // 0:normal
| |
− | // 1:waiting for comments from the server
| |
− | // 2:redrawing
| |
− | function SetDiscussionStatus(w, status)
| |
− | {
| |
− | var old_status = w.my.status;
| |
− | if (status == -2)
| |
− | {
| |
− | w.my.loading.style.display = 'none';
| |
− | w.my.body.style.display = 'none';
| |
− | }
| |
− | else
| |
− | {
| |
− | if (w.my.params.incremental && !w.my.show_all)
| |
− | {
| |
− | w.my.body.style.display = '';
| |
− | }
| |
− | else
| |
− | {
| |
− | if (status > 0) w.my.body.style.display = 'none';
| |
− | w.my.loading.style.display = (status == 1) ? '' : 'none';
| |
− | if (w.my.show_all && w.my.params.show_all_order==0 && ((status>0 && old_status<=0) || (status<=0 && old_status>0)))
| |
− | {
| |
− | ReverseVisibleComments(w);
| |
− | }
| |
− | if (status <= 0) w.my.body.style.display = '';
| |
− | }
| |
− | }
| |
− | w.my.status = status;
| |
− | if (old_status == -2 || status == -2) SetDiscussionHeader(w);
| |
− | SetDiscussionFooter(w);
| |
− | if (status == 0 && w.my.post_todo)
| |
− | {
| |
− | w.my.post_todo = false;
| |
− | w.my.post.parent = null;
| |
− | PostCommentInit(w);
| |
− | }
| |
− | }
| |
− |
| |
− | function ReverseVisibleComments(w)
| |
− | {
| |
− | if (!w.my.first_visible) return;
| |
− | var first_visible_prev = MoveToNeighbor(w, w.my.first_visible, -1, 0);
| |
− | var last_visible_next = MoveToNeighbor(w, w.my.last_visible, 1, 0);
| |
− | var last = w.my.last_visible; while (last.my.depth > 0) last = last.parentNode.parentNode.parentNode;
| |
− | if (last == w.my.first_visible) return;
| |
− | var next = last.nextSibling;
| |
− | while ( 1 )
| |
− | {
| |
− | var x = last.previousSibling;
| |
− | var y = x.cloneNode(true), xx = x, yy = y;
| |
− | while ( 1 )
| |
− | {
| |
− | yy.my = xx.my;
| |
− | xx = MoveToNextTreeNeighbor(xx);
| |
− | if (xx.my.depth <= x.my.depth) break;
| |
− | yy = MoveToNextTreeNeighbor(yy);
| |
− | }
| |
− | w.my.body.removeChild(x);
| |
− | w.my.body.insertBefore(y, next);
| |
− | if (x == w.my.first_visible) break;
| |
− | }
| |
− | w.my.first_visible = MoveToNeighbor(w, first_visible_prev, 1, 0);
| |
− | w.my.last_visible = MoveToNeighbor(w, last_visible_next, -1, 0);
| |
− | }
| |
− |
| |
− | ///////////////////////////////////////
| |
− |
| |
− | function DisplayCommentsWithFixedStart(w)
| |
− | {
| |
− | var need_to_request_more_comments = false;
| |
− | if (w.my.first_visible)
| |
− | {
| |
− | var x, n;
| |
− | if (!w.my.show_all)
| |
− | {
| |
− | for (n=1, x=w.my.first_visible; x != w.my.last_visible; n++) x = MoveToNeighbor(w, x, 1, 0);
| |
− | while ( n > w.my.params.page_size )
| |
− | {
| |
− | w.my.last_visible = MoveToNeighbor(w, w.my.last_visible, -1, -1);
| |
− | n --;
| |
− | }
| |
− | while ( n < w.my.params.page_size )
| |
− | {
| |
− | x = MoveToNeighbor(w, w.my.last_visible, 1, 1);
| |
− | if (!x) break;
| |
− | w.my.last_visible = x;
| |
− | n ++;
| |
− | }
| |
− | if (w.my.comment_id_retrieved && (n < w.my.params.page_size || !MoveToNeighbor(w, w.my.last_visible, 1, 0))) need_to_request_more_comments = true;
| |
− | }
| |
− | else
| |
− | {
| |
− | var flag = -1;
| |
− | for (n=1, x=w.my.first_visible; x; n++)
| |
− | {
| |
− | if (x.my.depth == 0)
| |
− | {
| |
− | if (n>w.my.params.show_all_page_size) break;
| |
− | if (x==w.my.body.lastChild.previousSibling && w.my.comment_id_retrieved)
| |
− | {
| |
− | need_to_request_more_comments = true;
| |
− | break;
| |
− | }
| |
− | }
| |
− | if (x == w.my.last_visible) flag = 1;
| |
− | x = MoveToNextTreeNeighbor(x);
| |
− | }
| |
− | if (!need_to_request_more_comments)
| |
− | {
| |
− | x = MoveToNeighbor(w, x, -1, 0);
| |
− | while ( w.my.last_visible != x ) w.my.last_visible = MoveToNeighbor(w, w.my.last_visible, flag, flag);
| |
− | }
| |
− | }
| |
− | }
| |
− | else need_to_request_more_comments = w.my.comment_id_retrieved;
| |
− |
| |
− | var c = w.my.params.comment_to_highlight;
| |
− | if (c && w.my.params.comment_to_highlight_present!=2)
| |
− | {
| |
− | if (w.my.params.comment_to_highlight_present==1 || c<w.my.comment_id_retrieved) need_to_request_more_comments = true;
| |
− | c = null;
| |
− | }
| |
− |
| |
− | if (need_to_request_more_comments)
| |
− | {
| |
− | SetDiscussionStatus(w, 1);
| |
− | var comments = w.my.params.init_comments;
| |
− | w.my.params.init_comments = null;
| |
− | if (comments && (w.my.params.can_view < 2 || !w.my.params.init_view_flag))
| |
− | {
| |
− | ProcessAjaxComments({responseText:comments});
| |
− | }
| |
− | else
| |
− | {
| |
− | sajax_do_call( "wfAjaxQueryComments", [w.my.params.discussion_id, w.my.params.retrieve_block_size, w.my.comment_id_retrieved], ProcessAjaxComments );
| |
− | }
| |
− | }
| |
− | else
| |
− | {
| |
− | SetDiscussionStatus(w, 0);
| |
− |
| |
− | if (!w.my.first_visible) return;
| |
− |
| |
− | if (!w.my.init_flag)
| |
− | {
| |
− | w.my.init_flag = true;
| |
− | var prev = MoveToNeighbor(w, w.my.first_visible, -1, 0), next = MoveToNeighbor(w, w.my.last_visible, 1, 0);
| |
− | if (!prev && !next && !w.my.show_all)
| |
− | {
| |
− | onDiscussionShowAll(w, false);
| |
− | return;
| |
− | }
| |
− | }
| |
− |
| |
− | if (c && w.my.params.comment_to_highlight_present)
| |
− | {
| |
− | x = w.my.body.firstChild.nextSibling;
| |
− | while (x.my.id != c) x = MoveToNextTreeNeighbor(x);
| |
− | var y = x;
| |
− | while (y.my.depth > w.my.params.counted_depth) y = y.parentNode.parentNode.parentNode;
| |
− | if (y.my.is_visible)
| |
− | {
| |
− | ScrollToElement(x);
| |
− | w.my.params.comment_to_highlight = 0;
| |
− |
| |
− | }
| |
− | else
| |
− | {
| |
− | onDiscussionNext(w);
| |
− | }
| |
− | }
| |
− | }
| |
− | }
| |
− |
| |
− | function ProcessAjaxComments(request)
| |
− | {
| |
− | var x = request.responseText.split('|');
| |
− | var id = x[0];
| |
− | var w = document.getElementById(id);
| |
− | var i, comment_num1 = parseInt(x[1]), comment_num2 = parseInt(x[2]), n = parseInt(x[3]), n_comment_id_max_new = parseInt(x[4]), n_comment_id_max = parseInt(x[5]);
| |
− | if (x.length != 8*n+6 || n_comment_id_max != w.my.comment_id_retrieved) return;
| |
− |
| |
− | w.my.params.comment_num1 = comment_num1;
| |
− | w.my.params.comment_num2 = comment_num2;
| |
− | SetDiscussionHeader(w);
| |
− |
| |
− | w.my.comment_id_retrieved = n_comment_id_max_new;
| |
− | for (i=0; i<n; i++)
| |
− | {
| |
− | var c = {};
| |
− | c.id = parseInt(x[8*i+6]);
| |
− | c.parent = parseInt(x[8*i+7]);
| |
− | c.status = parseInt(x[8*i+8]);
| |
− | c.time = x[8*i+9];
| |
− | c.edit_time = x[8*i+10];
| |
− | c.author_id = x[8*i+11].replace(/\#1/g, '|').replace(/\#0/g, '#');
| |
− | c.author = x[8*i+12].replace(/\#1/g, '|').replace(/\#0/g, '#');
| |
− | c.text = x[8*i+13].replace(/\#1/g, '|').replace(/\#0/g, '#');
| |
− |
| |
− | w.my.comments[w.my.comments.length] = c;
| |
− | w.my.received_comment_num ++;
| |
− |
| |
− | if (c.id == w.my.params.comment_to_highlight) w.my.params.comment_to_highlight_present = 1;
| |
− | }
| |
− |
| |
− | IncreaseLastVisible(w, null); // make end of page visible, so that we can append new comments
| |
− | for (i=0; i<w.my.comments.length; i++) // first add comments of depth 0 (in rev chronological order)
| |
− | {
| |
− | c = w.my.comments[i];
| |
− | if (c.parent == 0) { DTreeAddComment(w, c); w.my.received_valid_comment_num ++; }
| |
− | }
| |
− | var unprocessed_comments = []; // comments whose parent has not been retrieved yet
| |
− | for (i=w.my.comments.length-1; i>=0; i--)
| |
− | {
| |
− | c = w.my.comments[i];
| |
− | if (c.parent == 0) continue;
| |
− | if (DTreeAddComment(w, c)) w.my.received_valid_comment_num ++;
| |
− | else unprocessed_comments[unprocessed_comments.length] = c;
| |
− | }
| |
− |
| |
− | w.my.comments = [];
| |
− | for (i=unprocessed_comments.length-1; i>=0; i--) w.my.comments[w.my.comments.length] = unprocessed_comments[i];
| |
− |
| |
− | if (w.my.received_valid_comment_num > 0)
| |
− | {
| |
− | if (!w.my.first_visible) w.my.first_visible = MoveToNeighbor(w, null, 1, 0);
| |
− | w.my.last_visible = MoveToNeighbor(w, null, -1, 0);
| |
− | }
| |
− | DisplayCommentsWithFixedStart(w);
| |
− | }
| |
− |
| |
− | function DTreeAddComment(w, c)
| |
− | {
| |
− | var p, depth = 0;
| |
− | if (!c.parent) p = w.my.body;
| |
− | else
| |
− | {
| |
− | p = document.getElementById(w.my.params.id + c.parent);
| |
− | if (!p) return false;
| |
− | depth = p.parentNode.my.depth + 1;
| |
− | p = p.lastChild;
| |
− | }
| |
− |
| |
− | var x = document.createElement('div');
| |
− | x.innerHTML =
| |
− | '<div class="discussion-comment gainlayout" id="'+w.my.params.id+c.id+'">'
| |
− | + DisplayDiscussionComment(w.my.params, c)
| |
− | + '<div class="discussion-reply-toggle" style="display:none"><a onclick="var x=parentNode.parentNode.parentNode;if(x.my.w.my.status)return false;if(x.my.is_expanded)onDiscussionCollapse(x);else onDiscussionExpand(x);return false;"></a></div>'
| |
− | + '<div class="discussion-reply-info" style="display:none"></div>'
| |
− | + '<div class="discussion-replies" style="display:none"><div class="discussion-prev" style="display:none">...</div><div class="discussion-next" style="display:none">...</div></div>'
| |
− | + '</div>';
| |
− |
| |
− | p.insertBefore(x, p.lastChild);
| |
− |
| |
− | var is_expanded = (!w.my.expand_all && (','+w.my.params.collapsed_depths+',').indexOf(','+depth+',')!=-1) ? 0 : 1;
| |
− | x.my = {w:w,id:c.id,text:c.text,time:c.time,status:c.status,author_id:c.author_id,depth:depth,reply_num:0,is_expanded:is_expanded,is_visible:1};
| |
− |
| |
− | var expand_flag = false;
| |
− | if (c.id == w.my.params.comment_to_highlight)
| |
− | {
| |
− | w.my.params.comment_to_highlight_present = 2;
| |
− | expand_flag = true;
| |
− | }
| |
− |
| |
− | while (p != w.my.body)
| |
− | {
| |
− | p = p.parentNode.parentNode;
| |
− | p.my.reply_num ++;
| |
− | var is_expanded = p.my.is_expanded;
| |
− | if (expand_flag) is_expanded = true;
| |
− | p.my.is_expanded = -1;
| |
− | SetExpandedStatus(p, is_expanded);
| |
− | p = p.parentNode;
| |
− | }
| |
− | return true;
| |
− | }
| |
− |
| |
− | ///////////////////////////////////////
| |
− |
| |
− | function onDiscussionPrev(w)
| |
− | {
| |
− | if (!w.my.show_all)
| |
− | {
| |
− | var m, n, x;
| |
− | for (n=1, x=w.my.first_visible; x != w.my.last_visible; n++) x = MoveToNeighbor(w, x, 1, 0);
| |
− | for (m=0; m<w.my.params.page_size; m++)
| |
− | {
| |
− | x = MoveToNeighbor(w, w.my.first_visible, -1, 1);
| |
− | if (!x) break;
| |
− | w.my.first_visible = x;
| |
− | n ++;
| |
− | if (n > w.my.params.page_size)
| |
− | {
| |
− | w.my.last_visible = MoveToNeighbor(w, w.my.last_visible, -1, -1);
| |
− | n --;
| |
− | }
| |
− | }
| |
− | }
| |
− | else
| |
− | {
| |
− | SetDiscussionStatus(w, 2);
| |
− | var first_visible_new = w.my.first_visible.my.show_all_prev;
| |
− | var last_visible_new = MoveToNeighbor(w, w.my.first_visible, -1, 0);
| |
− | DecreaseFirstVisible(w, first_visible_new);
| |
− | DecreaseLastVisible(w, last_visible_new);
| |
− | SetDiscussionStatus(w, 0);
| |
− | }
| |
− | SetDiscussionFooter(w);
| |
− | }
| |
− |
| |
− | function onDiscussionNext(w)
| |
− | {
| |
− | if (w.my.params.incremental && !w.my.show_all)
| |
− | {
| |
− | w.my.params.page_size += w.my.params.page_size0;
| |
− | }
| |
− | else
| |
− | {
| |
− | if (w.my.show_all) SetDiscussionStatus(w, 2);
| |
− | var x = MoveToNeighbor(w, w.my.last_visible, 1, 1);
| |
− | if (!x) return;
| |
− | w.my.last_visible = x;
| |
− | var first_visible_old = w.my.first_visible;
| |
− | IncreaseFirstVisible(w, x);
| |
− | if (w.my.show_all) w.my.first_visible.my.show_all_prev = first_visible_old;
| |
− | }
| |
− | DisplayCommentsWithFixedStart(w);
| |
− | }
| |
− |
| |
− | function onDiscussionExpand(x)
| |
− | {
| |
− | var w = x.my.w, last_visible_next = MoveToNeighbor(w, w.my.last_visible, 1, 0);
| |
− | if (x.my.depth >= w.my.params.counted_depth || w.my.show_all)
| |
− | {
| |
− | SetExpandedStatus(x, 1);
| |
− | if (x == w.my.last_visible) w.my.last_visible = MoveToNeighbor(w, last_visible_next, -1, 0);
| |
− | return;
| |
− | }
| |
− | var y, n0, n1, n, x_next0 = MoveToNeighbor(w, x, 1, 0);
| |
− | for (n0=0, y=x; y!=w.my.first_visible; n0++) y = MoveToNeighbor(w, y, -1, 0);
| |
− | for (n1=0, y=x; y!=w.my.last_visible; n1++) y = MoveToNeighbor(w, y, 1, 0);
| |
− | SetExpandedStatus(x, 1);
| |
− | if (x == w.my.last_visible) w.my.last_visible = MoveToNeighbor(w, last_visible_next, -1, 0);
| |
− | for (y=x, n=n0+n1; y!=x_next0; y=MoveToNeighbor(w, y, 1, 0), n++)
| |
− | {
| |
− | y.my.is_visible = 1;
| |
− | y.style.display = '';
| |
− | y.lastChild.lastChild.firstChild.style.display = 'none';
| |
− | y.lastChild.lastChild.lastChild.style.display = 'none';
| |
− | }
| |
− | if (w.my.params.incremental) w.my.params.page_size += n - (n0+n1) - 1;
| |
− | for ( ; n>w.my.params.page_size && n1>0; n--, n1--) w.my.last_visible = MoveToNeighbor(w, w.my.last_visible, -1, -1);
| |
− | for ( ; n>w.my.params.page_size && n0>0; n--, n0--) w.my.first_visible = MoveToNeighbor(w, w.my.first_visible, 1, -1);
| |
− | for ( ; n>w.my.params.page_size; n--) w.my.last_visible = MoveToNeighbor(w, w.my.last_visible, -1, -1);
| |
− | SetDiscussionFooter(w);
| |
− | }
| |
− |
| |
− | function onDiscussionCollapse(x)
| |
− | {
| |
− | var w = x.my.w, y;
| |
− | for (y=w.my.first_visible; y.my.depth > x.my.depth; y=y.parentNode.parentNode.parentNode) {}
| |
− | if (y == x) w.my.first_visible = x;
| |
− | for (y=w.my.last_visible; y.my.depth > x.my.depth; y=y.parentNode.parentNode.parentNode) {}
| |
− | if (y == x) w.my.last_visible = x;
| |
− | if (w.my.params.incremental && x.my.depth < w.my.params.counted_depth && !w.my.show_all)
| |
− | {
| |
− | for (y=MoveToNeighbor(w, x, 1, 0); y && y.my.is_visible && y.my.depth>x.my.depth; y=MoveToNeighbor(w, y, 1, 0)) w.my.params.page_size--;
| |
− | }
| |
− | SetExpandedStatus(x, 0);
| |
− | if (x.my.depth < w.my.params.counted_depth && !w.my.show_all)
| |
− | {
| |
− | DisplayCommentsWithFixedStart(w);
| |
− | }
| |
− | }
| |
− |
| |
− | function onDiscussionShowAll(w, expand_all)
| |
− | {
| |
− | if (w.my.show_all) return;
| |
− | SetDiscussionStatus(w, 2);
| |
− | var x;
| |
− | while ( (x = MoveToNeighbor(w, w.my.first_visible, -1, 1)) ) w.my.first_visible = x;
| |
− | w.my.show_all = true;
| |
− | if (expand_all)
| |
− | {
| |
− | w.my.expand_all = true;
| |
− | for (x=MoveToNeighbor(w, null, 1, 0); x; x=MoveToNeighbor(w, x, 1, 0)) SetExpandedStatus(x, 1);
| |
− | }
| |
− | w.my.params.retrieve_block_size = Math.round(1.25*w.my.params.show_all_page_size);
| |
− | DisplayCommentsWithFixedStart(w);
| |
− | }
| |
− |
| |
− | ///////////////////////////////////////
| |
− |
| |
− | function SetExpandedStatus(x, is_expanded)
| |
− | {
| |
− | if (x.my.is_expanded == is_expanded) return;
| |
− |
| |
− | var w = x.w;
| |
− | var w_replies = x.lastChild.lastChild;
| |
− | var w_reply_info = w_replies.previousSibling;
| |
− | var w_toggle = w_reply_info.previousSibling;
| |
− |
| |
− | if (x.my.reply_num == 0)
| |
− | {
| |
− | w_toggle.style.display = 'none';
| |
− | w_reply_info.style.display = 'none';
| |
− | w_replies.style.display = 'none';
| |
− | }
| |
− | else
| |
− | {
| |
− | w_toggle.style.display = '';
| |
− | if (is_expanded)
| |
− | {
| |
− | w_toggle.firstChild.innerHTML = '[<b>-</b>]';
| |
− | w_reply_info.style.display = 'none';
| |
− | w_replies.style.display = '';
| |
− | }
| |
− | else
| |
− | {
| |
− | w_toggle.firstChild.innerHTML = '[<b>+</b>]';
| |
− | w_reply_info.innerHTML = D_MSG_NReplies(x.my.reply_num);
| |
− | w_reply_info.style.display = '';
| |
− | w_replies.style.display = 'none';
| |
− | }
| |
− | }
| |
− | x.my.is_expanded = is_expanded;
| |
− | }
| |
− |
| |
− | function SetVisibleStatus(x, is_visible)
| |
− | {
| |
− | if (x.my.is_visible == is_visible) return;
| |
− |
| |
− | var p = x.parentNode;
| |
− | if (is_visible)
| |
− | {
| |
− | x.style.display = '';
| |
− | if ( x.nextSibling == p.lastChild ) p.lastChild.style.display = 'none';
| |
− | if ( x.previousSibling == p.firstChild ) p.firstChild.style.display = 'none';
| |
− | }
| |
− | else
| |
− | {
| |
− | x.style.display = 'none';
| |
− | if ( x.nextSibling == p.lastChild ) p.lastChild.style.display = '';
| |
− | if ( x.previousSibling == p.firstChild ) p.firstChild.style.display = '';
| |
− | if ( (x.nextSibling == p.lastChild || !x.nextSibling.my.is_visible) && (x.previousSibling == p.firstChild || !x.previousSibling.my.is_visible) ) p.lastChild.style.display = 'none';
| |
− | }
| |
− | x.my.is_visible = is_visible;
| |
− | }
| |
− |
| |
− | function MoveToNextTreeNeighbor(x)
| |
− | {
| |
− | if (x.my.reply_num > 0)
| |
− | {
| |
− | return x.lastChild.lastChild.firstChild.nextSibling;
| |
− | }
| |
− | while ( 1 )
| |
− | {
| |
− | if (x.nextSibling.nextSibling)
| |
− | {
| |
− | return x.nextSibling;
| |
− | }
| |
− | if (x.my.depth == 0) return null;
| |
− | x = x.parentNode.parentNode.parentNode;
| |
− | }
| |
− | }
| |
− |
| |
− | function MoveToNeighbor(w, x, dir, update_visibility)
| |
− | {
| |
− | if (dir > 0)
| |
− | {
| |
− | if (!x) return w.my.body.firstChild.nextSibling;
| |
− | if (x.my.depth < w.my.params.counted_depth && x.my.is_expanded && x.my.reply_num > 0)
| |
− | {
| |
− | x = x.lastChild.lastChild.firstChild.nextSibling;
| |
− | if (update_visibility > 0) SetVisibleStatus(x, 1);
| |
− | return x;
| |
− | }
| |
− | while ( 1 )
| |
− | {
| |
− | if (x.nextSibling.nextSibling)
| |
− | {
| |
− | if (update_visibility < 0) SetVisibleStatus(x, 0);
| |
− | x = x.nextSibling;
| |
− | if (update_visibility > 0) SetVisibleStatus(x, 1);
| |
− | return x;
| |
− | }
| |
− | if (x.my.depth == 0) return null;
| |
− | if (update_visibility < 0) SetVisibleStatus(x, 0);
| |
− | x = x.parentNode.parentNode.parentNode;
| |
− | }
| |
− | }
| |
− | else
| |
− | {
| |
− | if (!x) x = w.my.body.lastChild.previousSibling;
| |
− | else
| |
− | {
| |
− | if (update_visibility < 0) SetVisibleStatus(x, 0);
| |
− | if (x.previousSibling.previousSibling) x = x.previousSibling;
| |
− | else
| |
− | {
| |
− | if (x.my.depth == 0) return null;
| |
− | return x.parentNode.parentNode.parentNode;
| |
− | }
| |
− | }
| |
− | while ( x.my.depth < w.my.params.counted_depth && x.my.is_expanded && x.my.reply_num > 0)
| |
− | {
| |
− | if (update_visibility > 0) SetVisibleStatus(x, 1);
| |
− | x = x.lastChild.lastChild.lastChild.previousSibling;
| |
− | }
| |
− | if (update_visibility > 0) SetVisibleStatus(x, 1);
| |
− | return x;
| |
− | }
| |
− | }
| |
− |
| |
− | function IncreaseFirstVisible(w, stop) { while (w.my.first_visible != stop) w.my.first_visible = MoveToNeighbor(w, w.my.first_visible, 1, -1); }
| |
− | function IncreaseLastVisible(w, stop) { while (w.my.last_visible != stop) w.my.last_visible = MoveToNeighbor(w, w.my.last_visible, 1, 1); }
| |
− | function DecreaseFirstVisible(w, stop) { while (w.my.first_visible != stop) w.my.first_visible = MoveToNeighbor(w, w.my.first_visible, -1, 1); }
| |
− | function DecreaseLastVisible(w, stop) { while (w.my.last_visible != stop) w.my.last_visible = MoveToNeighbor(w, w.my.last_visible, -1, -1); }
| |
− |
| |
− | ///////////////////////////////////////////
| |
− | // posting comment //
| |
− | ///////////////////////////////////////////
| |
− |
| |
− | function PostCommentInit(w)
| |
− | {
| |
− | if (w.my.post.input) return;
| |
− | var next, p;
| |
− | if (w.my.post.parent)
| |
− | {
| |
− | p = w.my.post.parent;
| |
− | w.my.post.quote_text = p.my.text;
| |
− | if (p.my.depth >= w.my.params.max_depth)
| |
− | {
| |
− | p = (p.my.depth > 0) ? p.parentNode.parentNode.parentNode : null;
| |
− | }
| |
− | }
| |
− | else
| |
− | {
| |
− | p = null;
| |
− | w.my.post.quote_text = '';
| |
− | }
| |
− |
| |
− | if (w.my.post.edit)
| |
− | {
| |
− | w.my.post.edit.style.display = 'none';
| |
− | next = w.my.post.edit.nextSibling;
| |
− | }
| |
− | else if (p)
| |
− | {
| |
− | w.my.post.parent = p.my.id;
| |
− | next = p.lastChild.lastChild.lastChild;
| |
− | p.my.reply_num ++;
| |
− | if (p.my.reply_num == 1)
| |
− | {
| |
− | SetExpandedStatus(p, 0);
| |
− | SetExpandedStatus(p, 1);
| |
− | }
| |
− | else
| |
− | {
| |
− | if (w.my.show_all)
| |
− | {
| |
− | SetExpandedStatus(p, 1);
| |
− | }
| |
− | else
| |
− | {
| |
− | MakeCommentVisible(next.previousSibling, false);
| |
− | }
| |
− | }
| |
− | }
| |
− | else
| |
− | {
| |
− | w.my.post.parent = 0;
| |
− | while (w.my.first_visible && MoveToNeighbor(w, w.my.first_visible, -1, 0)) onDiscussionPrev(w);
| |
− | if (w.my.show_all && w.my.params.show_all_order==0)
| |
− | {
| |
− | next = w.my.body.lastChild;
| |
− | }
| |
− | else
| |
− | {
| |
− | next = w.my.body.childNodes[1];
| |
− | }
| |
− | }
| |
− |
| |
− | var x = document.createElement('div');
| |
− | next.parentNode.insertBefore(x, next);
| |
− | w.my.post.input = next.previousSibling;
| |
− | SetDiscussionStatus(w, -1);
| |
− |
| |
− | var author_characters_max = (w.my.params.author_characters_max >= 1) ? w.my.params.author_characters_max : 1;
| |
− |
| |
− | var time_string = '';
| |
− | if (w.my.post.edit)
| |
− | {
| |
− | time_string = DisplayDiscussionTime(w.my.post.edit.my.time, -1, w.my.params.time_format) + ', ' + D_MSG_lastEdit + ' ';
| |
− | }
| |
− |
| |
− | var i = w.my.post.input;
| |
− | i.innerHTML =
| |
− | '<div class="discussion-comment-header gainlayout">'
| |
− | + '<div class="discussion-comment-author"></div>'
| |
− | + '<div class="discussion-comment-date">('+time_string+D_MSG_currentTime+')</div>'
| |
− | + '<div style="clear:left;"></div>'
| |
− | + '</div>'
| |
− | + '<div class="discussion-comment-text"></div>'
| |
− | + '<div class="discussion-input gainlayout">'
| |
− | + '<div>'+D_MSG_Name+' <input type="text" maxlength="'+author_characters_max+'" size="'+author_characters_max+'" /> <span style="color:red;margin-left:15px;"></span></div>'
| |
− | + '<textarea rows="8" onkeyup="\
| |
− | var w=document.getElementById(\''+w.my.params.id+'\');\
| |
− | LimitDiscussionCommentCharacters(this, '+w.my.params.characters_max+', w.my.post.w_chars_left);\
| |
− | if (w.my.params.preview==1) { w.my.post.b_submit.disabled = true; w.my.post.b_preview.disabled = false; }\
| |
− | "></textarea>'
| |
− | + '<span>'+D_MSG_CharactersLeft+' <input type="text" readonly="readonly" size="5" style="margin-right:20px;"/></span>'
| |
− | + '<input type="button" value="'+D_MSG_Submit+'" onclick="\
| |
− | var w=document.getElementById(\''+w.my.params.id+'\');\
| |
− | PostCommentSubmit(w);\
| |
− | " />'
| |
− | + '<input type="button" value="'+D_MSG_Preview+'" onclick="\
| |
− | var w=document.getElementById(\''+w.my.params.id+'\');\
| |
− | PostCommentShowPreview(w);\
| |
− | " />'
| |
− | + '<input type="button" value="'+D_MSG_Quote+'" style="margin-left:20px;" onclick="\
| |
− | var w=document.getElementById(\''+w.my.params.id+'\');\
| |
− | PostCommentQuote(w);\
| |
− | " />'
| |
− | + '<input type="button" value="'+D_MSG_Cancel+'" style="margin-left:20px;" onclick="\
| |
− | var w=document.getElementById(\''+w.my.params.id+'\');\
| |
− | PostCommentCancel(w);\
| |
− | " />'
| |
− | + '</div>';
| |
− |
| |
− | ScrollToElement(w.my.post.input);
| |
− |
| |
− | w.my.post.w_preview_author = i.childNodes[0].childNodes[0];
| |
− | w.my.post.w_preview_date = i.childNodes[0].childNodes[1];
| |
− | w.my.post.w_preview_text = i.childNodes[1];
| |
− | w.my.post.w_author = i.childNodes[2].childNodes[0].getElementsByTagName('input')[0];
| |
− | w.my.post.w_author_msg = i.childNodes[2].childNodes[0].getElementsByTagName('span')[0];
| |
− | w.my.post.w_text = i.childNodes[2].childNodes[1];
| |
− | w.my.post.w_chars_left = i.childNodes[2].childNodes[2].lastChild;
| |
− | w.my.post.b_submit = i.childNodes[2].childNodes[3];
| |
− | w.my.post.b_preview = i.childNodes[2].childNodes[4];
| |
− | w.my.post.b_quote = i.childNodes[2].childNodes[5];
| |
− | w.my.post.b_cancel = i.childNodes[2].childNodes[6];
| |
− |
| |
− | w.my.post.w_preview_author.parentNode.style.display = 'none';
| |
− | w.my.post.w_preview_text.style.display = 'none';
| |
− | if (wgUserName)
| |
− | {
| |
− | w.my.post.w_author.parentNode.style.display = 'none';
| |
− | w.my.post.w_author.value = wgUserName;
| |
− | }
| |
− | if (!w.my.post.quote_text || !w.my.params.quoting) w.my.post.b_quote.style.display = 'none';
| |
− | if (w.my.params.preview==0) w.my.post.b_preview.style.display = 'none';
| |
− | else if (w.my.params.preview==1) w.my.post.b_submit.disabled = 'true';
| |
− | if (w.my.params.characters_max > 0) LimitDiscussionCommentCharacters(w.my.post.w_text, w.my.params.characters_max, w.my.post.w_chars_left);
| |
− | else w.my.post.w_chars_left.parentNode.style.display = 'none';
| |
− |
| |
− | if (w.my.post.edit)
| |
− | {
| |
− | w.my.post.w_text.value = w.my.post.edit.my.text;
| |
− | PostCommentShowPreview(w);
| |
− | }
| |
− | }
| |
− |
| |
− | function PostCommentShowPreview(w)
| |
− | {
| |
− | if (!w.my.post.w_author.value) { w.my.post.w_author_msg.innerHTML = D_MSG_PleaseEnterYourName; return; }
| |
− | if (w.my.params.preview==1) { w.my.post.b_submit.disabled = false; w.my.post.b_preview.disabled = true; }
| |
− | w.my.post.w_preview_author.parentNode.style.display = '';
| |
− | w.my.post.w_preview_text.style.display = '';
| |
− | w.my.post.w_author_msg.innerHTML = '';
| |
− | var author = w.my.post.w_author.value.replace(/</g, '<').replace(/>/g, '>');
| |
− | if (wgUserName) author = '<a href="'+w.my.params.author_url_prefix+author+'">'+author+'</a>';
| |
− | w.my.post.w_preview_author.innerHTML = author;
| |
− | w.my.post.w_preview_text.innerHTML = FormatDiscussionComment(w.my.post.w_text.value);
| |
− | }
| |
− |
| |
− | function PostCommentGetResponse(request)
| |
− | {
| |
− | var s = request.responseText.split('|', 2);
| |
− | id = s[0];
| |
− | var w = document.getElementById(id);
| |
− | if (s[1]) w.innerHTML = s[1] + '<br /><input type="button" value="' + D_MSG_OK + '" onclick="var w=document.getElementById(\''+id+'\');InitAjaxDiscussion(w.my.params);" />';
| |
− | else InitAjaxDiscussion(w.my.params);
| |
− | }
| |
− |
| |
− | function DiscussionEncode(t)
| |
− | {
| |
− | if (!wgUseDiscussionEncoding) return t;
| |
− | var s0 = '', s = '', n = 2;
| |
− | for (var i=0; i<t.length; i++) { c = t.charCodeAt(i).toString(16); if (c.length != n && s) { s0 += '.'+n+'.'+s; s = ''; } n = c.length; s += c; }
| |
− | if (s) s0 += '.'+n+'.'+s;
| |
− | return s0;
| |
− | }
| |
− |
| |
− | function PostCommentSubmit(w)
| |
− | {
| |
− | if (!w.my.post.w_author.value) { w.my.post.w_author_msg.innerHTML = D_MSG_PleaseEnterYourName; return; }
| |
− | w.my.post.w_author_msg.innerHTML = '';
| |
− | w.my.post.b_submit.disabled = true;
| |
− | w.my.post.b_preview.disabled = true;
| |
− | w.my.post.b_quote.disabled = true;
| |
− | w.my.post.b_cancel.disabled = true;
| |
− | var text = DiscussionEncode(w.my.post.w_text.value);
| |
− | if (w.my.post.edit)
| |
− | {
| |
− | sajax_do_call( "wfAjaxEditComment", [w.my.params.discussion_id, w.my.post.edit.my.id, text] , PostCommentGetResponse ); // w
| |
− | }
| |
− | else
| |
− | {
| |
− | var author = DiscussionEncode(w.my.post.w_author.value);
| |
− | sajax_do_call( "wfAjaxSubmitComment", [w.my.params.discussion_id, w.my.post.parent, author, text] , PostCommentGetResponse ); // w
| |
− | }
| |
− | }
| |
− |
| |
− | function PostCommentQuote(w)
| |
− | {
| |
− | if (!w.my.post.quote_text) return;
| |
− | if (w.my.params.preview==1) { w.my.post.b_submit.disabled = true; w.my.post.b_preview.disabled = false; }
| |
− | w.my.post.w_text.value = '> ' + w.my.post.quote_text.replace(/\n/g, '\n> ') + '\n' + w.my.post.w_text.value;
| |
− | LimitDiscussionCommentCharacters(w.my.post.w_text, w.my.params.characters_max, w.my.post.w_chars_left);
| |
− | }
| |
− |
| |
− | function PostCommentCancel(w)
| |
− | {
| |
− | var p = w.my.post.input.parentNode;
| |
− | p.removeChild(w.my.post.input);
| |
− | if (w.my.post.edit)
| |
− | {
| |
− | w.my.post.edit.style.display = '';
| |
− | w.my.post.edit = null;
| |
− | }
| |
− | else if (p != w.my.body)
| |
− | {
| |
− | p = p.parentNode.parentNode;
| |
− | p.my.reply_num --;
| |
− | if (p.my.reply_num == 0)
| |
− | {
| |
− | SetExpandedStatus(p, 0);
| |
− | SetExpandedStatus(p, 1);
| |
− | }
| |
− | }
| |
− | w.my.post.input = null;
| |
− | SetDiscussionStatus(w, 0);
| |
− | }
| |
− |
| |
− | ///////////////////////////////////////////
| |
− |
| |
− | // called when posting a comment
| |
− | function MakeCommentVisible(x, highlight_flag)
| |
− | {
| |
− | var w = x.my.w, parents = [], y = x, d;
| |
− | while ( 1 )
| |
− | {
| |
− | parents[parents.length] = y;
| |
− | if (y.my.depth == 0) break;
| |
− | y = y.parentNode.parentNode.parentNode;
| |
− | }
| |
− | if (w.my.show_all && !y.my.is_visible) return; // should't be here
| |
− | for (d=0; ; d++)
| |
− | {
| |
− | y = parents[parents.length-d-1];
| |
− | if (!y.my.is_visible && y.my.depth<=w.my.params.counted_depth && !w.my.show_all)
| |
− | {
| |
− | var x0 = w.my.first_visible, x1 = w.my.last_visible, n = 1;
| |
− | while (x0 != x1) { x0 = MoveToNeighbor(w, x0, 1, 0); n ++; }
| |
− | x0 = w.my.first_visible;
| |
− | while ( 1 )
| |
− | {
| |
− | x0 = MoveToNeighbor(w, x0, -1, 0);
| |
− | if (!x0 || x0 == y) break;
| |
− | x1 = MoveToNeighbor(w, x1, 1, 0);
| |
− | if (!x1 || x1 == y) break;
| |
− | }
| |
− | if (!x1 || x0 == y)
| |
− | {
| |
− | while ( 1 )
| |
− | {
| |
− | w.my.first_visible = MoveToNeighbor(w, w.my.first_visible, -1, 1);
| |
− | n ++;
| |
− | if (n > w.my.params.page_size) { w.my.last_visible = MoveToNeighbor(w, w.my.last_visible, -1, -1); n--; }
| |
− | if (y.my.is_visible) break;
| |
− | }
| |
− | }
| |
− | else
| |
− | {
| |
− | while ( 1 )
| |
− | {
| |
− | w.my.last_visible = MoveToNeighbor(w, w.my.last_visible, 1, 1);
| |
− | n ++;
| |
− | if (n > w.my.params.page_size) { w.my.first_visible = MoveToNeighbor(w, w.my.first_visible, 1, -1); n--; }
| |
− | if (y.my.is_visible) break;
| |
− | }
| |
− | }
| |
− | }
| |
− | if (y == x) break;
| |
− | if (!y.my.is_expanded) onDiscussionExpand(y);
| |
− | }
| |
− | SetDiscussionFooter(w);
| |
− | }
| |
− |
| |
− | ///////////////////////////////////////////
| |
− |
| |
− | function DiscussionChangeCommentStatus(admin_actions, new_status)
| |
− | {
| |
− | var x = admin_actions.parentNode.parentNode.parentNode;
| |
− | var w = x.my.w;
| |
− | if (w.my.status != 0) return;
| |
− |
| |
− | var admin_action_info = document.createElement('div');
| |
− | var next = admin_actions.parentNode;
| |
− | next.parentNode.insertBefore(admin_action_info, next);
| |
− | admin_action_info = next.previousSibling;
| |
− | admin_action_info.admin_actions = admin_actions;
| |
− | //admin_action_info.innerHTML = '<a style="cursor:pointer;" onclick="DiscussionChangeCommentStatusFinish(parentNode, -1);">'+D_MSG_close+'</a>';
| |
− | SetDiscussionStatus(w, -1);
| |
− | sajax_do_call( "wfAjaxChangeCommentStatus", [w.my.params.discussion_id, x.my.id, new_status] , admin_action_info );
| |
− | }
| |
− |
| |
− | function DiscussionChangeCommentStatusFinish(admin_action_info, new_status)
| |
− | {
| |
− | var x = admin_action_info.parentNode.parentNode;
| |
− | var w = x.my.w;
| |
− | if (new_status >= 0)
| |
− | {
| |
− | x.my.status = new_status;
| |
− | admin_action_info.admin_actions.innerHTML = DisplayAdminActions(new_status);
| |
− | admin_action_info.admin_actions.previousSibling.previousSibling.style.visibility = (new_status!=0) ? 'hidden' : 'visible';
| |
− | }
| |
− | admin_action_info.parentNode.removeChild(admin_action_info);
| |
− | SetDiscussionStatus(w, 0);
| |
− | }
| |