lib/jschat/http/public/javascripts/app/controllers/chat_controller.js in jschat-0.1.2 vs lib/jschat/http/public/javascripts/app/controllers/chat_controller.js in jschat-0.1.5

- old
+ new

@@ -10,12 +10,30 @@ Event.observe(window, 'blur', this.blurEvent.bindAsEventListener(this)); Event.observe(window, 'resize', this.resizeEvent.bindAsEventListener(this)); $('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)); }, + joinRoomClicked: function(e) { + this.addRoomPrompt(e); + Event.stop(e); + return false; + }, + + roomTabClick: function(e) { + var element = Event.element(e); + + if (element.tagName == 'A' && element.up('#rooms') && !element.up('li').hasClassName('join')) { + this.switchRoom(element.innerHTML); + Event.stop(e); + return false; + } + }, + messagesScrolled: function() { Display.scrolled = (($('messages').scrollHeight - $('messages').scrollTop) > $('messages').getHeight()); }, focusEvent: function() { @@ -78,12 +96,11 @@ initDisplay: function() { Display.unread = 0; Display.show_unread = false; Display.ignore_notices = false; - $('room-name').innerHTML = TextHelper.truncateRoomName(PageHelper.currentRoom()); - $('room-name').title = PageHelper.currentRoom(); + PageHelper.setCurrentRoomName(window.location.hash); $('message').activate(); $$('.header .navigation li').invoke('hide'); $('quit-nav').show(); $('help-nav').show(); @@ -93,28 +110,140 @@ Event.stop(e); return false; }); this.createPollers(); - this.joinRoom(); + this.joinRoom(PageHelper.currentRoom()); + this.getRoomList(this.addRoomToNav); }, - joinRoom: function() { + 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); + }.bind(this)); + }.bind(this) + }); + }, + + joinRoom: function(roomName) { new Ajax.Request('/join', { method: 'post', - parameters: { time: new Date().getTime(), room: PageHelper.currentRoom() }, + parameters: { time: new Date().getTime(), room: roomName }, onFailure: function() { 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'); document.title = PageHelper.title(); UserCommands['/lastlog'].apply(this); $('loading').hide(); + $('rooms').show(); + this.addRoomToNav(roomName, true); }.bind(this) }); + }, + + isValidRoom: function(roomName) { + if (PageHelper.allRoomNames().include(roomName)) { + return false; + } + return true; + }, + + validateAndJoinRoom: function(roomName) { + if (roomName === null || roomName.length == 0) { + return; + } + + if (!roomName.match(/^#/)) { + roomName = '#' + roomName; + } + + if (this.isValidRoom(roomName)) { + this.joinRoomInTab(roomName); + } + }, + + addRoomPrompt: function() { + var roomName = prompt('Enter a room name:'); + this.validateAndJoinRoom(roomName); + }, + + addRoomToNav: function(roomName, selected) { + if (PageHelper.allRoomNames().include(roomName)) return; + + var classAttribute = selected ? ' class="selected"' : ''; + $('rooms').insert({ bottom: '<li#{classAttribute}><a href="#{roomName}">#{roomName}</a></li>'.interpolate({ classAttribute: classAttribute, roomName: roomName }) }); + }, + + removeSelectedTab: function() { + $$('#rooms .selected').invoke('removeClassName', 'selected'); + }, + + selectRoomTab: function(roomName) { + $$('#rooms a').each(function(a) { + if (a.innerHTML == roomName) { + a.up('li').addClassName('selected'); + } + }); + }, + + joinRoomInTab: function(roomName) { + this.removeSelectedTab(); + PageHelper.setCurrentRoomName(roomName); + this.joinRoom(roomName); + }, + + switchRoom: function(roomName) { + if (PageHelper.currentRoom() == roomName) { + return; + } + + this.removeSelectedTab(); + this.selectRoomTab(roomName); + PageHelper.setCurrentRoomName(roomName); + UserCommands['/lastlog'].apply(this); + }, + + rooms: function() { + return $$('#rooms li a').slice(1).collect(function(element) { + return element.innerHTML; + }); + }, + + partRoom: function(roomName) { + if (this.rooms().length == 1) { + return UserCommands['/quit'](); + } + + new Ajax.Request('/part', { + method: 'get', + parameters: { room: roomName }, + onSuccess: function(request) { + this.removeTab(roomName); + }.bind(this), + onFailure: function(request) { + Display.add_message('Error: ' + request.responseText, 'server'); + } + }); + }, + + removeTab: function(roomName) { + $$('#rooms li').each(function(element) { + if (element.down('a').innerHTML == roomName) { + element.remove(); + + if (roomName == PageHelper.currentRoom()) { + this.switchRoom($$('#rooms li a')[1].innerHTML); + } + } + }.bind(this)); }, updateNames: function() { UserCommands['/names'].apply(this); },