128 lines
4.1 KiB
JavaScript
128 lines
4.1 KiB
JavaScript
|
if(!dojo._hasResource["dijit.demos.chat.room"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
|
||
|
dojo._hasResource["dijit.demos.chat.room"] = true;
|
||
|
dojo.provide("dijit.demos.chat.room");
|
||
|
|
||
|
dojo.require("dojox.cometd");
|
||
|
dojo.require("dijit._Widget");
|
||
|
dojo.require("dijit._Templated");
|
||
|
|
||
|
dojo.declare("dijit.demos.chat.Room",
|
||
|
[dijit._Widget,dijit._Templated],
|
||
|
{
|
||
|
|
||
|
_last: "",
|
||
|
_username: null,
|
||
|
roomId: "public",
|
||
|
isPrivate: false,
|
||
|
prompt: "Name:",
|
||
|
|
||
|
templateString: '<div id="${id}" class="chatroom">'
|
||
|
+'<div dojoAttachPoint="chatNode" class="chat"></div>'
|
||
|
+'<div dojoAttachPoint="input" class="input">'
|
||
|
+'<div dojoAttachPoint="joining">'
|
||
|
+'<span>${prompt}</span><input class="username" dojoAttachPoint="username" type="text" dojoAttachEvent="onkeyup: _join"> <input dojoAttachPoint="joinB" class="button" type="submit" name="join" value="Contact" dojoAttachEvent="onclick: _join"/>'
|
||
|
+'</div>'
|
||
|
+'<div dojoAttachPoint="joined" class="hidden">'
|
||
|
+'<input type="text" class="phrase" dojoAttachPoint="phrase" dojoAttachEvent="onkeyup: _cleanInput" />'
|
||
|
+'<input type="submit" class="button" value="Send" dojoAttachPoint="sendB" dojoAttachEvent="onclick: _sendPhrase"/>'
|
||
|
+'</div>'
|
||
|
+'</div>'
|
||
|
+'</div>',
|
||
|
|
||
|
join: function(name){
|
||
|
if(name == null || name.length==0){
|
||
|
alert('Please enter a username!');
|
||
|
}else{
|
||
|
if(this.isPrivate){ this.roomId = name; }
|
||
|
this._username=name;
|
||
|
this.joining.className='hidden';
|
||
|
this.joined.className='';
|
||
|
this.phrase.focus();
|
||
|
console.log(this.roomId);
|
||
|
dojox.cometd.subscribe("/chat/demo/" + this.roomId, this, "_chat");
|
||
|
dojox.cometd.publish("/chat/demo/" + this.roomId, { user: this._username, join: true, chat : this._username+" has joined the room."});
|
||
|
dojox.cometd.publish("/chat/demo", { user: this._username, joined: this.roomId });
|
||
|
}
|
||
|
},
|
||
|
|
||
|
_join: function(/* Event */e){
|
||
|
var key = (e.charCode == dojo.keys.SPACE ? dojo.keys.SPACE : e.keyCode);
|
||
|
if (key == dojo.keys.ENTER || e.type=="click"){
|
||
|
this.join(this.username.value);
|
||
|
}
|
||
|
},
|
||
|
|
||
|
leave: function(){
|
||
|
dojox.cometd.unsubscribe("/chat/demo/" + this.roomId, this, "_chat");
|
||
|
dojox.cometd.publish("/chat/demo/" + this.roomId, { user: this._username, leave: true, chat : this._username+" has left the chat."});
|
||
|
|
||
|
// switch the input form back to login mode
|
||
|
this.joining.className='';
|
||
|
this.joined.className='hidden';
|
||
|
this.username.focus();
|
||
|
this._username=null;
|
||
|
},
|
||
|
|
||
|
chat: function(text){
|
||
|
// summary: publish a text message to the room
|
||
|
if(text != null && text.length>0){
|
||
|
// lame attempt to prevent markup
|
||
|
text=text.replace(/</g,'<');
|
||
|
text=text.replace(/>/g,'>');
|
||
|
dojox.cometd.publish("/chat/demo/" + this.roomId, { user: this._username, chat: text});
|
||
|
}
|
||
|
},
|
||
|
|
||
|
_chat: function(message){
|
||
|
// summary: process an incoming message
|
||
|
if (!message.data){
|
||
|
console.warn("bad message format "+message);
|
||
|
return;
|
||
|
}
|
||
|
var from=message.data.user;
|
||
|
var special=message.data.join || message.data.leave;
|
||
|
var text=message.data.chat;
|
||
|
if(text!=null){
|
||
|
if(!special && from == this._last ){ from="...";
|
||
|
}else{
|
||
|
this._last=from;
|
||
|
from+=":";
|
||
|
}
|
||
|
|
||
|
if(special){
|
||
|
this.chatNode.innerHTML += "<span class=\"alert\"><span class=\"from\">"+from+" </span><span class=\"text\">"+text+"</span></span><br/>";
|
||
|
this._last="";
|
||
|
}else{
|
||
|
this.chatNode.innerHTML += "<span class=\"from\">"+from+" </span><span class=\"text\">"+text+"</span><br/>";
|
||
|
this.chatNode.scrollTop = this.chatNode.scrollHeight - this.chatNode.clientHeight;
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
|
||
|
startup: function(){
|
||
|
this.joining.className='';
|
||
|
this.joined.className='hidden';
|
||
|
//this.username.focus();
|
||
|
this.username.setAttribute("autocomplete","OFF");
|
||
|
if (this.registeredAs) { this.join(this.registeredAs); }
|
||
|
this.inherited("startup",arguments);
|
||
|
},
|
||
|
|
||
|
_cleanInput: function(/* Event */e){
|
||
|
var key = (e.charCode == dojo.keys.SPACE ? dojo.keys.SPACE : e.keyCode);
|
||
|
if(key == dojo.keys.ENTER || key == 13){
|
||
|
this.chat(this.phrase.value);
|
||
|
this.phrase.value='';
|
||
|
}
|
||
|
},
|
||
|
|
||
|
_sendPhrase: function(/* Event */e){
|
||
|
if (this.phrase.value){
|
||
|
this.chat(this.phrase.value);
|
||
|
this.phrase.value='';
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
|
||
|
}
|