lib/jschat/http/public/javascripts/app/controllers/chat_controller.js in jschat-0.1.5 vs lib/jschat/http/public/javascripts/app/controllers/chat_controller.js in jschat-0.2.0
- old
+ new
@@ -12,12 +12,48 @@
$('post_message').observe('submit', this.postMessageFormEvent.bindAsEventListener(this));
$('messages').observe('scroll', this.messagesScrolled.bindAsEventListener(this));
$$('#rooms li.join a').first().observe('click', this.joinRoomClicked.bindAsEventListener(this));
Event.observe(document, 'click', this.roomTabClick.bindAsEventListener(this));
+ this.allRecentMessages();
},
+ allRecentMessages: function() {
+ new Ajax.Request('/room_update_times', {
+ method: 'get',
+ onComplete: function(request) {
+ var times = request.responseText.evalJSON();
+ $H(this.lastUpdateTimes).each(function(data) {
+ var room = data[0],
+ time = data[1];
+ if (Date.parse(time) < Date.parse(times[room])) {
+ this.roomTabAlert(room);
+ }
+ }.bind(this));
+ this.lastUpdateTimes = times;
+ }.bind(this)
+ });
+ },
+
+ roomTabAlert: function(room) {
+ if (room === PageHelper.currentRoom()) return;
+
+ $$('ul#rooms li a').each(function(roomLink) {
+ if (roomLink.innerHTML === room) {
+ roomLink.addClassName('new');
+ }
+ });
+ },
+
+ clearRoomTabAlert: function(room) {
+ $$('ul#rooms li a').each(function(roomLink) {
+ if (roomLink.innerHTML === room) {
+ roomLink.removeClassName('new');
+ }
+ });
+ },
+
joinRoomClicked: function(e) {
this.addRoomPrompt(e);
Event.stop(e);
return false;
},
@@ -75,11 +111,11 @@
if (!command_posted) {
if (message.match(/^\//)) {
Display.add_message('Error: Command not found. Use /help display commands.', 'error');
} else {
- Display.message({ 'message': message.escapeHTML(), 'user': $('name').innerHTML }, true);
+ Display.message({ 'message': message.escapeHTML(), 'user': $('name').innerHTML }, new Date());
new Ajax.Request('/message', {
method: 'post',
parameters: { 'message': message, 'to': PageHelper.currentRoom() }
});
}
@@ -110,21 +146,25 @@
Event.stop(e);
return false;
});
this.createPollers();
+ this.getRoomList(this.addRoomAndCheckSelected);
this.joinRoom(PageHelper.currentRoom());
- this.getRoomList(this.addRoomToNav);
},
getRoomList: function(callback) {
new Ajax.Request('/rooms', {
method: 'get',
parameters: { time: new Date().getTime() },
onComplete: function(response) {
- response.responseText.evalJSON().each(function(roomName) {
- callback(roomName);
+ response.responseText.evalJSON().sort().each(function(roomName) {
+ try {
+ callback.apply(this, [roomName]);
+ } catch (exception) {
+ console.log(exception);
+ }
}.bind(this));
}.bind(this)
});
},
@@ -136,11 +176,11 @@
Display.add_message("Error: Couldn't join channel", 'server');
$('loading').hide();
},
onComplete: function() {
// Make the server update the last polled time
- JsChat.Request.get('/messages');
+ JsChat.Request.get('/messages', function() {});
document.title = PageHelper.title();
UserCommands['/lastlog'].apply(this);
$('loading').hide();
$('rooms').show();
this.addRoomToNav(roomName, true);
@@ -179,10 +219,14 @@
var classAttribute = selected ? ' class="selected"' : '';
$('rooms').insert({ bottom: '<li#{classAttribute}><a href="#{roomName}">#{roomName}</a></li>'.interpolate({ classAttribute: classAttribute, roomName: roomName }) });
},
+ addRoomAndCheckSelected: function(roomName) {
+ this.addRoomToNav(roomName, PageHelper.currentRoom() == roomName);
+ },
+
removeSelectedTab: function() {
$$('#rooms .selected').invoke('removeClassName', 'selected');
},
selectRoomTab: function(roomName) {
@@ -195,10 +239,11 @@
joinRoomInTab: function(roomName) {
this.removeSelectedTab();
PageHelper.setCurrentRoomName(roomName);
this.joinRoom(roomName);
+ $('message').focus();
},
switchRoom: function(roomName) {
if (PageHelper.currentRoom() == roomName) {
return;
@@ -206,10 +251,12 @@
this.removeSelectedTab();
this.selectRoomTab(roomName);
PageHelper.setCurrentRoomName(roomName);
UserCommands['/lastlog'].apply(this);
+ this.clearRoomTabAlert(roomName);
+ $('message').focus();
},
rooms: function() {
return $$('#rooms li a').slice(1).collect(function(element) {
return element.innerHTML;
@@ -261,10 +308,14 @@
console.log(exception);
}
},
updateMessages: function() {
+ if (this.pausePollers) {
+ return;
+ }
+
new Ajax.Request('/messages', {
method: 'get',
parameters: { time: new Date().getTime(), room: PageHelper.currentRoom() },
onSuccess: function(transport) {
this.showMessagesResponse(transport);
@@ -282,13 +333,13 @@
return;
}
json_set.each(function(json) {
try {
if (json['change']) {
- Change[json['change']](json[json['change']]);
+ Change[json['change']](json[json['change']], json['time']);
} else {
- Display[json['display']](json[json['display']]);
+ Display[json['display']](json[json['display']], json['time']);
if (json['display'] !== 'error' && typeof successCallback !== 'undefined') {
successCallback();
}
}
} catch (exception) {
@@ -314,7 +365,8 @@
createPollers: function() {
this.pollers = $A();
this.pollers.push(new PeriodicalExecuter(this.updateMessages.bind(this), 3));
this.pollers.push(new PeriodicalExecuter(this.checkIdleNames.bind(this), 5));
+ this.pollers.push(new PeriodicalExecuter(this.allRecentMessages.bind(this), 10));
}
});