GIF89a;
| Direktori : /home/serb/www/livechat/js/app/view/admin/ |
| Current File : /home/serb/www/livechat/js/app/view/admin/ChatTabView.js |
//==============================================================================
//
// Chat tab view
//
//==============================================================================
(function(app, $, config)
{
app.ChatTabView = Backbone.View.extend({
events : {
'click .customer-chat-tab-button .close' : 'closeTalk',
'click .customer-chat-history-item' : 'showTalk'
},
talks : {},
unreadTalks : 0,
initialize : function()
{
// Initialize models
this.settings = app.model.settings;
this.chat = app.model.chat;
this.user = app.model.user;
// Create sub views
this.tabsView = new app.TabsView ({ el : this.$('.chat-wrapper') });
this.chatBox = new app.ChatBoxView({ el : this.$('.customer-chat-content-messages') });
// Cache view components
this.$emoticons = this.$('.customer-chat-emots-menu');
this.$input = this.$('.customer-chat-content-message-input-field');
this.$onlineList = this.$('#customer-chat-users-online .customer-chat-content-messages-wrapper.users');
this.$onlineListOperator = this.$('#customer-chat-users-online .customer-chat-content-messages-wrapper.operators');
if(this.user.hasRole('ADMIN'))
{
this.tabsView.remove();
this.$('#customer-chat-users-online').addClass('admin');
}
// Handle online users list
this.listenTo(this.chat, 'users:online', this.renderOnlineUsers);
// Handle new messages
this.listenTo(this.chat, 'messages:new', this.handleNewMessages);
// Handle scroller updates
this.listenTo(this.tabsView, 'tab.show', function()
{
$(window).resize();
});
// Handle "new message" indicator hiding
this.listenTo(this.tabsView, 'tab.show', this.handleTalkShown);
this.listenTo(app, 'menu:show:chat', this.handleChatShown);
},
renderOnlineUsers : function(users)
{
// Clear the list
this.$onlineList.html('');
this.$onlineListOperator.html('');
// Add currently available users
for(var i = 0; i < users.length; i++)
{
var user = users[i];
var userModel = new app.UserModel(user);
var $item = $(app.template.historyListItem);
$item.data('info', userModel);
$item.find('.customer-chat-history-item-username').html(userModel.getReadableName());
// Add item to the view
if(user.roles.indexOf('OPERATOR') !== -1) this.$onlineListOperator.append($item);
else this.$onlineList.append($item);
// Initialize user info popover
new app.UserInfoPopoverView({ model : userModel, button : $item[0] });
// Update user's info in talks
var talk = this.getTalkWith(userModel);
if(talk)
{
talk.chatView.model.set(userModel.attributes);
}
}
// Update the scroller
$(window).trigger('resize');
},
addTalk : function(options)
{
// Create button
var $button = $(app.template.tabButtonChat);
$button.find('span').html(options.user.getReadableName());
$button.data('user', options.user);
// Animate new message icon
var $icon = $button.find('.new-msg');
$icon.hide();
(function animateIcon()
{
$icon.animate({ opacity: 0.01 }, { duration : 'slow', complete : function()
{
$icon.animate({ opacity: 1 }, { duration : 'slow', complete : animateIcon });
}});
})();
// Create content
var $content = $(app.template.tabContentChat);
var chatView = new app.ChatView({ el : $content, model : options.user });
// Add new tab to the view
this.tabsView.addTab({ button : $button, content : $content });
// Store the talk
var talk = { chatView : chatView, $button : $button };
this.talks[options.user.get('id')] = talk;
// Handle sent messages
this.listenTo(chatView, 'message.sent', this.handleMessageSent);
return talk;
},
removeTalkWith : function(user)
{
// Remove the talk
var talk = this.talks[user.get('id')];
this.tabsView.removeTab(this.tabsView.getButtonIndex(talk.$button[0]));
talk.chatView.remove();
delete this.talks[user.get('id')];
},
hasTalkWith : function(user)
{
return !!this.talks[user.get('id')];
},
getTalkWith : function(user)
{
return this.talks[user.get('id')];
},
showTalk : function(e)
{
// Get the user model
var user = $(e.currentTarget).data('info');
// In admin's mode show history for the user
if(this.user.hasRole('ADMIN'))
{
app.trigger('history.search', {
name : user.get('name'),
mail : user.get('mail'),
fromDate : '',
toDate : ''
});
return;
}
// Create and/or show the talk
var talk = this.getTalkWith(user);
if(!talk)
{
talk = this.addTalk({ user : user });
// Download last messages from this talk
this.chat.getLastMessages(user.get('id'), null, function(messages)
{
// Add messages to the chat
if(messages.length > 0) talk.chatView.handleNewMessages(messages, true);
});
}
this.tabsView.showTabForButton(talk.$button[0]);
},
closeTalk : function(e)
{
var user = $(e.currentTarget).parent('.customer-chat-tab-button').data('user');
this.removeTalkWith(user);
e.stopImmediatePropagation();
},
handleNewMessages : function(messages)
{
// Group messages by author
var grouped = _.groupBy(messages, 'from_id');
// Handle groups
_.each(grouped, function(messages)
{
var user = new app.UserModel(messages[0].from_user_info);
var talk = this.getTalkWith(user);
// Create new talk, if needed
if(!talk)
{
talk = this.addTalk({ user : user });
var lastMessage = messages[0];
var _this = this;
this.chat.getLastMessages(user.get('id'), lastMessage.id, function(lastMessages)
{
// Add last messages to the chat
if(lastMessages.length > 0) talk.chatView.handleNewMessages(lastMessages, true);
// Add new messages to the chat
_this.initTalk(talk, messages);
});
}
else
{
this.initTalk(talk, messages);
}
}, this);
},
initTalk : function(talk, messages)
{
// Pass all the messages to be handled by the talk's view
talk.chatView.handleNewMessages(messages);
// Add "new-message" indicator to the tab's button
var $icon = talk.$button.find('.new-msg');
if($icon.is(':hidden'))
{
$icon.show();
this.updateUnreadCounter(1);
}
},
handleMessageSent : function(message)
{
var talk = this.getTalkWith(new app.UserModel({ id : message.get('to') }));
// Remove the "new-message" indicator from the tab's button
var $icon = talk.$button.find('.new-msg');
if($icon.is(':visible'))
{
$icon.hide();
this.updateUnreadCounter(-1);
}
},
handleTalkShown : function(tabIndex)
{
// Remove the "new-message" indicator from the tab's button
var $icon = this.tabsView.getButton(tabIndex).find('.new-msg');
if($icon.is(':visible'))
{
$icon.hide();
this.updateUnreadCounter(-1);
}
},
handleChatShown : function()
{
// Update currently visible talk
this.tabsView.render();
},
updateUnreadCounter : function(x)
{
var prevCount = this.unreadTalks;
this.unreadTalks = Math.max(0, this.unreadTalks + x);
// Notify about the important states
if(prevCount === 1 && this.unreadTalks === 0)
{
this.trigger('talks.read');
}
else
{
this.trigger('talks.unread');
}
}
});
})(window.Application, jQuery, window.chatConfig);