← Back
Editing: cf42baff3dea00aeac5517f8ec07abdce66cdabf
M.mod_chat_ajax=M.mod_chat_ajax||{};M.mod_chat_ajax.init=function(Y,cfg){var gui_ajax={api:M.cfg.wwwroot+'/mod/chat/chat_ajax.php?sesskey='+M.cfg.sesskey,cfg:{},interval:null,layout:null,messages:[],scrollable:!0,thememenu:null,messageinput:null,sendbutton:null,messagebox:null,init:function(cfg){this.cfg=cfg;this.cfg.req_count=this.cfg.req_count||0;participantswidth=180;if(Y.one('#input-message').get('docWidth')<640){participantswidth=120} this.layout=new Y.YUI2.widget.Layout({units:[{position:'right',width:participantswidth,resize:!0,gutter:'1px',scroll:!0,body:'chat-userlist',animate:!1},{position:'bottom',height:42,resize:!1,body:'chat-input-area',gutter:'1px',collapse:!1,resize:!1},{position:'center',body:'chat-messages',gutter:'0px',scroll:!0}]});this.layout.on('render',function(){var unit=this.getUnitByPosition('right');if(unit){unit.on('close',function(){closeLeft()})}},this.layout);this.layout.render();this.messageinput=Y.one('#input-message');this.sendbutton=Y.one('#button-send');this.messagebox=Y.one('#chat-messages');this.messagebox.set('role','log');this.messagebox.set('aria-live','polite');var userlist=Y.one('#chat-userlist');userlist.set('aria-live','polite');userlist.set('aria-relevant','all');this.sendbutton.on('click',this.send,this);this.messagebox.on('mouseenter',function(){this.scrollable=!1},this);this.messagebox.on('mouseleave',function(){this.scrollable=!0},this);Y.on('key',this.send,this.messageinput,'press:13',this);document.title=this.cfg.chatroom_name;Y.io(this.api,{method:'POST',data:build_querystring({action:'init',chat_init:1,chat_sid:this.cfg.sid,theme:this.theme}),on:{success:function(tid,outcome){this.messageinput.removeAttribute('disabled');this.messageinput.set('value','');this.messageinput.focus();try{var data=Y.JSON.parse(outcome.responseText)}catch(ex){return} this.update_users(data.users)}},context:this});var scope=this;this.interval=setInterval(function(){scope.update_messages()},this.cfg.timer,this);this.thememenu=new Y.YUI2.widget.Menu('basicmenu',{xy:[0,0]});this.thememenu.addItems([{text:M.util.get_string('bubble','mod_chat'),url:this.cfg.chaturl+'&theme=bubble'},{text:M.util.get_string('compact','mod_chat'),url:this.cfg.chaturl+'&theme=compact'},{text:M.util.get_string('coursetheme','mod_chat'),url:this.cfg.chaturl+'&theme=course_theme'}]);this.thememenu.render(document.body);Y.one('#choosetheme').on('click',function(e){this.moveTo((e.pageX-20),(e.pageY-20));this.show()},this.thememenu)},append_message:function(key,message,row){var item=Y.Node.create('<li id="mdl-chat-entry-'+key+'">'+message.message+'</li>');item.addClass((message.mymessage)?'mdl-chat-my-entry':'mdl-chat-entry');Y.one('#messages-list').append(item);if(message.type&&message.type=='beep'){var audioElement=document.createElement('audio');audioElement.setAttribute('src','../beep.mp3');audioElement.play()}},send:function(e,beep){if((this.messageinput.get('value')!='')||(typeof beep!='undefined')){this.sendbutton.set('value',M.util.get_string('sending','chat'));var data={chat_message:(!beep)?this.messageinput.get('value'):'',chat_sid:this.cfg.sid,theme:this.cfg.theme};if(beep){data.beep=beep} data.action='chat';Y.io(this.api,{method:'POST',data:build_querystring(data),on:{success:this.send_callback},context:this})}},send_callback:function(tid,outcome,args){try{var data=Y.JSON.parse(outcome.responseText)}catch(ex){return} this.sendbutton.set('value',M.util.get_string('send','chat'));this.messageinput.set('value','');clearInterval(this.interval);this.update_messages();var scope=this;this.interval=setInterval(function(){scope.update_messages()},this.cfg.timer,this)},talkto:function(e,name){this.messageinput.set('value',"To "+name+": ");this.messageinput.focus()},update_messages:function(){this.cfg.req_count++;Y.io(this.api,{method:'POST',data:build_querystring({action:'update',chat_lastrow:this.cfg.chat_lastrow||!1,chat_lasttime:this.cfg.chat_lasttime,chat_sid:this.cfg.sid,theme:this.cfg.theme}),on:{success:this.update_messages_callback},context:this})},update_messages_callback:function(tid,outcome){try{var data=Y.JSON.parse(outcome.responseText)}catch(ex){return} if(data.error){clearInterval(this.interval);alert(data.error);window.location=this.cfg.home} this.cfg.chat_lasttime=data.lasttime;this.cfg.chat_lastrow=data.lastrow;for(var key in data.msgs){if(!M.util.in_array(key,this.messages)){this.messages.push(key);this.append_message(key,data.msgs[key],data.lastrow)}} this.update_users(data.users);if(this.scrollable){Y.Node.getDOMNode(this.messagebox).parentNode.scrollTop+=500} this.messageinput.focus()},update_users:function(users){if(!users){return} var list=Y.one('#users-list');list.get('children').remove();for(var i in users){var li=Y.Node.create('<li><table><tr><td>'+users[i].picture+'</td><td></td></tr></table></li>');if(users[i].id==this.cfg.userid){li.all('td').item(1).append(Y.Node.create('<strong><a target="_blank" href="'+users[i].url+'">'+users[i].name+'</a></strong>'))}else{li.all('td').item(1).append(Y.Node.create('<div><a target="_blank" href="'+users[i].url+'">'+users[i].name+'</a></div>'));var talk=Y.Node.create('<a href="###">'+M.util.get_string('talk','chat')+'</a>');talk.on('click',this.talkto,this,users[i].name);var beep=Y.Node.create('<a href="###">'+M.util.get_string('beep','chat')+'</a>');beep.on('click',this.send,this,users[i].id);li.all('td').item(1).append(Y.Node.create('<div></div>').append(talk).append(' ').append(beep))} list.append(li)}}};gui_ajax.init(cfg)}
Save File
Cancel