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