From e4844832f197cce9031fdcb02d4c071e605793bf Mon Sep 17 00:00:00 2001 From: Dmitriy Simushev Date: Fri, 15 Feb 2013 10:25:58 +0000 Subject: [PATCH] Create chat module in Chat JavaScript application --- src/messenger/webim/js/compiled/chat/app.js | 7 +- src/messenger/webim/js/compiled/chat/init.js | 2 +- .../webim/js/compiled/chat/modules/chat.js | 12 + src/messenger/webim/js/compiled/chat_app.js | 20 +- src/messenger/webim/js/source/chat/app.js | 203 +--------------- src/messenger/webim/js/source/chat/init.js | 10 - .../webim/js/source/chat/modules/chat.js | 225 ++++++++++++++++++ 7 files changed, 258 insertions(+), 221 deletions(-) create mode 100644 src/messenger/webim/js/compiled/chat/modules/chat.js create mode 100644 src/messenger/webim/js/source/chat/modules/chat.js diff --git a/src/messenger/webim/js/compiled/chat/app.js b/src/messenger/webim/js/compiled/chat/app.js index c0e1633e..74e93fa6 100644 --- a/src/messenger/webim/js/compiled/chat/app.js +++ b/src/messenger/webim/js/compiled/chat/app.js @@ -5,9 +5,4 @@ Copyright (c) 2005-2011 Mibew Messenger Community License: http://mibew.org/license.php */ -(function(a,k){var h=a.Application;h.addRegions({mainRegion:"#main-region"});h.addInitializer(function(d){var g=a.Objects,c=a.Objects.Models,b=a.Objects.Models.Controls,j=a.Objects.Models.Status,f=new a.Layouts.Chat({model:new Backbone.Model(d.layoutsData.chat||{})});a.Objects.chatLayout=f;h.mainRegion.show(f);g.server=new a.Server(k.extend({interactionType:MibewAPIChatInteraction},d.server));c.thread=new a.Models.Thread(d.thread);c.user=new a.Models.ChatUser(d.user);c.page=new a.Models.Page(d.page); -var e=new a.Collections.Controls;c.user.get("isAgent")||(b.userName=new a.Models.UserNameControl({weight:220}),e.add(b.userName),b.sendMail=new a.Models.SendMailControl({weight:200,link:d.links.mailLink}),e.add(b.sendMail));c.user.get("isAgent")&&(b.redirect=new a.Models.RedirectControl({weight:200,link:d.links.redirectLink}),e.add(b.redirect),b.history=new a.Models.HistoryControl({weight:180,link:d.links.historyLink}),e.add(b.history));b.sound=new a.Models.SoundControl({weight:160});e.add(b.sound); -b.refresh=new a.Models.RefreshControl({weight:140});e.add(b.refresh);d.links.sslLink&&(b.secureMode=new a.Models.SecureModeControl({weight:120,link:d.links.sslLink}),e.add(b.secureMode));b.close=new a.Models.CloseControl({weight:100});e.add(b.close);g.Collections.controls=e;f.controlsRegion.show(new a.Views.ControlsCollection({collection:e}));j.message=new a.Models.StatusMessage({hideTimeout:5E3});j.typing=new a.Models.StatusTyping({hideTimeout:5E3});g.Collections.status=new a.Collections.Status([j.message, -j.typing]);f.statusRegion.show(new a.Views.StatusCollection({collection:g.Collections.status}));c.user.get("isAgent")||(c.avatar=new a.Models.Avatar,f.avatarRegion.show(new a.Views.Avatar({model:c.avatar})));g.Collections.messages=new a.Collections.Messages;c.messageForm=new a.Models.MessageForm(d.messageForm);f.messageFormRegion.show(new a.Views.MessageForm({model:c.messageForm}));f.messagesRegion.show(new a.Views.MessagesCollection({collection:g.Collections.messages}));c.sound=new a.Models.Sound; -f.soundRegion.show(new a.Views.Sound({model:c.sound}));g.server.callFunctionsPeriodically(function(){var b=a.Objects.Models.thread,c=a.Objects.Models.user;return[{"function":"update",arguments:{"return":{typing:"typing",canPost:"canPost"},references:{},threadId:b.get("id"),token:b.get("token"),lastId:b.get("lastId"),typed:c.get("typing"),user:!c.get("isAgent")}}]},function(b){b.errorCode?a.Objects.Models.Status.message.setMessage(b.errorMessage||"refresh failed"):(b.typing&&a.Objects.Models.Status.typing.show(), -a.Objects.Models.user.set({canPost:b.canPost||!1}))})});h.on("start",function(){a.Objects.server.runUpdater()})})(Mibew,_); +(function(a,d){var b=a.Application;b.addRegions({mainRegion:"#main-region"});b.addInitializer(function(c){a.Objects.server=new a.Server(d.extend({interactionType:MibewAPIChatInteraction},c.server));b.Chat.start(c)});b.on("start",function(){a.Objects.server.runUpdater()})})(Mibew,_); diff --git a/src/messenger/webim/js/compiled/chat/init.js b/src/messenger/webim/js/compiled/chat/init.js index fec9bc44..f6f8d51d 100644 --- a/src/messenger/webim/js/compiled/chat/init.js +++ b/src/messenger/webim/js/compiled/chat/init.js @@ -5,4 +5,4 @@ Copyright (c) 2005-2011 Mibew Messenger Community License: http://mibew.org/license.php */ -(function(a){a.Regions={};a.Layouts={};a.Objects.Models.Controls={};a.Objects.Models.Status={};a.Application=new Backbone.Marionette.Application})(Mibew); +(function(a){a.Regions={};a.Layouts={};a.Application=new Backbone.Marionette.Application})(Mibew); diff --git a/src/messenger/webim/js/compiled/chat/modules/chat.js b/src/messenger/webim/js/compiled/chat/modules/chat.js new file mode 100644 index 00000000..7c97c07e --- /dev/null +++ b/src/messenger/webim/js/compiled/chat/modules/chat.js @@ -0,0 +1,12 @@ +/* + This file is part of Mibew Messenger project. + http://mibew.org + + Copyright (c) 2005-2011 Mibew Messenger Community + License: http://mibew.org/license.php +*/ +(function(a){a.Objects.Models.Controls={};a.Objects.Models.Status={};var j=a.Application;j.module("Chat",{startWithParent:!1}).addInitializer(function(d){var g=a.Objects,c=a.Objects.Models,b=a.Objects.Models.Controls,h=a.Objects.Models.Status,f=new a.Layouts.Chat({model:new Backbone.Model(d.layoutsData.chat||{})});a.Objects.chatLayout=f;j.mainRegion.show(f);c.thread=new a.Models.Thread(d.thread);c.user=new a.Models.ChatUser(d.user);c.page=new a.Models.Page(d.page);var e=new a.Collections.Controls; +c.user.get("isAgent")||(b.userName=new a.Models.UserNameControl({weight:220}),e.add(b.userName),b.sendMail=new a.Models.SendMailControl({weight:200,link:d.links.mailLink}),e.add(b.sendMail));c.user.get("isAgent")&&(b.redirect=new a.Models.RedirectControl({weight:200,link:d.links.redirectLink}),e.add(b.redirect),b.history=new a.Models.HistoryControl({weight:180,link:d.links.historyLink}),e.add(b.history));b.sound=new a.Models.SoundControl({weight:160});e.add(b.sound);b.refresh=new a.Models.RefreshControl({weight:140}); +e.add(b.refresh);d.links.sslLink&&(b.secureMode=new a.Models.SecureModeControl({weight:120,link:d.links.sslLink}),e.add(b.secureMode));b.close=new a.Models.CloseControl({weight:100});e.add(b.close);g.Collections.controls=e;f.controlsRegion.show(new a.Views.ControlsCollection({collection:e}));h.message=new a.Models.StatusMessage({hideTimeout:5E3});h.typing=new a.Models.StatusTyping({hideTimeout:5E3});g.Collections.status=new a.Collections.Status([h.message,h.typing]);f.statusRegion.show(new a.Views.StatusCollection({collection:g.Collections.status})); +c.user.get("isAgent")||(c.avatar=new a.Models.Avatar,f.avatarRegion.show(new a.Views.Avatar({model:c.avatar})));g.Collections.messages=new a.Collections.Messages;c.messageForm=new a.Models.MessageForm(d.messageForm);f.messageFormRegion.show(new a.Views.MessageForm({model:c.messageForm}));f.messagesRegion.show(new a.Views.MessagesCollection({collection:g.Collections.messages}));c.sound=new a.Models.Sound;f.soundRegion.show(new a.Views.Sound({model:c.sound}));g.server.callFunctionsPeriodically(function(){var b= +a.Objects.Models.thread,c=a.Objects.Models.user;return[{"function":"update",arguments:{"return":{typing:"typing",canPost:"canPost"},references:{},threadId:b.get("id"),token:b.get("token"),lastId:b.get("lastId"),typed:c.get("typing"),user:!c.get("isAgent")}}]},function(b){b.errorCode?a.Objects.Models.Status.message.setMessage(b.errorMessage||"refresh failed"):(b.typing&&a.Objects.Models.Status.typing.show(),a.Objects.Models.user.set({canPost:b.canPost||!1}))})})})(Mibew); diff --git a/src/messenger/webim/js/compiled/chat_app.js b/src/messenger/webim/js/compiled/chat_app.js index 2eb4eb2d..6b5c490c 100644 --- a/src/messenger/webim/js/compiled/chat_app.js +++ b/src/messenger/webim/js/compiled/chat_app.js @@ -4,7 +4,7 @@ Copyright (c) 2005-2011 Mibew Messenger Community License: http://mibew.org/license.php */ -(function(a){a.Regions={};a.Layouts={};a.Objects.Models.Controls={};a.Objects.Models.Status={};a.Application=new Backbone.Marionette.Application})(Mibew); +(function(a){a.Regions={};a.Layouts={};a.Application=new Backbone.Marionette.Application})(Mibew); /* This file is part of Mibew Messenger project. http://mibew.org @@ -256,9 +256,15 @@ c=""!=this.ui.message.val();c!=a.get("typing")&&a.set({typing:c})},setFocus:func Copyright (c) 2005-2011 Mibew Messenger Community License: http://mibew.org/license.php */ -(function(a,k){var h=a.Application;h.addRegions({mainRegion:"#main-region"});h.addInitializer(function(d){var g=a.Objects,c=a.Objects.Models,b=a.Objects.Models.Controls,j=a.Objects.Models.Status,f=new a.Layouts.Chat({model:new Backbone.Model(d.layoutsData.chat||{})});a.Objects.chatLayout=f;h.mainRegion.show(f);g.server=new a.Server(k.extend({interactionType:MibewAPIChatInteraction},d.server));c.thread=new a.Models.Thread(d.thread);c.user=new a.Models.ChatUser(d.user);c.page=new a.Models.Page(d.page); -var e=new a.Collections.Controls;c.user.get("isAgent")||(b.userName=new a.Models.UserNameControl({weight:220}),e.add(b.userName),b.sendMail=new a.Models.SendMailControl({weight:200,link:d.links.mailLink}),e.add(b.sendMail));c.user.get("isAgent")&&(b.redirect=new a.Models.RedirectControl({weight:200,link:d.links.redirectLink}),e.add(b.redirect),b.history=new a.Models.HistoryControl({weight:180,link:d.links.historyLink}),e.add(b.history));b.sound=new a.Models.SoundControl({weight:160});e.add(b.sound); -b.refresh=new a.Models.RefreshControl({weight:140});e.add(b.refresh);d.links.sslLink&&(b.secureMode=new a.Models.SecureModeControl({weight:120,link:d.links.sslLink}),e.add(b.secureMode));b.close=new a.Models.CloseControl({weight:100});e.add(b.close);g.Collections.controls=e;f.controlsRegion.show(new a.Views.ControlsCollection({collection:e}));j.message=new a.Models.StatusMessage({hideTimeout:5E3});j.typing=new a.Models.StatusTyping({hideTimeout:5E3});g.Collections.status=new a.Collections.Status([j.message, -j.typing]);f.statusRegion.show(new a.Views.StatusCollection({collection:g.Collections.status}));c.user.get("isAgent")||(c.avatar=new a.Models.Avatar,f.avatarRegion.show(new a.Views.Avatar({model:c.avatar})));g.Collections.messages=new a.Collections.Messages;c.messageForm=new a.Models.MessageForm(d.messageForm);f.messageFormRegion.show(new a.Views.MessageForm({model:c.messageForm}));f.messagesRegion.show(new a.Views.MessagesCollection({collection:g.Collections.messages}));c.sound=new a.Models.Sound; -f.soundRegion.show(new a.Views.Sound({model:c.sound}));g.server.callFunctionsPeriodically(function(){var b=a.Objects.Models.thread,c=a.Objects.Models.user;return[{"function":"update",arguments:{"return":{typing:"typing",canPost:"canPost"},references:{},threadId:b.get("id"),token:b.get("token"),lastId:b.get("lastId"),typed:c.get("typing"),user:!c.get("isAgent")}}]},function(b){b.errorCode?a.Objects.Models.Status.message.setMessage(b.errorMessage||"refresh failed"):(b.typing&&a.Objects.Models.Status.typing.show(), -a.Objects.Models.user.set({canPost:b.canPost||!1}))})});h.on("start",function(){a.Objects.server.runUpdater()})})(Mibew,_); +(function(a){a.Objects.Models.Controls={};a.Objects.Models.Status={};var j=a.Application;j.module("Chat",{startWithParent:!1}).addInitializer(function(d){var g=a.Objects,c=a.Objects.Models,b=a.Objects.Models.Controls,h=a.Objects.Models.Status,f=new a.Layouts.Chat({model:new Backbone.Model(d.layoutsData.chat||{})});a.Objects.chatLayout=f;j.mainRegion.show(f);c.thread=new a.Models.Thread(d.thread);c.user=new a.Models.ChatUser(d.user);c.page=new a.Models.Page(d.page);var e=new a.Collections.Controls; +c.user.get("isAgent")||(b.userName=new a.Models.UserNameControl({weight:220}),e.add(b.userName),b.sendMail=new a.Models.SendMailControl({weight:200,link:d.links.mailLink}),e.add(b.sendMail));c.user.get("isAgent")&&(b.redirect=new a.Models.RedirectControl({weight:200,link:d.links.redirectLink}),e.add(b.redirect),b.history=new a.Models.HistoryControl({weight:180,link:d.links.historyLink}),e.add(b.history));b.sound=new a.Models.SoundControl({weight:160});e.add(b.sound);b.refresh=new a.Models.RefreshControl({weight:140}); +e.add(b.refresh);d.links.sslLink&&(b.secureMode=new a.Models.SecureModeControl({weight:120,link:d.links.sslLink}),e.add(b.secureMode));b.close=new a.Models.CloseControl({weight:100});e.add(b.close);g.Collections.controls=e;f.controlsRegion.show(new a.Views.ControlsCollection({collection:e}));h.message=new a.Models.StatusMessage({hideTimeout:5E3});h.typing=new a.Models.StatusTyping({hideTimeout:5E3});g.Collections.status=new a.Collections.Status([h.message,h.typing]);f.statusRegion.show(new a.Views.StatusCollection({collection:g.Collections.status})); +c.user.get("isAgent")||(c.avatar=new a.Models.Avatar,f.avatarRegion.show(new a.Views.Avatar({model:c.avatar})));g.Collections.messages=new a.Collections.Messages;c.messageForm=new a.Models.MessageForm(d.messageForm);f.messageFormRegion.show(new a.Views.MessageForm({model:c.messageForm}));f.messagesRegion.show(new a.Views.MessagesCollection({collection:g.Collections.messages}));c.sound=new a.Models.Sound;f.soundRegion.show(new a.Views.Sound({model:c.sound}));g.server.callFunctionsPeriodically(function(){var b= +a.Objects.Models.thread,c=a.Objects.Models.user;return[{"function":"update",arguments:{"return":{typing:"typing",canPost:"canPost"},references:{},threadId:b.get("id"),token:b.get("token"),lastId:b.get("lastId"),typed:c.get("typing"),user:!c.get("isAgent")}}]},function(b){b.errorCode?a.Objects.Models.Status.message.setMessage(b.errorMessage||"refresh failed"):(b.typing&&a.Objects.Models.Status.typing.show(),a.Objects.Models.user.set({canPost:b.canPost||!1}))})})})(Mibew); +/* + This file is part of Mibew Messenger project. + http://mibew.org + Copyright (c) 2005-2011 Mibew Messenger Community + License: http://mibew.org/license.php +*/ +(function(a,d){var b=a.Application;b.addRegions({mainRegion:"#main-region"});b.addInitializer(function(c){a.Objects.server=new a.Server(d.extend({interactionType:MibewAPIChatInteraction},c.server));b.Chat.start(c)});b.on("start",function(){a.Objects.server.runUpdater()})})(Mibew,_); diff --git a/src/messenger/webim/js/source/chat/app.js b/src/messenger/webim/js/source/chat/app.js index e05165ea..f4abb52a 100644 --- a/src/messenger/webim/js/source/chat/app.js +++ b/src/messenger/webim/js/source/chat/app.js @@ -9,217 +9,26 @@ (function (Mibew, _) { // Create shortcut for application - var App = Mibew.Application; + var app = Mibew.Application; // Define regions - App.addRegions({ + app.addRegions({ mainRegion: '#main-region' }); // Initialize application - App.addInitializer(function(options){ - // Create some shortcuts - var objs = Mibew.Objects; - var models = Mibew.Objects.Models; - var controls = Mibew.Objects.Models.Controls; - var status = Mibew.Objects.Models.Status; - - // Create instance of the chat layout - // Use undocumented feature of layouts: passing model to layout - var layout = new Mibew.Layouts.Chat({ - model: new Backbone.Model(options.layoutsData.chat || {}) - }); - Mibew.Objects.chatLayout = layout; - - // Show layout at page - App.mainRegion.show(layout); - + app.addInitializer(function(options){ // Initialize Server, Thread and User - objs.server = new Mibew.Server(_.extend( + Mibew.Objects.server = new Mibew.Server(_.extend( { 'interactionType': MibewAPIChatInteraction }, options.server )); - models.thread = new Mibew.Models.Thread(options.thread); - models.user = new Mibew.Models.ChatUser(options.user); - - - // Initialize Page - models.page = new Mibew.Models.Page(options.page); - - - // Initialize controls - // Create controls collection - var ctrlsCollection = new Mibew.Collections.Controls(); - - // Create controls only for user - if (! models.user.get('isAgent')) { - // Create user name control - controls.userName = new Mibew.Models.UserNameControl({ - weight: 220 - }); - ctrlsCollection.add(controls.userName); - - // Create mail control - controls.sendMail = new Mibew.Models.SendMailControl({ - weight: 200, - link: options.links.mailLink - }); - ctrlsCollection.add(controls.sendMail); - } - - // Create controls only for agent - if (models.user.get('isAgent')) { - controls.redirect = new Mibew.Models.RedirectControl({ - weight: 200, - link: options.links.redirectLink - }); - ctrlsCollection.add(controls.redirect); - - controls.history = new Mibew.Models.HistoryControl({ - weight: 180, - link: options.links.historyLink - }); - ctrlsCollection.add(controls.history); - } - - // Create toggle sound button - controls.sound = new Mibew.Models.SoundControl({ - weight: 160 - }); - ctrlsCollection.add(controls.sound); - - // Create refresh button - controls.refresh = new Mibew.Models.RefreshControl({ - weight: 140 - }); - ctrlsCollection.add(controls.refresh); - - if (options.links.sslLink) { - controls.secureMode = new Mibew.Models.SecureModeControl({ - weight: 120, - link: options.links.sslLink - }); - ctrlsCollection.add(controls.secureMode); - } - - // Create close button - controls.close = new Mibew.Models.CloseControl({ - weight: 100 - }); - ctrlsCollection.add(controls.close); - - objs.Collections.controls = ctrlsCollection; - - // Display controls - layout.controlsRegion.show(new Mibew.Views.ControlsCollection({ - collection: ctrlsCollection - })); - - - // Iniitialize status bar - // Create status message model - status.message = new Mibew.Models.StatusMessage({hideTimeout: 5000}); - - // Create typing status model - status.typing = new Mibew.Models.StatusTyping({hideTimeout: 5000}); - - // Create status collection - objs.Collections.status = new Mibew.Collections.Status([ - status.message, - status.typing - ]); - - // Display status bar - layout.statusRegion.show(new Mibew.Views.StatusCollection({ - collection: objs.Collections.status - })); - - - // Initialize avatar only for user - if (! models.user.get('isAgent')) { - models.avatar = new Mibew.Models.Avatar(); - layout.avatarRegion.show(new Mibew.Views.Avatar({ - model: models.avatar - })); - } - - - // Initialize chat window - // Create messages collection and store it - objs.Collections.messages = new Mibew.Collections.Messages(); - - // Create message processor model - models.messageForm = new Mibew.Models.MessageForm( - options.messageForm - ); - - // Display message processor - layout.messageFormRegion.show(new Mibew.Views.MessageForm({ - model: models.messageForm - })); - - // Display messages - layout.messagesRegion.show(new Mibew.Views.MessagesCollection({ - collection: objs.Collections.messages - })); - - - // Initialize sounds - models.sound = new Mibew.Models.Sound(); - layout.soundRegion.show(new Mibew.Views.Sound({ - model: models.sound - })); - - // TODO: May be move it somewhere else - // Periodically call update function at the server side - objs.server.callFunctionsPeriodically( - function() { - // Get thread and user objects - var thread = Mibew.Objects.Models.thread; - var user = Mibew.Objects.Models.user; - - // Build functions list - return [ - { - "function": "update", - "arguments": { - "return": { - 'typing': 'typing', - 'canPost': 'canPost' - }, - "references": {}, - "threadId": thread.get('id'), - "token": thread.get('token'), - "lastId": thread.get('lastId'), - "typed": user.get('typing'), - "user": (! user.get('isAgent')) - } - } - ] - }, - function(args) { - // Check if there was an error - if (args.errorCode) { - Mibew.Objects.Models.Status.message.setMessage( - args.errorMessage || 'refresh failed' - ); - return; - } - // Update typing status - if (args.typing) { - Mibew.Objects.Models.Status.typing.show(); - } - // Update user - Mibew.Objects.Models.user.set({ - canPost: args.canPost || false - }); - } - ); + app.Chat.start(options); }); - App.on('start', function() { + app.on('start', function() { // Run Server updater Mibew.Objects.server.runUpdater(); }); diff --git a/src/messenger/webim/js/source/chat/init.js b/src/messenger/webim/js/source/chat/init.js index 9f195d0d..671f0882 100644 --- a/src/messenger/webim/js/source/chat/init.js +++ b/src/messenger/webim/js/source/chat/init.js @@ -18,16 +18,6 @@ */ Mibew.Layouts = {}; - /** - * @namespace Holds instances of control models - */ - Mibew.Objects.Models.Controls = {}; - - /** - * @namespace Holds instances of status models - */ - Mibew.Objects.Models.Status = {}; - /** * Create application instance. * @type Backbone.Marionette.Application diff --git a/src/messenger/webim/js/source/chat/modules/chat.js b/src/messenger/webim/js/source/chat/modules/chat.js new file mode 100644 index 00000000..3c483903 --- /dev/null +++ b/src/messenger/webim/js/source/chat/modules/chat.js @@ -0,0 +1,225 @@ +/** + * @preserve This file is part of Mibew Messenger project. + * http://mibew.org + * + * Copyright (c) 2005-2011 Mibew Messenger Community + * License: http://mibew.org/license.php + */ + +(function(Mibew){ + + /** + * @namespace Holds instances of control models + */ + Mibew.Objects.Models.Controls = {}; + + /** + * @namespace Holds instances of status models + */ + Mibew.Objects.Models.Status = {}; + + + // Create shortcut for Application object + var app = Mibew.Application; + + // Create Chat module + var chat = app.module('Chat', {startWithParent: false}); + + // Add module initializer + chat.addInitializer(function(options) { + // Create some shortcuts + var objs = Mibew.Objects; + var models = Mibew.Objects.Models; + var controls = Mibew.Objects.Models.Controls; + var status = Mibew.Objects.Models.Status; + + // Create instance of the chat layout + // Use undocumented feature of layouts: passing model to layout + var layout = new Mibew.Layouts.Chat({ + model: new Backbone.Model(options.layoutsData.chat || {}) + }); + Mibew.Objects.chatLayout = layout; + + // Show layout at page + app.mainRegion.show(layout); + + // Initialize Thread and User + models.thread = new Mibew.Models.Thread(options.thread); + models.user = new Mibew.Models.ChatUser(options.user); + + + // Initialize Page + models.page = new Mibew.Models.Page(options.page); + + + // Initialize controls + // Create controls collection + var ctrlsCollection = new Mibew.Collections.Controls(); + + // Create controls only for user + if (! models.user.get('isAgent')) { + // Create user name control + controls.userName = new Mibew.Models.UserNameControl({ + weight: 220 + }); + ctrlsCollection.add(controls.userName); + + // Create mail control + controls.sendMail = new Mibew.Models.SendMailControl({ + weight: 200, + link: options.links.mailLink + }); + ctrlsCollection.add(controls.sendMail); + } + + // Create controls only for agent + if (models.user.get('isAgent')) { + controls.redirect = new Mibew.Models.RedirectControl({ + weight: 200, + link: options.links.redirectLink + }); + ctrlsCollection.add(controls.redirect); + + controls.history = new Mibew.Models.HistoryControl({ + weight: 180, + link: options.links.historyLink + }); + ctrlsCollection.add(controls.history); + } + + // Create toggle sound button + controls.sound = new Mibew.Models.SoundControl({ + weight: 160 + }); + ctrlsCollection.add(controls.sound); + + // Create refresh button + controls.refresh = new Mibew.Models.RefreshControl({ + weight: 140 + }); + ctrlsCollection.add(controls.refresh); + + if (options.links.sslLink) { + controls.secureMode = new Mibew.Models.SecureModeControl({ + weight: 120, + link: options.links.sslLink + }); + ctrlsCollection.add(controls.secureMode); + } + + // Create close button + controls.close = new Mibew.Models.CloseControl({ + weight: 100 + }); + ctrlsCollection.add(controls.close); + + objs.Collections.controls = ctrlsCollection; + + // Display controls + layout.controlsRegion.show(new Mibew.Views.ControlsCollection({ + collection: ctrlsCollection + })); + + + // Iniitialize status bar + // Create status message model + status.message = new Mibew.Models.StatusMessage({hideTimeout: 5000}); + + // Create typing status model + status.typing = new Mibew.Models.StatusTyping({hideTimeout: 5000}); + + // Create status collection + objs.Collections.status = new Mibew.Collections.Status([ + status.message, + status.typing + ]); + + // Display status bar + layout.statusRegion.show(new Mibew.Views.StatusCollection({ + collection: objs.Collections.status + })); + + + // Initialize avatar only for user + if (! models.user.get('isAgent')) { + models.avatar = new Mibew.Models.Avatar(); + layout.avatarRegion.show(new Mibew.Views.Avatar({ + model: models.avatar + })); + } + + + // Initialize chat window + // Create messages collection and store it + objs.Collections.messages = new Mibew.Collections.Messages(); + + // Create message processor model + models.messageForm = new Mibew.Models.MessageForm( + options.messageForm + ); + + // Display message processor + layout.messageFormRegion.show(new Mibew.Views.MessageForm({ + model: models.messageForm + })); + + // Display messages + layout.messagesRegion.show(new Mibew.Views.MessagesCollection({ + collection: objs.Collections.messages + })); + + + // Initialize sounds + models.sound = new Mibew.Models.Sound(); + layout.soundRegion.show(new Mibew.Views.Sound({ + model: models.sound + })); + + // TODO: May be move it somewhere else + // Periodically call update function at the server side + objs.server.callFunctionsPeriodically( + function() { + // Get thread and user objects + var thread = Mibew.Objects.Models.thread; + var user = Mibew.Objects.Models.user; + + // Build functions list + return [ + { + "function": "update", + "arguments": { + "return": { + 'typing': 'typing', + 'canPost': 'canPost' + }, + "references": {}, + "threadId": thread.get('id'), + "token": thread.get('token'), + "lastId": thread.get('lastId'), + "typed": user.get('typing'), + "user": (! user.get('isAgent')) + } + } + ] + }, + function(args) { + // Check if there was an error + if (args.errorCode) { + Mibew.Objects.Models.Status.message.setMessage( + args.errorMessage || 'refresh failed' + ); + return; + } + // Update typing status + if (args.typing) { + Mibew.Objects.Models.Status.typing.show(); + } + // Update user + Mibew.Objects.Models.user.set({ + canPost: args.canPost || false + }); + } + ); + }); + +})(Mibew); \ No newline at end of file