GIF89a;
Direktori : /home/serb/www/livechat/js/app/view/admin/ |
Current File : /home/serb/www/livechat/js/app/view/admin/ChatView.js |
//============================================================================== // // Chat view // //============================================================================== (function(app, $, config, _) { var ChatView = app.ChatView = Backbone.View.extend({ events : { 'click .customer-chat-content-message-emots-button' : 'toggleEmoticons', 'click .customer-chat-emoticon' : 'addEmoticon', 'click .btn-canned-msg' : 'selectCannedMessage', 'keydown .customer-chat-content-message-input-field' : 'sendMessage' }, guestUrl : '', typingInfoBlinking : false, initialize : function() { // Initialize models this.settings = app.model.settings; this.chat = app.model.chat; this.user = app.model.user; // Create sub views this.chatBox = new app.ChatBoxView({ el : this.$('.customer-chat-content-messages') }); // Cache view components this.$currentUrl = this.$('.current-url'); this.$emoticons = this.$('.customer-chat-emots-menu'); this.$typingInfo = this.$('.typing-indicator'); this.$input = this.$('.customer-chat-content-message-input-field'); if(this.model.hasRole('OPERATOR')) { this.$el.addClass('operator'); } // Handle "talk already taken" notification this.listenTo(this.chat, 'messages:sent', this.handleMessageSent); // Handle user updates this.listenTo(this.model, 'change', this.handleModelUpdate); this.handleModelUpdate(); // Handle typing status this.listenTo(this.chat, 'users:typing', this.handleRemoteTyping); }, toggleEmoticons : function() { // Toggle emoticons this.$emoticons.toggle('fade', 'fast'); }, addEmoticon : function(evt) { var $emot = $(evt.currentTarget); this.$input.val(this.$input.val() + ' ' + $emot.data('emot') + ' '); // Set focus on the input this.$input.focus(); // Hide emoticons menu this.$emoticons.fadeOut('fast'); }, sendMessage : function(evt) { // Handle typing status this.handleTyping(); // React only to the ENTER key if(evt.keyCode !== 13 || evt.shiftKey) { return; } var body = this.$input.val(); // Do nothing if there's no input if(body.length == 0) { return; } var message = new app.MessageModel({ author : this.user.get('name'), mail : this.user.get('mail'), authorType : 'operator', body : body, time : new Date(), to : this.model.get('id') }, { localMessage : true }); message.fromUser = this.user.attributes; // Send the message this.chat.sendMessage(message); // Add message to the chat box this.chatBox.addMessage(message, true); // Clear the input field this.$input.val(''); // Notify about message sent this.trigger('message.sent', message); }, handleMessageSent : function(to, msgData) { if(to === this.model.get('id') && msgData.to_id === -2) { // Notify about the talk already taken by another operator msgData.from_user_info.image = 'no_image.jpg'; var message = new app.MessageModel({ author : '[system message]', body : 'Another operator is already helping this guest, your messages will not be delivered.', datetime : new Date(), image : '#', from_user_info : msgData.from_user_info }); this.chatBox.addMessage(message, true); } }, handleNewMessages : function(messages, silent) { _.each(messages, this.handleMessage, this); // Play notification sound if(!silent && messages.length > 0 && this.settings.get('sound')) app.service.soundPlayer.play('message'); }, handleMessage : function(msgData) { // Add the message to the chat box msgData.info = this.model.get('info'); var message = new app.MessageModel(msgData); // Add message to the chat box this.chatBox.addMessage(message); }, handleTyping : function() { this.chat.updateTypingStatus(this.model.get('id')); }, handleRemoteTyping : function(ids) { // Check for this user's ID if(ids.indexOf(this.model.get('id')) === -1) return; this.startTypingInfoBlink(); // Hide automatically later if(this.stopTypingBlinkTimer) clearTimeout(this.stopTypingBlinkTimer); this.stopTypingBlinkTimer = setTimeout($.proxy(this.stopTypingInfoBlink, this), ChatView.TYPING_STATUS_TIME); }, handleModelUpdate : function() { // Update url currently visited by user var info = this.model.get('info'); if(info) { if(this.guestUrl !== info.referer) { this.guestUrl = info.referer; // Animation var _this = this; this.$currentUrl.parent().animate({ opacity : 0 }, { duration : 'slow', complete : function() { _this.$currentUrl.html(info.referer).attr('href', info.referer); $(this).animate({ opacity : 1 }, { duration : 'slow' }); }}); } } }, startTypingInfoBlink : function() { if(!this.typingInfoBlinking) { this.typingInfoBlinking = true; this.blinkTypingInfo(); } }, blinkTypingInfo : function() { if(!this.typingInfoBlinking) { return; } var _this = this; this.$typingInfo.fadeIn('slow', function() { _this.$typingInfo.fadeOut('slow', function() { _this.blinkTypingInfo(); }); }); }, stopTypingInfoBlink : function() { this.typingInfoBlinking = false; }, selectCannedMessage : function() { var _this = this; var view = new app.SelectCannedMessageView({ model : app.model.cannedMessages }); app.view.dialogs.confirm('Select message', view, { 'Insert' : function() { var $this = $(this); var message = view.selected; $this.dialog('close'); // Update the message input field if(message) { var currValue = _this.$input.val(); _this.$input.val(currValue + (currValue.length > 0 ? ' ' : '') + message).focus(); } } }, 'auto'); }, }, { TYPING_STATUS_TIME : 2000 }); })(window.Application, jQuery, window.chatConfig, _);