1 // This file is part of Moodle - http://moodle.org/
3 // Moodle is free software: you can redistribute it and/or modify
4 // it under the terms of the GNU General Public License as published by
5 // the Free Software Foundation, either version 3 of the License, or
6 // (at your option) any later version.
8 // Moodle is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 // GNU General Public License for more details.
13 // You should have received a copy of the GNU General Public License
14 // along with Moodle. If not, see <http://www.gnu.org/licenses/>.
18 * @author Dongsheng Cai <dongsheng@moodle.com>
22 * Initialize commenting system
24 init: function(Y
, options
) {
25 var CommentHelper = function(args
) {
26 CommentHelper
.superclass
.constructor.apply(this, arguments
);
28 CommentHelper
.NAME
= "COMMENT";
29 CommentHelper
.ATTRS
= {
33 Y
.extend(CommentHelper
, Y
.Base
, {
34 api
: M
.cfg
.wwwroot
+'/comment/comment_ajax.php',
35 initializer: function(args
) {
37 this.client_id
= args
.client_id
;
38 this.itemid
= args
.itemid
;
39 this.commentarea
= args
.commentarea
;
40 this.component
= args
.component
;
41 this.courseid
= args
.courseid
;
42 this.contextid
= args
.contextid
;
43 this.autostart
= (args
.autostart
);
49 var handle
= Y
.one('#comment-link-'+this.client_id
);
53 handle
.setStyle('display', 'none');
55 handle
.on('click', function(e
) {
61 scope
.toggle_textarea(false);
62 CommentHelper
.confirmoverlay
= new Y
.Overlay({
63 bodyContent
: '<div class="comment-delete-confirm"><a href="#" id="confirmdelete-'+this.client_id
+'">'+M
.str
.moodle
.yes
+'</a> <a href="#" id="canceldelete-'+this.client_id
+'">'+M
.str
.moodle
.no
+'</a></div>',
66 CommentHelper
.confirmoverlay
.render(document
.body
);
69 var ta
= Y
.one('#dlg-content-'+this.client_id
);
71 var value
= ta
.get('value');
72 if (value
&& value
!= M
.str
.moodle
.addcomment
) {
73 var params
= {'content': value
};
78 callback: function(id
, obj
, args
) {
79 var scope
= args
.scope
;
80 var cid
= scope
.client_id
;
81 var ta
= Y
.one('#dlg-content-'+cid
);
83 scope
.toggle_textarea(false);
84 var container
= Y
.one('#comment-list-'+cid
);
85 var result
= scope
.render([obj
], true);
86 var newcomment
= Y
.Node
.create(result
.html
);
87 container
.appendChild(newcomment
);
89 var linktext
= Y
.one('#comment-link-text-'+cid
);
91 linktext
.set('innerHTML', M
.str
.moodle
.comments
+ ' ('+obj
.count
+')');
95 color
: { to
: '#06e' },
96 backgroundColor
: { to
: '#FFE390' }
98 var anim
= new Y
.YUI2
.util
.ColorAnim(ids
[i
], attributes
);
101 scope
.register_pagination();
102 scope
.register_delete_buttons();
107 backgroundColor
: { from: '#FFE390', to
:'#FFFFFF' }
109 var anim
= new Y
.YUI2
.util
.ColorAnim('dlg-content-'+cid
, attributes
);
113 request: function(args
, noloading
) {
117 scope
= args
['scope'];
119 //params['page'] = args.page?args.page:'';
120 // the form element only accept certain file types
121 params
['sesskey'] = M
.cfg
.sesskey
;
122 params
['action'] = args
.action
?args
.action
:'';
123 params
['client_id'] = this.client_id
;
124 params
['itemid'] = this.itemid
;
125 params
['area'] = this.commentarea
;
126 params
['courseid'] = this.courseid
;
127 params
['contextid'] = this.contextid
;
128 params
['component'] = this.component
;
129 if (args
['params']) {
130 for (i
in args
['params']) {
131 params
[i
] = args
['params'][i
];
137 complete: function(id
,o
,p
) {
142 var data
= Y
.JSON
.parse(o
.responseText
);
144 if (data
.error
== 'require_login') {
145 args
.callback(id
,data
,p
);
151 args
.callback(id
,data
,p
);
160 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
162 data
: build_querystring(params
)
165 cfg
.form
= args
.form
;
172 render: function(list
, newcmt
) {
175 var template
= Y
.one('#cmt-tmpl');
178 var htmlid
= 'comment-'+list
[i
].id
+'-'+this.client_id
;
179 var val
= template
.get('innerHTML');
180 if (list
[i
].profileurl
) {
181 val
= val
.replace('___name___', '<a href="'+list
[i
].profileurl
+'">'+list
[i
].fullname
+'</a>');
183 val
= val
.replace('___name___', list
[i
].fullname
);
185 if (list
[i
]['delete']||newcmt
) {
186 list
[i
].content
= '<div class="comment-delete"><a href="#" id ="comment-delete-'+this.client_id
+'-'+list
[i
].id
+'" title="'+M
.str
.moodle
.deletecomment
+'"><img alt="" src="'+M
.util
.image_url('t/delete', 'core')+'" /></a></div>' + list
[i
].content
;
188 val
= val
.replace('___time___', list
[i
].time
);
189 val
= val
.replace('___picture___', list
[i
].avatar
);
190 val
= val
.replace('___content___', list
[i
].content
);
191 val
= '<li id="'+htmlid
+'">'+val
+'</li>';
192 ret
.ids
.push(htmlid
);
198 load: function(page
) {
200 var container
= Y
.one('#comment-ctrl-'+this.client_id
);
208 callback: function(id
, ret
, args
) {
209 var linktext
= Y
.one('#comment-link-text-'+scope
.client_id
);
210 if (ret
.count
&& linktext
) {
211 linktext
.set('innerHTML', M
.str
.moodle
.comments
+ ' ('+ret
.count
+')');
213 var container
= Y
.one('#comment-list-'+scope
.client_id
);
214 var pagination
= Y
.one('#comment-pagination-'+scope
.client_id
);
215 if (ret
.pagination
) {
216 pagination
.set('innerHTML', ret
.pagination
);
219 pagination
.set('innerHTML', '');
221 if (ret
.error
== 'require_login') {
223 result
.html
= M
.str
.moodle
.commentsrequirelogin
;
225 var result
= scope
.render(ret
.list
);
227 container
.set('innerHTML', result
.html
);
228 var img
= Y
.one('#comment-img-'+scope
.client_id
);
230 img
.set('src', M
.util
.image_url('t/expanded', 'core'));
232 args
.scope
.register_pagination();
233 args
.scope
.register_delete_buttons();
238 dodelete: function(id
) { // note: delete is a reserved word in javascript, chrome and safary do not like it at all here!
240 var params
= {'commentid': id
};
241 scope
.cancel_delete();
242 function remove_dom(type
, anim
, cmt
) {
249 callback: function(id
, resp
, args
) {
250 var htmlid
= 'comment-'+resp
.commentid
+'-'+resp
.client_id
;
255 var cmt
= Y
.one('#'+htmlid
);
256 cmt
.setStyle('overflow', 'hidden');
257 var anim
= new Y
.YUI2
.util
.Anim(htmlid
, attributes
, 1, Y
.YUI2
.util
.Easing
.easeOut
);
258 anim
.onComplete
.subscribe(remove_dom
, cmt
, this);
263 register_actions: function() {
265 var action_btn
= Y
.one('#comment-action-post-'+this.client_id
);
267 action_btn
.on('click', function(e
) {
273 // cancel comment box
274 var cancel
= Y
.one('#comment-action-cancel-'+this.client_id
);
276 cancel
.on('click', function(e
) {
283 register_delete_buttons: function() {
286 Y
.all('div.comment-delete a').each(
288 var theid
= node
.get('id');
289 var parseid
= new RegExp("comment-delete-"+scope
.client_id
+"-(\\d+)", "i");
290 var commentid
= theid
.match(parseid
);
295 Y
.Event
.purgeElement('#'+theid
, false, 'click');
297 node
.on('click', function(e
, node
) {
299 var width
= CommentHelper
.confirmoverlay
.bodyNode
.getStyle('width');
300 var re
= new RegExp("(\\d+).*", "i");
301 var result
= width
.match(re
);
303 width
= Number(result
[1]);
307 //CommentHelper.confirmoverlay.set('xy', [e.pageX-(width/2), e.pageY]);
308 CommentHelper
.confirmoverlay
.set('xy', [e
.pageX
-width
-5, e
.pageY
]);
309 CommentHelper
.confirmoverlay
.set('visible', true);
310 Y
.one('#canceldelete-'+scope
.client_id
).on('click', function(e
) {
312 scope
.cancel_delete();
314 Y
.Event
.purgeElement('#confirmdelete-'+scope
.client_id
, false, 'click');
315 Y
.one('#confirmdelete-'+scope
.client_id
).on('click', function(e
) {
318 scope
.dodelete(commentid
[1]);
325 cancel_delete: function() {
326 CommentHelper
.confirmoverlay
.set('visible', false);
328 register_pagination: function() {
331 Y
.all('#comment-pagination-'+this.client_id
+' a').each(
333 node
.on('click', function(e
, node
) {
335 var id
= node
.get('id');
336 var re
= new RegExp("comment-page-"+this.client_id
+"-(\\d+)", "i");
337 var result
= id
.match(re
);
338 this.load(result
[1]);
343 view: function(page
) {
344 var container
= Y
.one('#comment-ctrl-'+this.client_id
);
345 var ta
= Y
.one('#dlg-content-'+this.client_id
);
346 var img
= Y
.one('#comment-img-'+this.client_id
);
347 var d
= container
.getStyle('display');
348 if (d
=='none'||d
=='') {
350 if (!this.autostart
) {
353 this.register_delete_buttons();
354 this.register_pagination();
356 container
.setStyle('display', 'block');
358 img
.set('src', M
.util
.image_url('t/expanded', 'core'));
362 container
.setStyle('display', 'none');
363 var collapsedimage
= 't/collapsed'; // ltr mode
364 if ( Y
.one(document
.body
).hasClass('dir-rtl') ) {
365 collapsedimage
= 't/collapsed_rtl';
367 collapsedimage
= 't/collapsed';
369 img
.set('src', M
.util
.image_url(collapsedimage
, 'core'));
375 //toggle_textarea.apply(ta, [false]);
376 //// reset textarea size
377 ta
.on('click', function() {
378 this.toggle_textarea(true);
380 //ta.onkeypress = function() {
381 //if (this.scrollHeight > this.clientHeight && !window.opera)
384 ta
.on('blur', function() {
385 this.toggle_textarea(false);
388 this.register_actions();
391 toggle_textarea: function(focus
) {
392 var t
= Y
.one('#dlg-content-'+this.client_id
);
397 if (t
.get('value') == M
.str
.moodle
.addcomment
) {
399 t
.setStyle('color', 'black');
402 if (t
.get('value') == '') {
403 t
.set('value', M
.str
.moodle
.addcomment
);
404 t
.setStyle('color','grey');
410 var container
= Y
.one('#comment-list-'+this.client_id
);
411 container
.set('innerHTML', '<div class="mdl-align"><img src="'+M
.util
.image_url('i/loading_small', 'core')+'" /></div>');
415 new CommentHelper(options
);
417 init_admin: function(Y
) {
418 var select_all
= Y
.one('#comment_select_all');
419 select_all
.on('click', function(e
) {
420 var comments
= document
.getElementsByName('comments');
422 for (var i
in comments
) {
423 if (comments
[i
].checked
) {
427 for (i
in comments
) {
428 comments
[i
].checked
= !checked
;
430 this.set('checked', !checked
);
433 var comments_delete
= Y
.one('#comments_delete');
434 if (comments_delete
) {
435 comments_delete
.on('click', function(e
) {
438 var comments
= document
.getElementsByName('comments');
439 for (var i
in comments
) {
440 if (typeof comments
[i
] == 'object' && comments
[i
].checked
) {
441 list
+= (comments
[i
].value
+ '-');
448 args
.message
= M
.str
.admin
.confirmdeletecomments
;
449 args
.callback = function() {
450 var url
= M
.cfg
.wwwroot
+ '/comment/index.php';
454 'sesskey': M
.cfg
.sesskey
,
460 complete: function(id
,o
,p
) {
465 if (o
.responseText
== 'yes') {
474 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
476 data
: build_querystring(data
)
480 M
.util
.show_confirm_dialog(e
, args
);