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)); } });