mirror of
https://github.com/Mibew/design.git
synced 2024-11-15 09:24:12 +03:00
Completely rewrite Chat's JavaScript files
This commit is contained in:
parent
1565458c26
commit
053837d069
@ -162,7 +162,7 @@ if( !isset($_GET['token']) || !isset($_GET['thread']) ) {
|
||||
|
||||
$token = verifyparam( "token", "/^\d{1,8}$/");
|
||||
$threadid = verifyparam( "thread", "/^\d{1,8}$/");
|
||||
$level = verifyparam( "level", "/^(ajaxed|simple|old)$/");
|
||||
$level = verifyparam( "level", "/^(ajaxed|old)$/");
|
||||
|
||||
$thread = Thread::load($threadid, $token);
|
||||
if (! $thread) {
|
||||
@ -178,11 +178,9 @@ if( $pparam == "mailthread" ) {
|
||||
// Load JavaScript plugins and JavaScripts, CSS files required by them
|
||||
$page['additional_css'] = get_additional_css('chatWindow');
|
||||
$page['additional_js'] = get_additional_js('chatWindow');
|
||||
$page['js_plugins'] = get_js_plugins('chatWindow');
|
||||
$page['js_plugin_options'] = get_js_plugin_options('chatWindow');
|
||||
// Expand page
|
||||
expand("styles/dialogs", getchatstyle(), "chat.tpl");
|
||||
} else if( $level == "simple" ) {
|
||||
expand("styles/dialogs", getchatstyle(), "chatsimple.tpl");
|
||||
} else if( $level == "old" ) {
|
||||
expand("styles/dialogs", getchatstyle(), "nochat.tpl");
|
||||
}
|
||||
|
12
src/messenger/webim/js/compiled/chat/app.js
Normal file
12
src/messenger/webim/js/compiled/chat/app.js
Normal file
@ -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,j){var f=new j.Marionette.Application;f.addRegions({controlsRegion:"#controls-region",avatarRegion:"#avatar-region",messagesRegion:a.Regions.Messages,statusRegion:"#status-region",messageFormRegion:"#message-form-region",soundRegion:"#sound-region"});f.addInitializer(function(d){var g=a.Objects,c=a.Objects.Models,b=a.Objects.Models.Controls,h=a.Objects.Models.Status;g.server=new a.Server(d.server);g.thread=new a.Thread(d.thread);c.user=new a.Models.User(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.push(b.userName),b.sendMail=new a.Models.SendMailControl({weight:200,link:d.links.mailLink}),e.push(b.sendMail));c.user.get("isAgent")&&(b.redirect=new a.Models.RedirectControl({weight:200,link:d.links.redirectLink}),e.push(b.redirect),b.history=new a.Models.HistoryControl({weight:180,link:d.links.historyLink}),e.push(b.history));b.sound=new a.Models.SoundControl({weight:160});e.push(b.sound);
|
||||
b.refresh=new a.Models.RefreshControl({weight:140});e.push(b.refresh);d.links.sslLink&&(b.secureMode=new a.Models.SecureModeControl({weight:120,link:d.links.sslLink}),e.push(b.secureMode));b.close=new a.Models.CloseControl({weight:100});e.push(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.runUpdater()});a.Application=f})(Mibew,Backbone);
|
8
src/messenger/webim/js/compiled/chat/collections/controls.js
vendored
Normal file
8
src/messenger/webim/js/compiled/chat/collections/controls.js
vendored
Normal file
@ -0,0 +1,8 @@
|
||||
/*
|
||||
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,b){a.Collections.Controls=b.Collection.extend({comparator:function(a){return a.get("weight")}})})(Mibew,Backbone);
|
10
src/messenger/webim/js/compiled/chat/collections/messages.js
Normal file
10
src/messenger/webim/js/compiled/chat/collections/messages.js
Normal file
@ -0,0 +1,10 @@
|
||||
/*
|
||||
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(b,d,c){b.Collections.Messages=d.Collection.extend({model:b.Models.Message,initialize:function(){b.Objects.server.callFunctionsPeriodically(c.bind(this.updateFunctionBuilder,this),c.bind(this.updateChatState,this));b.Objects.server.registerFunction("updateMessages",c.bind(this.apiUpdateMessages,this))},apiUpdateMessages:function(a){a.lastId&&(b.Objects.thread.lastId=a.lastId);for(var e=[],c=0,d=a.messages.length;c<d;c++)e.push(new b.Models.Message(a.messages[c]));0<e.length&&this.add(e)},
|
||||
updateFunctionBuilder:function(){var a=b.Objects.thread,c=b.Objects.Models.user;return[{"function":"update",arguments:{"return":{typing:"typing",canPost:"canPost"},references:{},threadId:a.threadId,token:a.token,lastId:a.lastId,typed:c.get("typing"),user:!c.get("isAgent")}}]},updateChatState:function(a){a.errorCode?b.Objects.Models.Status.message.setMessage(a.errorMessage||"refresh failed"):(a.typing&&b.Objects.Models.Status.typing.show(),b.Objects.Models.user.set({canPost:a.canPost||!1}))},add:function(){var a=
|
||||
Array.prototype.slice.apply(arguments),a=d.Collection.prototype.add.apply(this,a);this.trigger("multiple:add");return a}})})(Mibew,Backbone,_);
|
@ -0,0 +1,8 @@
|
||||
/*
|
||||
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,b){a.Collections.Status=b.Collection.extend({comparator:function(a){return a.get("weight")}})})(Mibew,Backbone);
|
@ -0,0 +1,8 @@
|
||||
/*
|
||||
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(b){b.registerHelper("allowTags",function(a){a=a.replace(/<(span|strong)>(.*?)<\/\1>/g,"<$1>$2</$1>");a=a.replace(/<span class="(.*?)">(.*?)<\/span>/g,'<span class="$1">$2</span>');return new b.SafeString(a)})})(Handlebars);
|
@ -5,4 +5,4 @@
|
||||
Copyright (c) 2005-2011 Mibew Messenger Community
|
||||
License: http://mibew.org/license.php
|
||||
*/
|
||||
var PluginManager=function(){var b={};this.addPlugin=function(a,c){b[a]=c};this.getPlugin=function(a){return b[a]?b[a]:!1}};
|
||||
(function(a){a.Regions={};a.Objects.Models.Controls={};a.Objects.Models.Status={}})(Mibew);
|
8
src/messenger/webim/js/compiled/chat/models/avatar.js
Normal file
8
src/messenger/webim/js/compiled/chat/models/avatar.js
Normal file
@ -0,0 +1,8 @@
|
||||
/*
|
||||
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,b){a.Models.Avatar=a.Models.Base.extend({defaults:{imageLink:!1},initialize:function(){a.Objects.server.registerFunction("setupAvatar",b.bind(this.apiSetupAvatar,this))},apiSetupAvatar:function(a){a.imageLink&&this.set({imageLink:a.imageLink})}})})(Mibew,_);
|
@ -0,0 +1,8 @@
|
||||
/*
|
||||
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.Models.Control=a.Models.Base.extend({defaults:{title:"",weight:0}})})(Mibew);
|
@ -0,0 +1,8 @@
|
||||
/*
|
||||
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.Models.CloseControl=a.Models.Control.extend({getModelType:function(){return"CloseControl"},closeThread:function(){var b=a.Objects.thread;a.Objects.server.callFunctions([{"function":"close",arguments:{references:{},"return":{closed:"closed"},threadId:b.threadId,token:b.token,lastId:b.lastId,user:!a.Objects.Models.user.get("isAgent")}}],function(b){b.closed?window.close():a.Objects.Models.Status.message.setMessage(b.errorMessage||"Cannot close")},!0)}})})(Mibew);
|
@ -0,0 +1,8 @@
|
||||
/*
|
||||
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,b){a.Models.HistoryControl=a.Models.Control.extend({defaults:b.extend({},a.Models.Control.prototype.defaults,{link:!1}),getModelType:function(){return"HistoryControl"}})})(Mibew,_);
|
@ -0,0 +1,8 @@
|
||||
/*
|
||||
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,b){a.Models.RedirectControl=a.Models.Control.extend({defaults:b.extend({},a.Models.Control.prototype.defaults,{link:!1}),getModelType:function(){return"RedirectControl"}})})(Mibew,_);
|
@ -0,0 +1,8 @@
|
||||
/*
|
||||
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.Models.RefreshControl=a.Models.Control.extend({getModelType:function(){return"RefreshControl"},refresh:function(){a.Objects.server.restartUpdater()}})})(Mibew);
|
@ -0,0 +1,8 @@
|
||||
/*
|
||||
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,b){a.Models.SecureModeControl=a.Models.Control.extend({defaults:b.extend({},a.Models.Control.prototype.defaults,{link:!1}),getModelType:function(){return"SecureModeControl"}})})(Mibew,_);
|
@ -0,0 +1,8 @@
|
||||
/*
|
||||
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,b){a.Models.SendMailControl=a.Models.Control.extend({defaults:b.extend({},a.Models.Control.prototype.defaults,{link:!1}),getModelType:function(){return"SendMailControl"}})})(Mibew,_);
|
@ -0,0 +1,8 @@
|
||||
/*
|
||||
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,b){a.Models.SoundControl=a.Models.Control.extend({defaults:b.extend({},a.Models.Control.prototype.defaults,{enabled:!0}),getModelType:function(){return"SoundControl"}})})(Mibew,_);
|
@ -0,0 +1,8 @@
|
||||
/*
|
||||
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(b){b.Models.UserNameControl=b.Models.Control.extend({getModelType:function(){return"UserNameControl"},changeName:function(a){var c=b.Objects.Models.user,d=b.Objects.thread,e=c.get("name");a&&e!=a&&(b.Objects.server.callFunctions([{"function":"rename",arguments:{references:{},"return":{},threadId:d.threadId,token:d.token,name:a}}],function(a){a.errorCode&&(b.Objects.Models.Status.message.setMessage(a.errorMessage||"Cannot rename"),c.set({name:e}))},!0),c.set({name:a}))}})})(Mibew);
|
@ -0,0 +1,8 @@
|
||||
/*
|
||||
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.Models.Message=a.Models.Base.extend({defaults:{message:""}})})(Mibew);
|
@ -0,0 +1,8 @@
|
||||
/*
|
||||
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.Models.MessageForm=a.Models.Base.extend({defaults:{predefinedAnswers:[],ignoreCtrl:!1},postMessage:function(e){var b=a.Objects.thread,c=a.Objects.Models.user;if(c.get("canPost")){this.trigger("before:post",this);var d=this;a.Objects.server.callFunctions([{"function":"post",arguments:{references:{},"return":{},message:e,threadId:b.threadId,token:b.token,user:!c.get("isAgent")}}],function(){d.trigger("after:post",d)},!0)}}})})(Mibew);
|
@ -0,0 +1,8 @@
|
||||
/*
|
||||
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(b,c){b.Models.Status=b.Models.Base.extend({defaults:{visible:!0,weight:0,hideTimeout:4E3,title:""},initialize:function(){this.hideTimer=null},autoHide:function(a){a=a||this.get("hideTimeout");this.hideTimer&&clearTimeout(this.hideTimer);this.hideTimer=setTimeout(c.bind(function(){this.set({visible:!1})},this),a)}})})(Mibew,_);
|
@ -0,0 +1,8 @@
|
||||
/*
|
||||
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,b){a.Models.StatusMessage=a.Models.Status.extend({defaults:b.extend({},a.Models.Status.prototype.defaults,{message:"",visible:!1}),getModelType:function(){return"StatusMessage"},setMessage:function(a){this.set({message:a,visible:!0});this.autoHide()}})})(Mibew,_);
|
@ -0,0 +1,8 @@
|
||||
/*
|
||||
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,b){a.Models.StatusTyping=a.Models.Status.extend({defaults:b.extend({},a.Models.Status.prototype.defaults,{visible:!1,hideTimeout:2E3}),getModelType:function(){return"StatusTyping"},show:function(){this.set({visible:!0});this.autoHide()}})})(Mibew,_);
|
8
src/messenger/webim/js/compiled/chat/regions/messages.js
Normal file
8
src/messenger/webim/js/compiled/chat/regions/messages.js
Normal file
@ -0,0 +1,8 @@
|
||||
/*
|
||||
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,b){a.Regions.Messages=b.Marionette.Region.extend({el:"#messages-region",onShow:function(a){a.on("after:item:added",this.scrollToBottom,this)},scrollToBottom:function(){this.$el.scrollTop(this.$el.prop("scrollHeight"))}})})(Mibew,Backbone);
|
8
src/messenger/webim/js/compiled/chat/views/avatar.js
Normal file
8
src/messenger/webim/js/compiled/chat/views/avatar.js
Normal file
@ -0,0 +1,8 @@
|
||||
/*
|
||||
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,b,c){a.Views.Avatar=b.Marionette.ItemView.extend({template:c.templates.avatar,className:"avatar",modelEvents:{change:"render"}})})(Mibew,Backbone,Handlebars);
|
@ -0,0 +1,9 @@
|
||||
/*
|
||||
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(b,c,d){b.Views.Control=c.Marionette.ItemView.extend({template:d.templates.control,modelEvents:{change:"render"},events:{mouseover:"mouseOver",mouseleave:"mouseLeave"},attributes:function(){var a=[];a.push("control");this.className&&(a.push(this.className),this.className="");var b=this.getDashedControlType();b&&a.push(b);return{"class":a.join(" ")}},mouseOver:function(){var a=this.getDashedControlType();this.$el.addClass("active"+(a?"-"+a:""))},mouseLeave:function(){var a=this.getDashedControlType();
|
||||
this.$el.removeClass("active"+(a?"-"+a:""))},getDashedControlType:function(){"undefined"==typeof this.dashedControlType&&(this.dashedControlType=b.Utils.toDashFormat(this.model.getModelType())||"");return this.dashedControlType}})})(Mibew,Backbone,Handlebars);
|
@ -0,0 +1,8 @@
|
||||
/*
|
||||
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,c,d){a.Views.CloseControl=a.Views.Control.extend({template:c.templates.close_control,events:d.extend({},a.Views.Control.prototype.events,{click:"close"}),close:function(){var b=a.Localization.get("chat.close.confirmation");(!1===b||confirm(b))&&this.model.closeThread()}})})(Mibew,Handlebars,_);
|
@ -0,0 +1,8 @@
|
||||
/*
|
||||
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.Views.ControlsCollection=a.Views.CollectionBase.extend({itemView:a.Views.Control,className:"controls-collection"})})(Mibew);
|
@ -0,0 +1,8 @@
|
||||
/*
|
||||
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(b,d,e){b.Views.HistoryControl=b.Views.Control.extend({template:d.templates.history_control,events:e.extend({},b.Views.Control.prototype.events,{click:"showHistory"}),showHistory:function(){var c=b.Objects.Models.user,a=this.model.get("link");c.get("isAgent")&&a&&(c=this.$el.find(".control-config").eq(0).data("win-params"),a=a.replace("&","&","g"),a=window.open(a,"UserHistory",c),null!==a&&(a.focus(),a.opener=window))}})})(Mibew,Handlebars,_);
|
@ -0,0 +1,9 @@
|
||||
/*
|
||||
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,e){a.Views.RedirectControl=a.Views.Control.extend({template:d.templates.redirect_control,events:e.extend({},a.Views.Control.prototype.events,{click:"redirect"}),initialize:function(){a.Objects.Models.user.on("change",this.render,this)},serializeData:function(){var b=this.model.toJSON();b.user=a.Objects.Models.user.toJSON();return b},redirect:function(){var b=a.Objects.Models.user;if(b.get("isAgent")&&b.get("canPost")&&(b=this.model.get("link"))){var c=a.Objects.Models.page.get("style");
|
||||
window.location.href=b.replace(/\&\;/g,"&")+(c?"&style="+c:"")}}})})(Mibew,Handlebars,_);
|
@ -0,0 +1,8 @@
|
||||
/*
|
||||
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,b,c){a.Views.RefreshControl=a.Views.Control.extend({template:b.templates.refresh_control,events:c.extend({},a.Views.Control.prototype.events,{click:"refresh"}),refresh:function(){this.model.refresh()}})})(Mibew,Handlebars,_);
|
@ -0,0 +1,8 @@
|
||||
/*
|
||||
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,e){a.Views.SecureModeControl=a.Views.Control.extend({template:d.templates.secure_mode_control,events:e.extend({},a.Views.Control.prototype.events,{click:"secure"}),secure:function(){var b=this.model.get("link");if(b){var c=a.Objects.Models.page.get("style");window.location.href=b.replace(/\&\;/g,"&")+(c?"&style="+c:"")}}})})(Mibew,Handlebars,_);
|
@ -0,0 +1,8 @@
|
||||
/*
|
||||
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(b,c,e){b.Views.SendMailControl=b.Views.Control.extend({template:c.templates.send_mail_control,events:e.extend({},b.Views.Control.prototype.events,{click:"sendMail"}),sendMail:function(){var a=this.model.get("link");if(a){var c=this.$el.find(".control-config").eq(0).data("win-params"),d=b.Objects.Models.page.get("style"),a=a.replace(/\&\;/g,"&")+(d?"&style="+d:""),a=window.open(a,"ForwardMail",c);null!==a&&(a.focus(),a.opener=window)}}})})(Mibew,Handlebars,_);
|
@ -0,0 +1,8 @@
|
||||
/*
|
||||
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,b,c){a.Views.SoundControl=a.Views.Control.extend({template:b.templates.sound_control,events:c.extend({},a.Views.Control.prototype.events,{click:"toggle"}),toggle:function(){this.model.set({enabled:!this.model.get("enabled")})}})})(Mibew,Handlebars,_);
|
@ -0,0 +1,9 @@
|
||||
/*
|
||||
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(b,c,d){b.Views.UserNameControl=b.Views.Control.extend({template:c.templates.user_name_control,events:d.extend({},b.Views.Control.prototype.events,{"click .user-name-control-set":"changeName","click .user-name-control-change":"showNameInput","keydown #user-name-control-input":"inputKeyDown"}),ui:{nameInput:"#user-name-control-input"},initialize:function(){b.Objects.Models.user.on("change:name",this.hideNameInput,this);this.nameInput=b.Objects.Models.user.get("defaultName")},serializeData:function(){var a=
|
||||
this.model.toJSON();a.user=b.Objects.Models.user.toJSON();a.nameInput=this.nameInput;return a},inputKeyDown:function(a){a=a.which;(13==a||10==a)&&this.changeName()},hideNameInput:function(){this.nameInput=!1;this.render()},showNameInput:function(){this.nameInput=!0;this.render()},changeName:function(){var a=this.ui.nameInput.val();this.model.changeName(a)}})})(Mibew,Handlebars,_);
|
@ -0,0 +1,9 @@
|
||||
/*
|
||||
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(c,d,e){var f={"<":"<",">":">","&":"&",'"':""","'":"'","`":"`"},g=/[&<>'"`]/g;c.Views.Message=d.Marionette.ItemView.extend({template:e.templates.message,className:"message",modelEvents:{change:"render"},serializeData:function(){var a=this.model.toJSON(),b=this.model.get("kind");a.allowFormatting=b!=this.KIND_USER&&b!=this.KIND_AGENT;a.kindName=this.kindToString(b);a.message=this.escapeString(a.message);return a},kindToString:function(a){return a==this.KIND_USER?"user":
|
||||
a==this.KIND_AGENT?"agent":a==this.KIND_FOR_AGENT?"hidden":a==this.KIND_INFO?"inf":a==this.KIND_CONN?"conn":a==this.KIND_EVENTS?"event":""},escapeString:function(a){return a.replace(g,function(a){return f[a]||"&"})},KIND_USER:1,KIND_AGENT:2,KIND_FOR_AGENT:3,KIND_INFO:4,KIND_CONN:5,KIND_EVENTS:6,KIND_AVATAR:7})})(Mibew,Backbone,Handlebars);
|
@ -0,0 +1,11 @@
|
||||
/*
|
||||
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(b,d,e){b.Views.MessageForm=d.Marionette.ItemView.extend({template:e.templates.message_form,events:{"click #send-message":"postMessage","keydown #message-input":"messageKeyDown","keyup #message-input":"checkUserTyping","change #message-input":"checkUserTyping","change #predefined":"selectPredefinedAnswer","focus #message-input":"setFocus","blur #message-input":"dropFocus"},modelEvents:{change:"render"},ui:{message:"#message-input",send:"#send-message",predefinedAnswer:"#predefined"},initialize:function(){b.Objects.Models.user.on("change:canPost",
|
||||
this.render,this)},serializeData:function(){var a=this.model.toJSON();a.user=b.Objects.Models.user.toJSON();return a},postMessage:function(){var a=this.ui.message.val();""!=a&&(this.disableInput(),this.model.postMessage(a));b.Objects.Collections.messages.on("multiple:add",this.postMessageComplete,this)},messageKeyDown:function(a){var c=a.which;a=a.ctrlKey;(13==c&&(a||this.model.get("ignoreCtrl"))||10==c)&&this.postMessage()},enableInput:function(){this.ui.message.removeAttr("disabled")},disableInput:function(){this.ui.message.attr("disabled",
|
||||
"disabled")},clearInput:function(){this.ui.message.val("").change()},postMessageComplete:function(){this.clearInput();this.enableInput();this.focused&&this.ui.focus();b.Objects.Collections.messages.off("multiple:add",this.postMessageComplete,this)},selectPredefinedAnswer:function(){var a=this.ui.message,c=this.ui.predefinedAnswer,b=c.get(0).selectedIndex;b&&(a.val(this.model.get("predefinedAnswers")[b-1].full).change(),a.focus(),c.get(0).selectedIndex=0)},checkUserTyping:function(){var a=b.Objects.Models.user,
|
||||
c=""!=this.ui.message.val();c!=a.get("typing")&&a.set({typing:c})},setFocus:function(){this.focused=!0},dropFocus:function(){this.focused=!1}})})(Mibew,Backbone,Handlebars);
|
@ -0,0 +1,9 @@
|
||||
/*
|
||||
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.Views.MessagesCollection=a.Views.CollectionBase.extend({itemView:a.Views.Message,className:"messages-collection",initialize:function(){this.collection.on("multiple:add",this.messagesAdded,this);a.Objects.Models.messageForm.on("before:post",this.messagePost,this)},skipNextSound:!0,messagePost:function(){this.skipNextSound=!0},messagesAdded:function(){if(!this.skipNextSound&&a.Objects.Models.Controls.sound.get("enabled")){var b=a.Objects.Models.page.get("webimRoot");b&&a.Objects.Models.sound.play(b+
|
||||
"/sounds/new_message.wav")}this.skipNextSound=!1}})})(Mibew);
|
@ -0,0 +1,8 @@
|
||||
/*
|
||||
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,b,c){a.Views.Status=b.Marionette.ItemView.extend({template:c.templates.status,className:"status",modelEvents:{change:"render"},onBeforeRender:function(){this.model.get("visible")?this.$el.show():this.$el.hide()}})})(Mibew,Backbone,Handlebars);
|
@ -0,0 +1,8 @@
|
||||
/*
|
||||
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,b){a.Views.StatusMessage=a.Views.Status.extend({template:b.templates.status_message})})(Mibew,Handlebars);
|
@ -0,0 +1,8 @@
|
||||
/*
|
||||
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.Views.StatusCollection=a.Views.CollectionBase.extend({itemView:a.Views.Status,className:"status-collection"})})(Mibew);
|
@ -0,0 +1,8 @@
|
||||
/*
|
||||
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,b){a.Views.StatusTyping=a.Views.Status.extend({template:b.templates.status_typing})})(Mibew,Handlebars);
|
106
src/messenger/webim/js/compiled/chat_app.js
Normal file
106
src/messenger/webim/js/compiled/chat_app.js
Normal file
@ -0,0 +1,106 @@
|
||||
/*
|
||||
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.Regions={};a.Objects.Models.Controls={};a.Objects.Models.Status={}})(Mibew);
|
||||
(function(b){b.registerHelper("allowTags",function(a){a=a.replace(/<(span|strong)>(.*?)<\/\1>/g,"<$1>$2</$1>");a=a.replace(/<span class="(.*?)">(.*?)<\/span>/g,'<span class="$1">$2</span>');return new b.SafeString(a)})})(Handlebars);
|
||||
(function(a){a.Models.Control=a.Models.Base.extend({defaults:{title:"",weight:0}})})(Mibew);
|
||||
(function(b,c){b.Models.Status=b.Models.Base.extend({defaults:{visible:!0,weight:0,hideTimeout:4E3,title:""},initialize:function(){this.hideTimer=null},autoHide:function(a){a=a||this.get("hideTimeout");this.hideTimer&&clearTimeout(this.hideTimer);this.hideTimer=setTimeout(c.bind(function(){this.set({visible:!1})},this),a)}})})(Mibew,_);
|
||||
(function(a,b){a.Models.Avatar=a.Models.Base.extend({defaults:{imageLink:!1},initialize:function(){a.Objects.server.registerFunction("setupAvatar",b.bind(this.apiSetupAvatar,this))},apiSetupAvatar:function(a){a.imageLink&&this.set({imageLink:a.imageLink})}})})(Mibew,_);
|
||||
(function(a){a.Models.CloseControl=a.Models.Control.extend({getModelType:function(){return"CloseControl"},closeThread:function(){var b=a.Objects.thread;a.Objects.server.callFunctions([{"function":"close",arguments:{references:{},"return":{closed:"closed"},threadId:b.threadId,token:b.token,lastId:b.lastId,user:!a.Objects.Models.user.get("isAgent")}}],function(b){b.closed?window.close():a.Objects.Models.Status.message.setMessage(b.errorMessage||"Cannot close")},!0)}})})(Mibew);
|
||||
(function(a,b){a.Models.HistoryControl=a.Models.Control.extend({defaults:b.extend({},a.Models.Control.prototype.defaults,{link:!1}),getModelType:function(){return"HistoryControl"}})})(Mibew,_);
|
||||
(function(a,b){a.Models.RedirectControl=a.Models.Control.extend({defaults:b.extend({},a.Models.Control.prototype.defaults,{link:!1}),getModelType:function(){return"RedirectControl"}})})(Mibew,_);
|
||||
(function(a){a.Models.RefreshControl=a.Models.Control.extend({getModelType:function(){return"RefreshControl"},refresh:function(){a.Objects.server.restartUpdater()}})})(Mibew);
|
||||
(function(a,b){a.Models.SecureModeControl=a.Models.Control.extend({defaults:b.extend({},a.Models.Control.prototype.defaults,{link:!1}),getModelType:function(){return"SecureModeControl"}})})(Mibew,_);
|
||||
(function(a,b){a.Models.SendMailControl=a.Models.Control.extend({defaults:b.extend({},a.Models.Control.prototype.defaults,{link:!1}),getModelType:function(){return"SendMailControl"}})})(Mibew,_);
|
||||
(function(a,b){a.Models.SoundControl=a.Models.Control.extend({defaults:b.extend({},a.Models.Control.prototype.defaults,{enabled:!0}),getModelType:function(){return"SoundControl"}})})(Mibew,_);
|
||||
(function(b){b.Models.UserNameControl=b.Models.Control.extend({getModelType:function(){return"UserNameControl"},changeName:function(a){var c=b.Objects.Models.user,d=b.Objects.thread,e=c.get("name");a&&e!=a&&(b.Objects.server.callFunctions([{"function":"rename",arguments:{references:{},"return":{},threadId:d.threadId,token:d.token,name:a}}],function(a){a.errorCode&&(b.Objects.Models.Status.message.setMessage(a.errorMessage||"Cannot rename"),c.set({name:e}))},!0),c.set({name:a}))}})})(Mibew);
|
||||
(function(a){a.Models.Message=a.Models.Base.extend({defaults:{message:""}})})(Mibew);
|
||||
(function(a){a.Models.MessageForm=a.Models.Base.extend({defaults:{predefinedAnswers:[],ignoreCtrl:!1},postMessage:function(e){var b=a.Objects.thread,c=a.Objects.Models.user;if(c.get("canPost")){this.trigger("before:post",this);var d=this;a.Objects.server.callFunctions([{"function":"post",arguments:{references:{},"return":{},message:e,threadId:b.threadId,token:b.token,user:!c.get("isAgent")}}],function(){d.trigger("after:post",d)},!0)}}})})(Mibew);
|
||||
(function(a,b){a.Models.StatusMessage=a.Models.Status.extend({defaults:b.extend({},a.Models.Status.prototype.defaults,{message:"",visible:!1}),getModelType:function(){return"StatusMessage"},setMessage:function(a){this.set({message:a,visible:!0});this.autoHide()}})})(Mibew,_);
|
||||
(function(a,b){a.Models.StatusTyping=a.Models.Status.extend({defaults:b.extend({},a.Models.Status.prototype.defaults,{visible:!1,hideTimeout:2E3}),getModelType:function(){return"StatusTyping"},show:function(){this.set({visible:!0});this.autoHide()}})})(Mibew,_);
|
||||
(function(a,b){a.Collections.Controls=b.Collection.extend({comparator:function(a){return a.get("weight")}})})(Mibew,Backbone);
|
||||
(function(b,d,c){b.Collections.Messages=d.Collection.extend({model:b.Models.Message,initialize:function(){b.Objects.server.callFunctionsPeriodically(c.bind(this.updateFunctionBuilder,this),c.bind(this.updateChatState,this));b.Objects.server.registerFunction("updateMessages",c.bind(this.apiUpdateMessages,this))},apiUpdateMessages:function(a){a.lastId&&(b.Objects.thread.lastId=a.lastId);for(var e=[],c=0,d=a.messages.length;c<d;c++)e.push(new b.Models.Message(a.messages[c]));0<e.length&&this.add(e)},
|
||||
updateFunctionBuilder:function(){var a=b.Objects.thread,c=b.Objects.Models.user;return[{"function":"update",arguments:{"return":{typing:"typing",canPost:"canPost"},references:{},threadId:a.threadId,token:a.token,lastId:a.lastId,typed:c.get("typing"),user:!c.get("isAgent")}}]},updateChatState:function(a){a.errorCode?b.Objects.Models.Status.message.setMessage(a.errorMessage||"refresh failed"):(a.typing&&b.Objects.Models.Status.typing.show(),b.Objects.Models.user.set({canPost:a.canPost||!1}))},add:function(){var a=
|
||||
Array.prototype.slice.apply(arguments),a=d.Collection.prototype.add.apply(this,a);this.trigger("multiple:add");return a}})})(Mibew,Backbone,_);
|
||||
(function(a,b){a.Collections.Status=b.Collection.extend({comparator:function(a){return a.get("weight")}})})(Mibew,Backbone);
|
||||
(function(b,c,d){b.Views.Control=c.Marionette.ItemView.extend({template:d.templates.control,modelEvents:{change:"render"},events:{mouseover:"mouseOver",mouseleave:"mouseLeave"},attributes:function(){var a=[];a.push("control");this.className&&(a.push(this.className),this.className="");var b=this.getDashedControlType();b&&a.push(b);return{"class":a.join(" ")}},mouseOver:function(){var a=this.getDashedControlType();this.$el.addClass("active"+(a?"-"+a:""))},mouseLeave:function(){var a=this.getDashedControlType();
|
||||
this.$el.removeClass("active"+(a?"-"+a:""))},getDashedControlType:function(){"undefined"==typeof this.dashedControlType&&(this.dashedControlType=b.Utils.toDashFormat(this.model.getModelType())||"");return this.dashedControlType}})})(Mibew,Backbone,Handlebars);
|
||||
(function(a,b,c){a.Views.Status=b.Marionette.ItemView.extend({template:c.templates.status,className:"status",modelEvents:{change:"render"},onBeforeRender:function(){this.model.get("visible")?this.$el.show():this.$el.hide()}})})(Mibew,Backbone,Handlebars);
|
||||
(function(a,b,c){a.Views.Avatar=b.Marionette.ItemView.extend({template:c.templates.avatar,className:"avatar",modelEvents:{change:"render"}})})(Mibew,Backbone,Handlebars);
|
||||
(function(a,c,d){a.Views.CloseControl=a.Views.Control.extend({template:c.templates.close_control,events:d.extend({},a.Views.Control.prototype.events,{click:"close"}),close:function(){var b=a.Localization.get("chat.close.confirmation");(!1===b||confirm(b))&&this.model.closeThread()}})})(Mibew,Handlebars,_);
|
||||
(function(a){a.Views.ControlsCollection=a.Views.CollectionBase.extend({itemView:a.Views.Control,className:"controls-collection"})})(Mibew);
|
||||
(function(b,d,e){b.Views.HistoryControl=b.Views.Control.extend({template:d.templates.history_control,events:e.extend({},b.Views.Control.prototype.events,{click:"showHistory"}),showHistory:function(){var c=b.Objects.Models.user,a=this.model.get("link");c.get("isAgent")&&a&&(c=this.$el.find(".control-config").eq(0).data("win-params"),a=a.replace("&","&","g"),a=window.open(a,"UserHistory",c),null!==a&&(a.focus(),a.opener=window))}})})(Mibew,Handlebars,_);
|
||||
(function(a,d,e){a.Views.RedirectControl=a.Views.Control.extend({template:d.templates.redirect_control,events:e.extend({},a.Views.Control.prototype.events,{click:"redirect"}),initialize:function(){a.Objects.Models.user.on("change",this.render,this)},serializeData:function(){var b=this.model.toJSON();b.user=a.Objects.Models.user.toJSON();return b},redirect:function(){var b=a.Objects.Models.user;if(b.get("isAgent")&&b.get("canPost")&&(b=this.model.get("link"))){var c=a.Objects.Models.page.get("style");
|
||||
window.location.href=b.replace(/\&\;/g,"&")+(c?"&style="+c:"")}}})})(Mibew,Handlebars,_);
|
||||
(function(a,b,c){a.Views.RefreshControl=a.Views.Control.extend({template:b.templates.refresh_control,events:c.extend({},a.Views.Control.prototype.events,{click:"refresh"}),refresh:function(){this.model.refresh()}})})(Mibew,Handlebars,_);
|
||||
(function(a,d,e){a.Views.SecureModeControl=a.Views.Control.extend({template:d.templates.secure_mode_control,events:e.extend({},a.Views.Control.prototype.events,{click:"secure"}),secure:function(){var b=this.model.get("link");if(b){var c=a.Objects.Models.page.get("style");window.location.href=b.replace(/\&\;/g,"&")+(c?"&style="+c:"")}}})})(Mibew,Handlebars,_);
|
||||
(function(b,c,e){b.Views.SendMailControl=b.Views.Control.extend({template:c.templates.send_mail_control,events:e.extend({},b.Views.Control.prototype.events,{click:"sendMail"}),sendMail:function(){var a=this.model.get("link");if(a){var c=this.$el.find(".control-config").eq(0).data("win-params"),d=b.Objects.Models.page.get("style"),a=a.replace(/\&\;/g,"&")+(d?"&style="+d:""),a=window.open(a,"ForwardMail",c);null!==a&&(a.focus(),a.opener=window)}}})})(Mibew,Handlebars,_);
|
||||
(function(a,b,c){a.Views.SoundControl=a.Views.Control.extend({template:b.templates.sound_control,events:c.extend({},a.Views.Control.prototype.events,{click:"toggle"}),toggle:function(){this.model.set({enabled:!this.model.get("enabled")})}})})(Mibew,Handlebars,_);
|
||||
(function(b,c,d){b.Views.UserNameControl=b.Views.Control.extend({template:c.templates.user_name_control,events:d.extend({},b.Views.Control.prototype.events,{"click .user-name-control-set":"changeName","click .user-name-control-change":"showNameInput","keydown #user-name-control-input":"inputKeyDown"}),ui:{nameInput:"#user-name-control-input"},initialize:function(){b.Objects.Models.user.on("change:name",this.hideNameInput,this);this.nameInput=b.Objects.Models.user.get("defaultName")},serializeData:function(){var a=
|
||||
this.model.toJSON();a.user=b.Objects.Models.user.toJSON();a.nameInput=this.nameInput;return a},inputKeyDown:function(a){a=a.which;(13==a||10==a)&&this.changeName()},hideNameInput:function(){this.nameInput=!1;this.render()},showNameInput:function(){this.nameInput=!0;this.render()},changeName:function(){var a=this.ui.nameInput.val();this.model.changeName(a)}})})(Mibew,Handlebars,_);
|
||||
(function(c,d,e){var f={"<":"<",">":">","&":"&",'"':""","'":"'","`":"`"},g=/[&<>'"`]/g;c.Views.Message=d.Marionette.ItemView.extend({template:e.templates.message,className:"message",modelEvents:{change:"render"},serializeData:function(){var a=this.model.toJSON(),b=this.model.get("kind");a.allowFormatting=b!=this.KIND_USER&&b!=this.KIND_AGENT;a.kindName=this.kindToString(b);a.message=this.escapeString(a.message);return a},kindToString:function(a){return a==this.KIND_USER?"user":
|
||||
a==this.KIND_AGENT?"agent":a==this.KIND_FOR_AGENT?"hidden":a==this.KIND_INFO?"inf":a==this.KIND_CONN?"conn":a==this.KIND_EVENTS?"event":""},escapeString:function(a){return a.replace(g,function(a){return f[a]||"&"})},KIND_USER:1,KIND_AGENT:2,KIND_FOR_AGENT:3,KIND_INFO:4,KIND_CONN:5,KIND_EVENTS:6,KIND_AVATAR:7})})(Mibew,Backbone,Handlebars);
|
||||
(function(b,d,e){b.Views.MessageForm=d.Marionette.ItemView.extend({template:e.templates.message_form,events:{"click #send-message":"postMessage","keydown #message-input":"messageKeyDown","keyup #message-input":"checkUserTyping","change #message-input":"checkUserTyping","change #predefined":"selectPredefinedAnswer","focus #message-input":"setFocus","blur #message-input":"dropFocus"},modelEvents:{change:"render"},ui:{message:"#message-input",send:"#send-message",predefinedAnswer:"#predefined"},initialize:function(){b.Objects.Models.user.on("change:canPost",
|
||||
this.render,this)},serializeData:function(){var a=this.model.toJSON();a.user=b.Objects.Models.user.toJSON();return a},postMessage:function(){var a=this.ui.message.val();""!=a&&(this.disableInput(),this.model.postMessage(a));b.Objects.Collections.messages.on("multiple:add",this.postMessageComplete,this)},messageKeyDown:function(a){var c=a.which;a=a.ctrlKey;(13==c&&(a||this.model.get("ignoreCtrl"))||10==c)&&this.postMessage()},enableInput:function(){this.ui.message.removeAttr("disabled")},disableInput:function(){this.ui.message.attr("disabled",
|
||||
"disabled")},clearInput:function(){this.ui.message.val("").change()},postMessageComplete:function(){this.clearInput();this.enableInput();this.focused&&this.ui.focus();b.Objects.Collections.messages.off("multiple:add",this.postMessageComplete,this)},selectPredefinedAnswer:function(){var a=this.ui.message,c=this.ui.predefinedAnswer,b=c.get(0).selectedIndex;b&&(a.val(this.model.get("predefinedAnswers")[b-1].full).change(),a.focus(),c.get(0).selectedIndex=0)},checkUserTyping:function(){var a=b.Objects.Models.user,
|
||||
c=""!=this.ui.message.val();c!=a.get("typing")&&a.set({typing:c})},setFocus:function(){this.focused=!0},dropFocus:function(){this.focused=!1}})})(Mibew,Backbone,Handlebars);
|
||||
(function(a){a.Views.MessagesCollection=a.Views.CollectionBase.extend({itemView:a.Views.Message,className:"messages-collection",initialize:function(){this.collection.on("multiple:add",this.messagesAdded,this);a.Objects.Models.messageForm.on("before:post",this.messagePost,this)},skipNextSound:!0,messagePost:function(){this.skipNextSound=!0},messagesAdded:function(){if(!this.skipNextSound&&a.Objects.Models.Controls.sound.get("enabled")){var b=a.Objects.Models.page.get("webimRoot");b&&a.Objects.Models.sound.play(b+
|
||||
"/sounds/new_message.wav")}this.skipNextSound=!1}})})(Mibew);
|
||||
(function(a,b){a.Views.StatusMessage=a.Views.Status.extend({template:b.templates.status_message})})(Mibew,Handlebars);
|
||||
(function(a){a.Views.StatusCollection=a.Views.CollectionBase.extend({itemView:a.Views.Status,className:"status-collection"})})(Mibew);
|
||||
(function(a,b){a.Views.StatusTyping=a.Views.Status.extend({template:b.templates.status_typing})})(Mibew,Handlebars);
|
||||
(function(a){a.Models.Control=a.Models.Base.extend({defaults:{title:"",weight:0}})})(Mibew);
|
||||
(function(b,c){b.Models.Status=b.Models.Base.extend({defaults:{visible:!0,weight:0,hideTimeout:4E3,title:""},initialize:function(){this.hideTimer=null},autoHide:function(a){a=a||this.get("hideTimeout");this.hideTimer&&clearTimeout(this.hideTimer);this.hideTimer=setTimeout(c.bind(function(){this.set({visible:!1})},this),a)}})})(Mibew,_);
|
||||
(function(b,c,d){b.Views.Control=c.Marionette.ItemView.extend({template:d.templates.control,modelEvents:{change:"render"},events:{mouseover:"mouseOver",mouseleave:"mouseLeave"},attributes:function(){var a=[];a.push("control");this.className&&(a.push(this.className),this.className="");var b=this.getDashedControlType();b&&a.push(b);return{"class":a.join(" ")}},mouseOver:function(){var a=this.getDashedControlType();this.$el.addClass("active"+(a?"-"+a:""))},mouseLeave:function(){var a=this.getDashedControlType();
|
||||
this.$el.removeClass("active"+(a?"-"+a:""))},getDashedControlType:function(){"undefined"==typeof this.dashedControlType&&(this.dashedControlType=b.Utils.toDashFormat(this.model.getModelType())||"");return this.dashedControlType}})})(Mibew,Backbone,Handlebars);
|
||||
(function(a,b,c){a.Views.Status=b.Marionette.ItemView.extend({template:c.templates.status,className:"status",modelEvents:{change:"render"},onBeforeRender:function(){this.model.get("visible")?this.$el.show():this.$el.hide()}})})(Mibew,Backbone,Handlebars);
|
||||
(function(a,b){a.Collections.Controls=b.Collection.extend({comparator:function(a){return a.get("weight")}})})(Mibew,Backbone);
|
||||
(function(b,d,c){b.Collections.Messages=d.Collection.extend({model:b.Models.Message,initialize:function(){b.Objects.server.callFunctionsPeriodically(c.bind(this.updateFunctionBuilder,this),c.bind(this.updateChatState,this));b.Objects.server.registerFunction("updateMessages",c.bind(this.apiUpdateMessages,this))},apiUpdateMessages:function(a){a.lastId&&(b.Objects.thread.lastId=a.lastId);for(var e=[],c=0,d=a.messages.length;c<d;c++)e.push(new b.Models.Message(a.messages[c]));0<e.length&&this.add(e)},
|
||||
updateFunctionBuilder:function(){var a=b.Objects.thread,c=b.Objects.Models.user;return[{"function":"update",arguments:{"return":{typing:"typing",canPost:"canPost"},references:{},threadId:a.threadId,token:a.token,lastId:a.lastId,typed:c.get("typing"),user:!c.get("isAgent")}}]},updateChatState:function(a){a.errorCode?b.Objects.Models.Status.message.setMessage(a.errorMessage||"refresh failed"):(a.typing&&b.Objects.Models.Status.typing.show(),b.Objects.Models.user.set({canPost:a.canPost||!1}))},add:function(){var a=
|
||||
Array.prototype.slice.apply(arguments),a=d.Collection.prototype.add.apply(this,a);this.trigger("multiple:add");return a}})})(Mibew,Backbone,_);
|
||||
(function(a,b){a.Collections.Status=b.Collection.extend({comparator:function(a){return a.get("weight")}})})(Mibew,Backbone);
|
||||
(function(a,b){a.Models.Avatar=a.Models.Base.extend({defaults:{imageLink:!1},initialize:function(){a.Objects.server.registerFunction("setupAvatar",b.bind(this.apiSetupAvatar,this))},apiSetupAvatar:function(a){a.imageLink&&this.set({imageLink:a.imageLink})}})})(Mibew,_);
|
||||
(function(a){a.Models.CloseControl=a.Models.Control.extend({getModelType:function(){return"CloseControl"},closeThread:function(){var b=a.Objects.thread;a.Objects.server.callFunctions([{"function":"close",arguments:{references:{},"return":{closed:"closed"},threadId:b.threadId,token:b.token,lastId:b.lastId,user:!a.Objects.Models.user.get("isAgent")}}],function(b){b.closed?window.close():a.Objects.Models.Status.message.setMessage(b.errorMessage||"Cannot close")},!0)}})})(Mibew);
|
||||
(function(a,b){a.Models.HistoryControl=a.Models.Control.extend({defaults:b.extend({},a.Models.Control.prototype.defaults,{link:!1}),getModelType:function(){return"HistoryControl"}})})(Mibew,_);
|
||||
(function(a,b){a.Models.RedirectControl=a.Models.Control.extend({defaults:b.extend({},a.Models.Control.prototype.defaults,{link:!1}),getModelType:function(){return"RedirectControl"}})})(Mibew,_);
|
||||
(function(a){a.Models.RefreshControl=a.Models.Control.extend({getModelType:function(){return"RefreshControl"},refresh:function(){a.Objects.server.restartUpdater()}})})(Mibew);
|
||||
(function(a,b){a.Models.SecureModeControl=a.Models.Control.extend({defaults:b.extend({},a.Models.Control.prototype.defaults,{link:!1}),getModelType:function(){return"SecureModeControl"}})})(Mibew,_);
|
||||
(function(a,b){a.Models.SendMailControl=a.Models.Control.extend({defaults:b.extend({},a.Models.Control.prototype.defaults,{link:!1}),getModelType:function(){return"SendMailControl"}})})(Mibew,_);
|
||||
(function(a,b){a.Models.SoundControl=a.Models.Control.extend({defaults:b.extend({},a.Models.Control.prototype.defaults,{enabled:!0}),getModelType:function(){return"SoundControl"}})})(Mibew,_);
|
||||
(function(b){b.Models.UserNameControl=b.Models.Control.extend({getModelType:function(){return"UserNameControl"},changeName:function(a){var c=b.Objects.Models.user,d=b.Objects.thread,e=c.get("name");a&&e!=a&&(b.Objects.server.callFunctions([{"function":"rename",arguments:{references:{},"return":{},threadId:d.threadId,token:d.token,name:a}}],function(a){a.errorCode&&(b.Objects.Models.Status.message.setMessage(a.errorMessage||"Cannot rename"),c.set({name:e}))},!0),c.set({name:a}))}})})(Mibew);
|
||||
(function(a){a.Models.Message=a.Models.Base.extend({defaults:{message:""}})})(Mibew);
|
||||
(function(a){a.Models.MessageForm=a.Models.Base.extend({defaults:{predefinedAnswers:[],ignoreCtrl:!1},postMessage:function(e){var b=a.Objects.thread,c=a.Objects.Models.user;if(c.get("canPost")){this.trigger("before:post",this);var d=this;a.Objects.server.callFunctions([{"function":"post",arguments:{references:{},"return":{},message:e,threadId:b.threadId,token:b.token,user:!c.get("isAgent")}}],function(){d.trigger("after:post",d)},!0)}}})})(Mibew);
|
||||
(function(a,b){a.Models.StatusMessage=a.Models.Status.extend({defaults:b.extend({},a.Models.Status.prototype.defaults,{message:"",visible:!1}),getModelType:function(){return"StatusMessage"},setMessage:function(a){this.set({message:a,visible:!0});this.autoHide()}})})(Mibew,_);
|
||||
(function(a,b){a.Models.StatusTyping=a.Models.Status.extend({defaults:b.extend({},a.Models.Status.prototype.defaults,{visible:!1,hideTimeout:2E3}),getModelType:function(){return"StatusTyping"},show:function(){this.set({visible:!0});this.autoHide()}})})(Mibew,_);
|
||||
(function(a,b){a.Regions.Messages=b.Marionette.Region.extend({el:"#messages-region",onShow:function(a){a.on("after:item:added",this.scrollToBottom,this)},scrollToBottom:function(){this.$el.scrollTop(this.$el.prop("scrollHeight"))}})})(Mibew,Backbone);
|
||||
(function(a,b,c){a.Views.Avatar=b.Marionette.ItemView.extend({template:c.templates.avatar,className:"avatar",modelEvents:{change:"render"}})})(Mibew,Backbone,Handlebars);
|
||||
(function(a,c,d){a.Views.CloseControl=a.Views.Control.extend({template:c.templates.close_control,events:d.extend({},a.Views.Control.prototype.events,{click:"close"}),close:function(){var b=a.Localization.get("chat.close.confirmation");(!1===b||confirm(b))&&this.model.closeThread()}})})(Mibew,Handlebars,_);
|
||||
(function(a){a.Views.ControlsCollection=a.Views.CollectionBase.extend({itemView:a.Views.Control,className:"controls-collection"})})(Mibew);
|
||||
(function(b,d,e){b.Views.HistoryControl=b.Views.Control.extend({template:d.templates.history_control,events:e.extend({},b.Views.Control.prototype.events,{click:"showHistory"}),showHistory:function(){var c=b.Objects.Models.user,a=this.model.get("link");c.get("isAgent")&&a&&(c=this.$el.find(".control-config").eq(0).data("win-params"),a=a.replace("&","&","g"),a=window.open(a,"UserHistory",c),null!==a&&(a.focus(),a.opener=window))}})})(Mibew,Handlebars,_);
|
||||
(function(a,d,e){a.Views.RedirectControl=a.Views.Control.extend({template:d.templates.redirect_control,events:e.extend({},a.Views.Control.prototype.events,{click:"redirect"}),initialize:function(){a.Objects.Models.user.on("change",this.render,this)},serializeData:function(){var b=this.model.toJSON();b.user=a.Objects.Models.user.toJSON();return b},redirect:function(){var b=a.Objects.Models.user;if(b.get("isAgent")&&b.get("canPost")&&(b=this.model.get("link"))){var c=a.Objects.Models.page.get("style");
|
||||
window.location.href=b.replace(/\&\;/g,"&")+(c?"&style="+c:"")}}})})(Mibew,Handlebars,_);
|
||||
(function(a,b,c){a.Views.RefreshControl=a.Views.Control.extend({template:b.templates.refresh_control,events:c.extend({},a.Views.Control.prototype.events,{click:"refresh"}),refresh:function(){this.model.refresh()}})})(Mibew,Handlebars,_);
|
||||
(function(a,d,e){a.Views.SecureModeControl=a.Views.Control.extend({template:d.templates.secure_mode_control,events:e.extend({},a.Views.Control.prototype.events,{click:"secure"}),secure:function(){var b=this.model.get("link");if(b){var c=a.Objects.Models.page.get("style");window.location.href=b.replace(/\&\;/g,"&")+(c?"&style="+c:"")}}})})(Mibew,Handlebars,_);
|
||||
(function(b,c,e){b.Views.SendMailControl=b.Views.Control.extend({template:c.templates.send_mail_control,events:e.extend({},b.Views.Control.prototype.events,{click:"sendMail"}),sendMail:function(){var a=this.model.get("link");if(a){var c=this.$el.find(".control-config").eq(0).data("win-params"),d=b.Objects.Models.page.get("style"),a=a.replace(/\&\;/g,"&")+(d?"&style="+d:""),a=window.open(a,"ForwardMail",c);null!==a&&(a.focus(),a.opener=window)}}})})(Mibew,Handlebars,_);
|
||||
(function(a,b,c){a.Views.SoundControl=a.Views.Control.extend({template:b.templates.sound_control,events:c.extend({},a.Views.Control.prototype.events,{click:"toggle"}),toggle:function(){this.model.set({enabled:!this.model.get("enabled")})}})})(Mibew,Handlebars,_);
|
||||
(function(b,c,d){b.Views.UserNameControl=b.Views.Control.extend({template:c.templates.user_name_control,events:d.extend({},b.Views.Control.prototype.events,{"click .user-name-control-set":"changeName","click .user-name-control-change":"showNameInput","keydown #user-name-control-input":"inputKeyDown"}),ui:{nameInput:"#user-name-control-input"},initialize:function(){b.Objects.Models.user.on("change:name",this.hideNameInput,this);this.nameInput=b.Objects.Models.user.get("defaultName")},serializeData:function(){var a=
|
||||
this.model.toJSON();a.user=b.Objects.Models.user.toJSON();a.nameInput=this.nameInput;return a},inputKeyDown:function(a){a=a.which;(13==a||10==a)&&this.changeName()},hideNameInput:function(){this.nameInput=!1;this.render()},showNameInput:function(){this.nameInput=!0;this.render()},changeName:function(){var a=this.ui.nameInput.val();this.model.changeName(a)}})})(Mibew,Handlebars,_);
|
||||
(function(c,d,e){var f={"<":"<",">":">","&":"&",'"':""","'":"'","`":"`"},g=/[&<>'"`]/g;c.Views.Message=d.Marionette.ItemView.extend({template:e.templates.message,className:"message",modelEvents:{change:"render"},serializeData:function(){var a=this.model.toJSON(),b=this.model.get("kind");a.allowFormatting=b!=this.KIND_USER&&b!=this.KIND_AGENT;a.kindName=this.kindToString(b);a.message=this.escapeString(a.message);return a},kindToString:function(a){return a==this.KIND_USER?"user":
|
||||
a==this.KIND_AGENT?"agent":a==this.KIND_FOR_AGENT?"hidden":a==this.KIND_INFO?"inf":a==this.KIND_CONN?"conn":a==this.KIND_EVENTS?"event":""},escapeString:function(a){return a.replace(g,function(a){return f[a]||"&"})},KIND_USER:1,KIND_AGENT:2,KIND_FOR_AGENT:3,KIND_INFO:4,KIND_CONN:5,KIND_EVENTS:6,KIND_AVATAR:7})})(Mibew,Backbone,Handlebars);
|
||||
(function(b,d,e){b.Views.MessageForm=d.Marionette.ItemView.extend({template:e.templates.message_form,events:{"click #send-message":"postMessage","keydown #message-input":"messageKeyDown","keyup #message-input":"checkUserTyping","change #message-input":"checkUserTyping","change #predefined":"selectPredefinedAnswer","focus #message-input":"setFocus","blur #message-input":"dropFocus"},modelEvents:{change:"render"},ui:{message:"#message-input",send:"#send-message",predefinedAnswer:"#predefined"},initialize:function(){b.Objects.Models.user.on("change:canPost",
|
||||
this.render,this)},serializeData:function(){var a=this.model.toJSON();a.user=b.Objects.Models.user.toJSON();return a},postMessage:function(){var a=this.ui.message.val();""!=a&&(this.disableInput(),this.model.postMessage(a));b.Objects.Collections.messages.on("multiple:add",this.postMessageComplete,this)},messageKeyDown:function(a){var c=a.which;a=a.ctrlKey;(13==c&&(a||this.model.get("ignoreCtrl"))||10==c)&&this.postMessage()},enableInput:function(){this.ui.message.removeAttr("disabled")},disableInput:function(){this.ui.message.attr("disabled",
|
||||
"disabled")},clearInput:function(){this.ui.message.val("").change()},postMessageComplete:function(){this.clearInput();this.enableInput();this.focused&&this.ui.focus();b.Objects.Collections.messages.off("multiple:add",this.postMessageComplete,this)},selectPredefinedAnswer:function(){var a=this.ui.message,c=this.ui.predefinedAnswer,b=c.get(0).selectedIndex;b&&(a.val(this.model.get("predefinedAnswers")[b-1].full).change(),a.focus(),c.get(0).selectedIndex=0)},checkUserTyping:function(){var a=b.Objects.Models.user,
|
||||
c=""!=this.ui.message.val();c!=a.get("typing")&&a.set({typing:c})},setFocus:function(){this.focused=!0},dropFocus:function(){this.focused=!1}})})(Mibew,Backbone,Handlebars);
|
||||
(function(a){a.Views.MessagesCollection=a.Views.CollectionBase.extend({itemView:a.Views.Message,className:"messages-collection",initialize:function(){this.collection.on("multiple:add",this.messagesAdded,this);a.Objects.Models.messageForm.on("before:post",this.messagePost,this)},skipNextSound:!0,messagePost:function(){this.skipNextSound=!0},messagesAdded:function(){if(!this.skipNextSound&&a.Objects.Models.Controls.sound.get("enabled")){var b=a.Objects.Models.page.get("webimRoot");b&&a.Objects.Models.sound.play(b+
|
||||
"/sounds/new_message.wav")}this.skipNextSound=!1}})})(Mibew);
|
||||
(function(a,b){a.Views.StatusMessage=a.Views.Status.extend({template:b.templates.status_message})})(Mibew,Handlebars);
|
||||
(function(a){a.Views.StatusCollection=a.Views.CollectionBase.extend({itemView:a.Views.Status,className:"status-collection"})})(Mibew);
|
||||
(function(a,b){a.Views.StatusTyping=a.Views.Status.extend({template:b.templates.status_typing})})(Mibew,Handlebars);
|
||||
(function(a,j){var f=new j.Marionette.Application;f.addRegions({controlsRegion:"#controls-region",avatarRegion:"#avatar-region",messagesRegion:a.Regions.Messages,statusRegion:"#status-region",messageFormRegion:"#message-form-region",soundRegion:"#sound-region"});f.addInitializer(function(d){var g=a.Objects,c=a.Objects.Models,b=a.Objects.Models.Controls,h=a.Objects.Models.Status;g.server=new a.Server(d.server);g.thread=new a.Thread(d.thread);c.user=new a.Models.User(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.push(b.userName),b.sendMail=new a.Models.SendMailControl({weight:200,link:d.links.mailLink}),e.push(b.sendMail));c.user.get("isAgent")&&(b.redirect=new a.Models.RedirectControl({weight:200,link:d.links.redirectLink}),e.push(b.redirect),b.history=new a.Models.HistoryControl({weight:180,link:d.links.historyLink}),e.push(b.history));b.sound=new a.Models.SoundControl({weight:160});e.push(b.sound);
|
||||
b.refresh=new a.Models.RefreshControl({weight:140});e.push(b.refresh);d.links.sslLink&&(b.secureMode=new a.Models.SecureModeControl({weight:120,link:d.links.sslLink}),e.push(b.secureMode));b.close=new a.Models.CloseControl({weight:100});e.push(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.runUpdater()});a.Application=f})(Mibew,Backbone);
|
@ -1,16 +0,0 @@
|
||||
/*
|
||||
This file is part of Mibew Messenger project.
|
||||
http://mibew.org
|
||||
|
||||
Copyright (c) 2005-2011 Mibew Messenger Community
|
||||
License: http://mibew.org/license.php
|
||||
*/
|
||||
ChatController=Class.create();
|
||||
ChatController.prototype={options:{},thread:null,server:null,view:null,cansend:!0,skipNextSound:!0,focused:!0,message:null,ownThread:null,initialize:function(a,b,c,d){this.options=d;this.thread=c;this.server=a;this.view=b;this.message=$("msgwnd");this.ownThread=null!=this.message;this.message&&(this.message.onkeydown=this.handleKeyDown.bind(this),this.message.onfocus=function(){this.focused=!0}.bind(this),this.message.onblur=function(){this.focused=!1}.bind(this));this.server.callFunctionsPeriodically(this.updateFunctionBuilder.bind(this),this.updateChatState.bind(this));
|
||||
this.server.registerFunction("updateMessages",this.updateMessages.bind(this));this.server.registerFunction("setupAvatar",this.setupAvatar.bind(this));this.server.runUpdater()},handleException:function(){this.view.setStatus("offline, reconnecting");this.view.enableInput(!0)},handleTimeout:function(){this.view.setStatus("timeout, reconnecting");this.view.enableInput(!0)},refresh:function(){this.server.restartUpdater()},postMessage:function(a){""!=a&&this.cansend&&(this.cansend=!1,this.skipNextSound=
|
||||
!0,"opera"!=myRealAgent&&this.view.enableInput(!1),this.server.callFunctions([{"function":"post",arguments:{references:{},"return":{},message:a,threadId:this.thread.threadid,token:this.thread.token,user:this.thread.user}}],function(){this.view.enableInput(!0);this.cansend=!0;this.view.clearInput()}.bind(this),!0))},changeName:function(a){this.skipNextSound=!0;this.server.callFunctions([{"function":"rename",arguments:{references:{},"return":{},threadId:this.thread.threadid,token:this.thread.token,
|
||||
name:a}}],function(a){a.errorCode&&this.handleError(a,"cannot rename")}.bind(this),!0)},closeThread:function(){(!this.view.getLocaleString("closeConfirmation")||confirm(this.view.getLocaleString("closeConfirmation")))&&this.server.callFunctions([{"function":"close",arguments:{references:{},"return":{closed:"closed"},threadId:this.thread.threadid,token:this.thread.token,lastId:this.thread.lastid,user:this.thread.user}}],this.onThreadClosed.bind(this),!0)},onThreadClosed:function(a){a.closed?window.close():
|
||||
this.handleError(a,"cannot close")},setupAvatar:function(a){$("avatarwnd")&&this.thread.user&&this.view.updateAvatar(this.options.webimRoot,a.imageLink)},updateMessages:function(a){a.lastId&&(this.thread.lastid=a.lastId);this.view.displayMessages(a.messages);this.view.clearStatus();0<a.messages.length&&(this.skipNextSound||(a=$("soundimg"),(null==a||a.className.match(/\bisound\b/))&&playSound(this.options.webimRoot+"/sounds/new_message.wav")),this.focused||window.focus());this.skipNextSound=!1},updateFunctionBuilder:function(){return[{"function":"update",
|
||||
arguments:{"return":{typing:"typing",canPost:"canPost"},references:{},threadId:this.thread.threadid,token:this.thread.token,lastId:this.thread.lastid,typed:this.message&&""!=this.message.value,user:this.thread.user}}]},updateChatState:function(a){if(a.errorCode)this.handleError(a,"refresh failed");else if("undefined"!=typeof a.typing&&this.view.showTyping(a.typing),"undefined"!=typeof a.canPost&&(a.canPost&&!this.ownThread||this.ownThread&&!a.canPost))window.location.href=window.location.href},isSendkey:function(a,
|
||||
b){return 13==b&&(a||this.options.ignorectrl)||10==b},handleKeyDown:function(a){a?(ctrl=a.ctrlKey,a=a.which):(a=event.keyCode,ctrl=event.ctrlKey);return this.message&&this.isSendkey(ctrl,a)?(a=this.message.value,this.options.ignorectrl&&(a=a.replace(/[\r\n]+$/,"")),this.postMessage(a),!1):!0},handleError:function(a){a.errorCode?this.view.setStatus(a.errorMessage):this.view.setStatus("reconnecting")},applyName:function(){this.changeName($("uname").value);this.view.hideNameField();this.view.updateUserName($("uname").value)},
|
||||
showNameField:function(){this.view.showNameField()},selectPredefinedAnswer:function(a){var b=a.selectedIndex;0!=b&&(this.view.displayPredefinedAnswer(b-1),this.view.resetSelectedIndex(a))},toggleSound:function(){var a=$("soundimg");a&&(a.className.match(/\bisound\b/)?this.view.changeSoundButtonState(!1):this.view.changeSoundButtonState(!0))}};
|
@ -1,12 +0,0 @@
|
||||
/*
|
||||
This file is part of Mibew Messenger project.
|
||||
http://mibew.org
|
||||
|
||||
Copyright (c) 2005-2011 Mibew Messenger Community
|
||||
License: http://mibew.org/license.php
|
||||
*/
|
||||
var chatController={};
|
||||
Behaviour.register({"#postmessage a":function(a){a.onclick=function(){var a=$("msgwnd");a&&chatController.postMessage(a.value)}},"select#predefined":function(a){a.onchange=function(){chatController.selectPredefinedAnswer(this)}},"div#changename2 a":function(a){a.onclick=function(){chatController.showNameField();return!1}},"div#changename1 a":function(a){a.onclick=function(){chatController.applyName();return!1}},"div#changename1 input#uname":function(a){a.onkeydown=function(a){13==(a||event).keyCode&&
|
||||
chatController.applyName()}},"a#refresh":function(a){a.onclick=function(){chatController.refresh()}},"a#togglesound":function(a){a.onclick=function(){chatController.toggleSound()}},"a.closethread":function(a){a.onclick=function(){chatController.closeThread()}}});
|
||||
EventHelper.register(window,"onload",function(){$LAB.setOptions({BasePath:chatParams.jsBasePath}).script("mibewapi.js").wait().script("chatserver.js").script("thread.js").script("messageview.js").script("pluginmanager.js").script("brws.js").wait().script("chatcontroller.js").script("chatview.js").wait(function(){FrameUtils.options.cssfile=chatParams.cssfile;var a=new ChatServer(chatParams.serverParams),c=new Thread(chatParams.threadParams),b=new PluginManager;chatParams.initPlugins(b,c,a);b=new ChatView(new MessageView,
|
||||
chatParams.localizedStrings||{},chatParams.predefinedAnswers||[]);chatController=new ChatController(a,b,c,{ignorectrl:-1}.extend(chatParams.controllerParams||{}))})});
|
@ -1,15 +0,0 @@
|
||||
/*
|
||||
This file is part of Mibew Messenger project.
|
||||
http://mibew.org
|
||||
|
||||
Copyright (c) 2005-2011 Mibew Messenger Community
|
||||
License: http://mibew.org/license.php
|
||||
*/
|
||||
ChatServer=Class.create();
|
||||
ChatServer.prototype={initialize:function(a){this.updateTimer=null;this.options={servl:"",requestsFrequency:2,onTimeout:function(){},onTransportError:function(){},onCallError:function(){},onUpdateError:function(){},onResponseError:function(){}}.extend(a);this.callbacks={};this.callPeriodically=[];this.ajaxOptions={_method:"post",asynchronous:!0,timeout:5E3,onComplete:this.receiveResponse.bind(this),onException:this.onTransportError.bind(this),onTimeout:this.onTimeout.bind(this)};this.ajaxRequest=
|
||||
null;this.buffer=[];this.functions={};this.mibewAPI=new MibewAPI(new MibewAPICoreInteraction)},callFunctions:function(a,b,d){try{if(!(a instanceof Array))throw Error("The first arguments must be an array");for(var c in a)a.hasOwnProperty(c)&&this.mibewAPI.checkFunction(a[c],!1);var e=this.generateToken();this.callbacks[e]=b;this.buffer.push({token:e,functions:a});d&&this.update()}catch(f){return this.options.onCallError(f),!1}return!0},callFunctionsPeriodically:function(a,b){this.callPeriodically.push({functionsListBuilder:a,
|
||||
callbackFunction:b})},generateToken:function(){var a;do a="wnd"+(new Date).getTime().toString()+Math.round(50*Math.random()).toString();while(a in this.callbacks);return a},processRequest:function(a){var b=new MibewAPIExecutionContext,d=this.mibewAPI.getResultFunction(a.functions,this.callbacks.hasOwnProperty(a.token));if(null===d)for(var c in a.functions)a.functions.hasOwnProperty(c)&&(this.processFunction(a.functions[c],b),this.buffer.push(this.mibewAPI.buildResult(b.getResults(),a.token)));else this.callbacks.hasOwnProperty(a.token)&&
|
||||
(this.callbacks[a.token](d.arguments),delete this.callbacks[a.token])},processFunction:function(a,b){if(this.functions.hasOwnProperty(a["function"])){var d=b.getArgumentsList(a),c={},e;for(e in this.functions[a["function"]])this.functions[a["function"]].hasOwnProperty(e)&&c.extend(this.functions[a["function"]][e](d));b.storeFunctionResults(a,c)}},sendRequests:function(a){this.ajaxRequest=new Ajax.Request(this.options.servl,this.ajaxOptions.extend({parameters:"data="+this.mibewAPI.encodePackage(a)}))},
|
||||
runUpdater:function(){null==this.updateTimer&&this.update();this.updateTimer=setTimeout(this.update.bind(this),1E3*this.options.requestsFrequency)},restartUpdater:function(){this.updateTimer&&clearTimeout(this.updateTimer);this.ajaxRequest._options&&(this.ajaxRequest._options.onComplete=void 0);this.update();this.updateTimer=setTimeout(this.update.bind(this),1E3)},update:function(){this.updateTimer&&clearTimeout(this.updateTimer);for(var a=0;a<this.callPeriodically.length;a++)this.callFunctions(this.callPeriodically[a].functionsListBuilder(),
|
||||
this.callPeriodically[a].callbackFunction);if(0==this.buffer.length)this.runUpdater();else try{this.sendRequests(this.buffer),this.buffer=[]}catch(b){this.options.onUpdateError(b)}},receiveResponse:function(a){""==a.response&&this.runUpdater();try{var b=this.mibewAPI.decodePackage(a.response),d;for(d in b.requests)this.processRequest(b.requests[d])}catch(c){this.options.onResponseError(c)}finally{this.runUpdater()}},registerFunction:function(a,b){a in this.functions||(this.functions[a]=[]);this.functions[a].push(b)},
|
||||
onTransportError:function(a,b){this.restartUpdater();this.options.onTransportError(b)},onTimeout:function(){this.restartUpdater();this.options.onTimeout()}};
|
@ -1,14 +0,0 @@
|
||||
/*
|
||||
This file is part of Mibew Messenger project.
|
||||
http://mibew.org
|
||||
|
||||
Copyright (c) 2005-2011 Mibew Messenger Community
|
||||
License: http://mibew.org/license.php
|
||||
*/
|
||||
var FrameUtils={options:{},getDocument:function(a){return a.contentDocument?a.contentDocument:a.contentWindow?a.contentWindow.document:a.document?a.document:null},initFrame:function(a){var b=this.getDocument(a);b.open();b.write("<html><head>");this.options.cssfile&&b.write('<link rel="stylesheet" type="text/css" media="all" href="'+this.options.cssfile+'">');b.write("</head><body bgcolor='#FFFFFF' text='#000000' link='#C28400' vlink='#C28400' alink='#C28400'>");b.write("<table width='100%' cellspacing='0' cellpadding='0' border='0'><tr><td valign='top' class='message' id='content'></td></tr></table><a id='bottom' name='bottom'></a>");
|
||||
b.write("</body></html>");b.close();a.onload=function(){a.myHtml&&(FrameUtils.getDocument(a).getElementById("content").innerHTML+=a.myHtml,FrameUtils.scrollDown(a))}},insertIntoFrame:function(a,b){var c=this.getDocument(a).getElementById("content");null==c?(a.myHtml||(a.myHtml=""),a.myHtml+=b):c.innerHTML+=b},scrollDown:function(a){var b=this.getDocument(a).getElementById("bottom");if("opera"==myAgent)try{a.contentWindow.scrollTo(0,this.getDocument(a).getElementById("content").clientHeight)}catch(c){}b&&
|
||||
b.scrollIntoView(!1)}};ChatView=Class.create();
|
||||
ChatView.prototype={statusTimeout:null,localizedStrings:{},predefinedAnswers:[],messageContainer:null,messageView:null,initialize:function(a,b,c){this.localizedStrings=b||{};this.predefinedAnswers=c||[];this.messageView=a;this.messageContainer="safari"==myRealAgent?self.frames[0]:$("chatwnd");FrameUtils.initFrame(this.messageContainer)},getLocaleString:function(a){return"undefined"==typeof this.localizedStrings[a]?!1:this.localizedStrings[a]},enableInput:function(a){var b=$("msgwnd");b&&(b.disabled=
|
||||
!a)},clearInput:function(){var a=$("msgwnd");a&&(a.value="",a.focus())},showStatusDiv:function(a){$("engineinfo")&&($("engineinfo").style.display="inline",$("engineinfo").innerHTML=a)},setStatus:function(a){this.statusTimeout&&clearTimeout(this.statusTimeout);this.showStatusDiv(a);this.statusTimeout=setTimeout(this.clearStatus.bind(this),4E3)},clearStatus:function(){$("engineinfo").style.display="none"},showTyping:function(a){$("typingdiv")&&($("typingdiv").style.display=a?"inline":"none")},updateAvatar:function(a,
|
||||
b){var c="";""!=b&&(c='<img src="'+a+'/images/free.gif" width="7" height="1" border="0" alt="" /><img src="'+b+'" border="0" alt=""/>');$("avatarwnd").innerHTML=c},displayMessages:function(a){for(var b=0;b<a.length;b++)this.outputMessage(a[b]);0<a.length&&FrameUtils.scrollDown(this.messageContainer)},outputMessage:function(a){a=this.messageView.themeMessage(a);FrameUtils.insertIntoFrame(this.messageContainer,a)},showNameField:function(){$("changename1").style.display="inline";$("changename2").style.display=
|
||||
"none"},hideNameField:function(){$("changename1").style.display="none";$("changename2").style.display="inline"},updateUserName:function(a){$("unamelink").innerHTML=htmlescape(a)},changeSoundButtonState:function(a){$("soundimg").className=a?"tplimage isound":"tplimage inosound";(a=$("msgwnd"))&&a.focus()},displayPredefinedAnswer:function(a){var b=$("msgwnd");b.value=this.predefinedAnswers[a];b.focus()},resetSelectedIndex:function(a){a.selectedIndex=0}};
|
@ -0,0 +1,9 @@
|
||||
/*
|
||||
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(e,a){a.registerHelper("apply",function(c,b){var f=c,e=/^[0-9A-z_]+$/;b=b.split(/\s*,\s*/);for(var d in b)if(b.hasOwnProperty(d)&&e.test(b[d])){if("function"!=typeof a.helpers[b[d]])throw Error("Unregistered helper '"+b[d]+"'!");f=a.helpers[b[d]](f).toString()}return new a.SafeString(f)});a.registerHelper("formatTime",function(c){var b=new Date(1E3*c);c=b.getHours().toString();var a=b.getMinutes().toString(),b=b.getSeconds().toString();return(10<c?c:"0"+c)+":"+(10<a?a:"0"+a)+":"+(10<b?b:
|
||||
"0"+b)});a.registerHelper("urlReplace",function(c){return new a.SafeString(c.replace(/((?:https?|ftp):\/\/\S*)/g,'<a href="$1" target="_blank">$1</a>'))});a.registerHelper("nl2br",function(c){return new a.SafeString(c.replace(/\n/g,"<br/>"))});a.registerHelper("L10n",function(a){return e.Localization.get(a)||""})})(Mibew,Handlebars);
|
8
src/messenger/webim/js/compiled/default/init.js
Normal file
8
src/messenger/webim/js/compiled/default/init.js
Normal file
@ -0,0 +1,8 @@
|
||||
/*
|
||||
This file is part of Mibew Messenger project.
|
||||
http://mibew.org
|
||||
|
||||
Copyright (c) 2005-2011 Mibew Messenger Community
|
||||
License: http://mibew.org/license.php
|
||||
*/
|
||||
var Mibew={};(function(a,b){b.Marionette.TemplateCache.prototype.compileTemplate=function(a){return Handlebars.compile(a)};a.Models={};a.Collections={};a.Views={};a.Objects={};a.Objects.Models={};a.Objects.Collections={}})(Mibew,Backbone);
|
8
src/messenger/webim/js/compiled/default/localization.js
Normal file
8
src/messenger/webim/js/compiled/default/localization.js
Normal file
@ -0,0 +1,8 @@
|
||||
/*
|
||||
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(b,d){b.Localization={};var c={};b.Localization.get=function(a){return!c.hasOwnProperty(a)?!1:c[a]};b.Localization.set=function(a){d.extend(c,a)}})(Mibew,_);
|
8
src/messenger/webim/js/compiled/default/models/base.js
Normal file
8
src/messenger/webim/js/compiled/default/models/base.js
Normal file
@ -0,0 +1,8 @@
|
||||
/*
|
||||
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,b){a.Models.Base=b.Model.extend({getModelType:function(){return""}})})(Mibew,Backbone);
|
8
src/messenger/webim/js/compiled/default/models/page.js
Normal file
8
src/messenger/webim/js/compiled/default/models/page.js
Normal file
@ -0,0 +1,8 @@
|
||||
/*
|
||||
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,b){a.Models.Page=b.Model.extend()})(Mibew,Backbone);
|
8
src/messenger/webim/js/compiled/default/models/sound.js
Normal file
8
src/messenger/webim/js/compiled/default/models/sound.js
Normal file
@ -0,0 +1,8 @@
|
||||
/*
|
||||
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,b){a.Models.Sound=b.Model.extend({play:function(a){this.set({file:a});this.trigger("sound:play",this)}})})(Mibew,Backbone);
|
8
src/messenger/webim/js/compiled/default/models/user.js
Normal file
8
src/messenger/webim/js/compiled/default/models/user.js
Normal file
@ -0,0 +1,8 @@
|
||||
/*
|
||||
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,b){a.Models.User=b.Model.extend({defaults:{isAgent:!1,canPost:!0,typing:!1,name:"",canChangeName:!1,dafaultName:!0}})})(Mibew,Backbone);
|
14
src/messenger/webim/js/compiled/default/server.js
Normal file
14
src/messenger/webim/js/compiled/default/server.js
Normal file
@ -0,0 +1,14 @@
|
||||
/*
|
||||
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(b,f,g,c){b.Server=function(a){this.updateTimer=null;this.options=c.extend({url:"",requestsFrequency:2,reconnectPause:1,onTimeout:function(){},onTransportError:function(){},onCallError:function(){},onUpdateError:function(){},onResponseError:function(){}},a);this.callbacks={};this.callPeriodically=[];this.ajaxRequest=null;this.buffer=[];this.functions={};this.mibewAPI=new f(new MibewAPICoreInteraction)};b.Server.prototype.callFunctions=function(a,e,b){try{if(!(a instanceof Array))throw Error("The first arguments must be an array");
|
||||
for(var d in a)a.hasOwnProperty(d)&&this.mibewAPI.checkFunction(a[d],!1);var c=this.generateToken();this.callbacks[c]=e;this.buffer.push({token:c,functions:a});b&&this.update()}catch(f){return this.options.onCallError(f),!1}return!0};b.Server.prototype.callFunctionsPeriodically=function(a,e){this.callPeriodically.push({functionsListBuilder:a,callbackFunction:e})};b.Server.prototype.generateToken=function(){var a;do a="wnd"+(new Date).getTime().toString()+Math.round(50*Math.random()).toString();while(a in
|
||||
this.callbacks);return a};b.Server.prototype.processRequest=function(a){var e=new MibewAPIExecutionContext,b=this.mibewAPI.getResultFunction(a.functions,this.callbacks.hasOwnProperty(a.token));if(null===b)for(var d in a.functions)a.functions.hasOwnProperty(d)&&(this.processFunction(a.functions[d],e),this.buffer.push(this.mibewAPI.buildResult(e.getResults(),a.token)));else this.callbacks.hasOwnProperty(a.token)&&(this.callbacks[a.token](b.arguments),delete this.callbacks[a.token])};b.Server.prototype.processFunction=
|
||||
function(a,e){if(this.functions.hasOwnProperty(a["function"])){var b=e.getArgumentsList(a),d={},f;for(f in this.functions[a["function"]])this.functions[a["function"]].hasOwnProperty(f)&&(d=c.extend(d,this.functions[a["function"]][f](b)));e.storeFunctionResults(a,d)}};b.Server.prototype.sendRequests=function(a){this.ajaxRequest=g.ajax({url:this.options.url,timeout:5E3,async:!0,cache:!1,type:"POST",dataType:"text",data:{data:this.mibewAPI.encodePackage(a)},success:c.bind(this.receiveResponse,this),
|
||||
error:c.bind(this.onError,this)})};b.Server.prototype.runUpdater=function(){null==this.updateTimer&&this.update();this.updateTimer=setTimeout(c.bind(this.update,this),1E3*this.options.requestsFrequency)};b.Server.prototype.restartUpdater=function(){this.updateTimer&&clearTimeout(this.updateTimer);this.ajaxRequest&&this.ajaxRequest.abort();this.update();this.updateTimer=setTimeout(c.bind(this.update,this),1E3*this.options.reconnectPause)};b.Server.prototype.update=function(){this.updateTimer&&clearTimeout(this.updateTimer);
|
||||
for(var a=0;a<this.callPeriodically.length;a++)this.callFunctions(this.callPeriodically[a].functionsListBuilder(),this.callPeriodically[a].callbackFunction);if(0==this.buffer.length)this.runUpdater();else try{this.sendRequests(this.buffer),this.buffer=[]}catch(b){this.options.onUpdateError(b)}};b.Server.prototype.receiveResponse=function(a){""==a&&this.runUpdater();try{var b=this.mibewAPI.decodePackage(a),c;for(c in b.requests)this.processRequest(b.requests[c])}catch(d){this.options.onResponseError(d)}finally{this.runUpdater()}};
|
||||
b.Server.prototype.registerFunction=function(a,b){a in this.functions||(this.functions[a]=[]);this.functions[a].push(b)};b.Server.prototype.onError=function(a,b){if("abort"!=b)if(this.restartUpdater(),"timeout"==b)this.options.onTimeout();else if("error"==b)this.options.onTransportError()}})(Mibew,MibewAPI,$,_);
|
@ -5,4 +5,4 @@
|
||||
Copyright (c) 2005-2011 Mibew Messenger Community
|
||||
License: http://mibew.org/license.php
|
||||
*/
|
||||
var Thread=function(a){this.threadid=a.threadid||0;this.token=a.token||0;this.lastid=a.lastid||0;this.user=a.user||!1};
|
||||
(function(b){b.Thread=function(a){this.threadId=a.threadId||0;this.token=a.token||0;this.lastId=a.lastId||0}})(Mibew);
|
8
src/messenger/webim/js/compiled/default/utils.js
Normal file
8
src/messenger/webim/js/compiled/default/utils.js
Normal file
@ -0,0 +1,8 @@
|
||||
/*
|
||||
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(c){c.Utils={};c.Utils.toUpperCaseFirst=function(a){return"string"!=typeof a?!1:""===a?a:a.substring(0,1).toUpperCase()+a.substring(1)};c.Utils.toDashFormat=function(a){if("string"!=typeof a)return!1;a=a.match(/((?:[A-Z]?[a-z]+)|(?:[A-Z][a-z]*))/g);for(var b=0;b<a.length;b++)a[b]=a[b].toLowerCase();return a.join("-")}})(Mibew);
|
@ -0,0 +1,8 @@
|
||||
/*
|
||||
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(d,b,e){d.Views.CollectionBase=b.Marionette.CollectionView.extend({itemView:b.Marionette.ItemView,buildItemView:function(a,b,c){c=e.extend({model:a},c);return(a=a.getModelType())&&d.Views[a]?new d.Views[a](c):new b(c)}})})(Mibew,Backbone,_);
|
8
src/messenger/webim/js/compiled/default/views/sound.js
Normal file
8
src/messenger/webim/js/compiled/default/views/sound.js
Normal file
@ -0,0 +1,8 @@
|
||||
/*
|
||||
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,b,c){a.Views.Sound=b.Marionette.ItemView.extend({template:c.templates.sound,className:"sound-player",modelEvents:{"sound:play":"render"}})})(Mibew,Backbone,Handlebars);
|
29
src/messenger/webim/js/compiled/default_app.js
Normal file
29
src/messenger/webim/js/compiled/default_app.js
Normal file
@ -0,0 +1,29 @@
|
||||
/*
|
||||
This file is part of Mibew Messenger project.
|
||||
http://mibew.org
|
||||
Copyright (c) 2005-2011 Mibew Messenger Community
|
||||
License: http://mibew.org/license.php
|
||||
*/
|
||||
var Mibew={};(function(a,b){b.Marionette.TemplateCache.prototype.compileTemplate=function(a){return Handlebars.compile(a)};a.Models={};a.Collections={};a.Views={};a.Objects={};a.Objects.Models={};a.Objects.Collections={}})(Mibew,Backbone);
|
||||
(function(e,a){a.registerHelper("apply",function(c,b){var f=c,e=/^[0-9A-z_]+$/;b=b.split(/\s*,\s*/);for(var d in b)if(b.hasOwnProperty(d)&&e.test(b[d])){if("function"!=typeof a.helpers[b[d]])throw Error("Unregistered helper '"+b[d]+"'!");f=a.helpers[b[d]](f).toString()}return new a.SafeString(f)});a.registerHelper("formatTime",function(c){var b=new Date(1E3*c);c=b.getHours().toString();var a=b.getMinutes().toString(),b=b.getSeconds().toString();return(10<c?c:"0"+c)+":"+(10<a?a:"0"+a)+":"+(10<b?b:
|
||||
"0"+b)});a.registerHelper("urlReplace",function(c){return new a.SafeString(c.replace(/((?:https?|ftp):\/\/\S*)/g,'<a href="$1" target="_blank">$1</a>'))});a.registerHelper("nl2br",function(c){return new a.SafeString(c.replace(/\n/g,"<br/>"))});a.registerHelper("L10n",function(a){return e.Localization.get(a)||""})})(Mibew,Handlebars);
|
||||
(function(b,d){b.Localization={};var c={};b.Localization.get=function(a){return!c.hasOwnProperty(a)?!1:c[a]};b.Localization.set=function(a){d.extend(c,a)}})(Mibew,_);
|
||||
(function(b,f,g,c){b.Server=function(a){this.updateTimer=null;this.options=c.extend({url:"",requestsFrequency:2,reconnectPause:1,onTimeout:function(){},onTransportError:function(){},onCallError:function(){},onUpdateError:function(){},onResponseError:function(){}},a);this.callbacks={};this.callPeriodically=[];this.ajaxRequest=null;this.buffer=[];this.functions={};this.mibewAPI=new f(new MibewAPICoreInteraction)};b.Server.prototype.callFunctions=function(a,e,b){try{if(!(a instanceof Array))throw Error("The first arguments must be an array");
|
||||
for(var d in a)a.hasOwnProperty(d)&&this.mibewAPI.checkFunction(a[d],!1);var c=this.generateToken();this.callbacks[c]=e;this.buffer.push({token:c,functions:a});b&&this.update()}catch(f){return this.options.onCallError(f),!1}return!0};b.Server.prototype.callFunctionsPeriodically=function(a,e){this.callPeriodically.push({functionsListBuilder:a,callbackFunction:e})};b.Server.prototype.generateToken=function(){var a;do a="wnd"+(new Date).getTime().toString()+Math.round(50*Math.random()).toString();while(a in
|
||||
this.callbacks);return a};b.Server.prototype.processRequest=function(a){var e=new MibewAPIExecutionContext,b=this.mibewAPI.getResultFunction(a.functions,this.callbacks.hasOwnProperty(a.token));if(null===b)for(var d in a.functions)a.functions.hasOwnProperty(d)&&(this.processFunction(a.functions[d],e),this.buffer.push(this.mibewAPI.buildResult(e.getResults(),a.token)));else this.callbacks.hasOwnProperty(a.token)&&(this.callbacks[a.token](b.arguments),delete this.callbacks[a.token])};b.Server.prototype.processFunction=
|
||||
function(a,e){if(this.functions.hasOwnProperty(a["function"])){var b=e.getArgumentsList(a),d={},f;for(f in this.functions[a["function"]])this.functions[a["function"]].hasOwnProperty(f)&&(d=c.extend(d,this.functions[a["function"]][f](b)));e.storeFunctionResults(a,d)}};b.Server.prototype.sendRequests=function(a){this.ajaxRequest=g.ajax({url:this.options.url,timeout:5E3,async:!0,cache:!1,type:"POST",dataType:"text",data:{data:this.mibewAPI.encodePackage(a)},success:c.bind(this.receiveResponse,this),
|
||||
error:c.bind(this.onError,this)})};b.Server.prototype.runUpdater=function(){null==this.updateTimer&&this.update();this.updateTimer=setTimeout(c.bind(this.update,this),1E3*this.options.requestsFrequency)};b.Server.prototype.restartUpdater=function(){this.updateTimer&&clearTimeout(this.updateTimer);this.ajaxRequest&&this.ajaxRequest.abort();this.update();this.updateTimer=setTimeout(c.bind(this.update,this),1E3*this.options.reconnectPause)};b.Server.prototype.update=function(){this.updateTimer&&clearTimeout(this.updateTimer);
|
||||
for(var a=0;a<this.callPeriodically.length;a++)this.callFunctions(this.callPeriodically[a].functionsListBuilder(),this.callPeriodically[a].callbackFunction);if(0==this.buffer.length)this.runUpdater();else try{this.sendRequests(this.buffer),this.buffer=[]}catch(b){this.options.onUpdateError(b)}};b.Server.prototype.receiveResponse=function(a){""==a&&this.runUpdater();try{var b=this.mibewAPI.decodePackage(a),c;for(c in b.requests)this.processRequest(b.requests[c])}catch(d){this.options.onResponseError(d)}finally{this.runUpdater()}};
|
||||
b.Server.prototype.registerFunction=function(a,b){a in this.functions||(this.functions[a]=[]);this.functions[a].push(b)};b.Server.prototype.onError=function(a,b){if("abort"!=b)if(this.restartUpdater(),"timeout"==b)this.options.onTimeout();else if("error"==b)this.options.onTransportError()}})(Mibew,MibewAPI,$,_);
|
||||
(function(b){b.Thread=function(a){this.threadId=a.threadId||0;this.token=a.token||0;this.lastId=a.lastId||0}})(Mibew);
|
||||
(function(c){c.Utils={};c.Utils.toUpperCaseFirst=function(a){return"string"!=typeof a?!1:""===a?a:a.substring(0,1).toUpperCase()+a.substring(1)};c.Utils.toDashFormat=function(a){if("string"!=typeof a)return!1;a=a.match(/((?:[A-Z]?[a-z]+)|(?:[A-Z][a-z]*))/g);for(var b=0;b<a.length;b++)a[b]=a[b].toLowerCase();return a.join("-")}})(Mibew);
|
||||
(function(a,b){a.Models.Base=b.Model.extend({getModelType:function(){return""}})})(Mibew,Backbone);
|
||||
(function(a,b){a.Models.Page=b.Model.extend()})(Mibew,Backbone);
|
||||
(function(a,b){a.Models.Sound=b.Model.extend({play:function(a){this.set({file:a});this.trigger("sound:play",this)}})})(Mibew,Backbone);
|
||||
(function(a,b){a.Models.User=b.Model.extend({defaults:{isAgent:!1,canPost:!0,typing:!1,name:"",canChangeName:!1,dafaultName:!0}})})(Mibew,Backbone);
|
||||
(function(d,b,e){d.Views.CollectionBase=b.Marionette.CollectionView.extend({itemView:b.Marionette.ItemView,buildItemView:function(a,b,c){c=e.extend({model:a},c);return(a=a.getModelType())&&d.Views[a]?new d.Views[a](c):new b(c)}})})(Mibew,Backbone,_);
|
||||
(function(a,b,c){a.Views.Sound=b.Marionette.ItemView.extend({template:c.templates.sound,className:"sound-player",modelEvents:{"sound:play":"render"}})})(Mibew,Backbone,Handlebars);
|
||||
(function(a,b){a.Models.Page=b.Model.extend()})(Mibew,Backbone);
|
||||
(function(a,b){a.Models.Sound=b.Model.extend({play:function(a){this.set({file:a});this.trigger("sound:play",this)}})})(Mibew,Backbone);
|
||||
(function(a,b){a.Models.User=b.Model.extend({defaults:{isAgent:!1,canPost:!0,typing:!1,name:"",canChangeName:!1,dafaultName:!0}})})(Mibew,Backbone);
|
||||
(function(a,b,c){a.Views.Sound=b.Marionette.ItemView.extend({template:c.templates.sound,className:"sound-player",modelEvents:{"sound:play":"render"}})})(Mibew,Backbone,Handlebars);
|
@ -1,9 +0,0 @@
|
||||
/*
|
||||
This file is part of Mibew Messenger project.
|
||||
http://mibew.org
|
||||
|
||||
Copyright (c) 2005-2011 Mibew Messenger Community
|
||||
License: http://mibew.org/license.php
|
||||
*/
|
||||
Handlebars.registerHelper("apply",function(b,a){var c=b,e=/^[0-9A-z_]+$/,a=a.split(/\s*,\s*/),d;for(d in a)if(a.hasOwnProperty(d)&&e.test(a[d])){if("function"!=typeof Handlebars.helpers[a[d]])throw Error("Unregistered helper '"+a[d]+"'!");c=Handlebars.helpers[a[d]](c).toString()}return new Handlebars.SafeString(c)});
|
||||
Handlebars.registerHelper("formatTime",function(b){var a=new Date(1E3*b),b=a.getHours().toString(),c=a.getMinutes().toString(),a=a.getSeconds().toString();return(10<b?b:"0"+b)+":"+(10<c?c:"0"+c)+":"+(10<a?a:"0"+a)});Handlebars.registerHelper("urlReplace",function(b){return new Handlebars.SafeString(b.replace(/((?:https?|ftp):\/\/\S*)/g,'<a href="$1" target="_blank">$1</a>'))});Handlebars.registerHelper("nl2br",function(b){return new Handlebars.SafeString(b.replace(/\n/g,"<br/>"))});
|
@ -1,10 +0,0 @@
|
||||
/*
|
||||
This file is part of Mibew Messenger project.
|
||||
http://mibew.org
|
||||
|
||||
Copyright (c) 2005-2011 Mibew Messenger Community
|
||||
License: http://mibew.org/license.php
|
||||
*/
|
||||
var MessageView=function(){var b={"<":"<",">":">","&":"&",'"':""","'":"'","`":"`"},c=/[&<>'"`]/g;this.kindToString=function(a){return a==this.KIND_USER?"user":a==this.KIND_AGENT?"agent":a==this.KIND_FOR_AGENT?"hidden":a==this.KIND_INFO?"inf":a==this.KIND_CONN?"conn":a==this.KIND_EVENTS?"event":""};this.escapeString=function(a){return a.replace(c,function(a){return b[a]||"&"})};this.themeMessage=function(a){if(!Handlebars.templates.message)throw Error("There is no template for message loaded!");
|
||||
if(a.kind==this.KIND_AVATAR)throw Error("KIND_AVATAR message kind is deprecated at window!");a.allowFormating=a.kind!=this.KIND_USER&&a.kind!=this.KIND_AGENT;a.kindName=this.kindToString(a.kind);a.message=this.escapeString(a.message);return Handlebars.templates.message(a)}};MessageView.prototype.KIND_USER=1;MessageView.prototype.KIND_AGENT=2;MessageView.prototype.KIND_FOR_AGENT=3;MessageView.prototype.KIND_INFO=4;MessageView.prototype.KIND_CONN=5;MessageView.prototype.KIND_EVENTS=6;
|
||||
MessageView.prototype.KIND_AVATAR=7;Handlebars.registerHelper("allowTags",function(b){b=b.replace(/<(span|strong)>(.*?)<\/\1>/g,"<$1>$2</$1>");b=b.replace(/<span class="(.*?)">(.*?)<\/span>/g,'<span class="$1">$2</span>');return new Handlebars.SafeString(b)});
|
38
src/messenger/webim/js/libs/backbone-min.js
vendored
Normal file
38
src/messenger/webim/js/libs/backbone-min.js
vendored
Normal file
@ -0,0 +1,38 @@
|
||||
// Backbone.js 0.9.2
|
||||
|
||||
// (c) 2010-2012 Jeremy Ashkenas, DocumentCloud Inc.
|
||||
// Backbone may be freely distributed under the MIT license.
|
||||
// For all details and documentation:
|
||||
// http://backbonejs.org
|
||||
(function(){var l=this,y=l.Backbone,z=Array.prototype.slice,A=Array.prototype.splice,g;g="undefined"!==typeof exports?exports:l.Backbone={};g.VERSION="0.9.2";var f=l._;!f&&"undefined"!==typeof require&&(f=require("underscore"));var i=l.jQuery||l.Zepto||l.ender;g.setDomLibrary=function(a){i=a};g.noConflict=function(){l.Backbone=y;return this};g.emulateHTTP=!1;g.emulateJSON=!1;var p=/\s+/,k=g.Events={on:function(a,b,c){var d,e,f,g,j;if(!b)return this;a=a.split(p);for(d=this._callbacks||(this._callbacks=
|
||||
{});e=a.shift();)f=(j=d[e])?j.tail:{},f.next=g={},f.context=c,f.callback=b,d[e]={tail:g,next:j?j.next:f};return this},off:function(a,b,c){var d,e,h,g,j,q;if(e=this._callbacks){if(!a&&!b&&!c)return delete this._callbacks,this;for(a=a?a.split(p):f.keys(e);d=a.shift();)if(h=e[d],delete e[d],h&&(b||c))for(g=h.tail;(h=h.next)!==g;)if(j=h.callback,q=h.context,b&&j!==b||c&&q!==c)this.on(d,j,q);return this}},trigger:function(a){var b,c,d,e,f,g;if(!(d=this._callbacks))return this;f=d.all;a=a.split(p);for(g=
|
||||
z.call(arguments,1);b=a.shift();){if(c=d[b])for(e=c.tail;(c=c.next)!==e;)c.callback.apply(c.context||this,g);if(c=f){e=c.tail;for(b=[b].concat(g);(c=c.next)!==e;)c.callback.apply(c.context||this,b)}}return this}};k.bind=k.on;k.unbind=k.off;var o=g.Model=function(a,b){var c;a||(a={});b&&b.parse&&(a=this.parse(a));if(c=n(this,"defaults"))a=f.extend({},c,a);b&&b.collection&&(this.collection=b.collection);this.attributes={};this._escapedAttributes={};this.cid=f.uniqueId("c");this.changed={};this._silent=
|
||||
{};this._pending={};this.set(a,{silent:!0});this.changed={};this._silent={};this._pending={};this._previousAttributes=f.clone(this.attributes);this.initialize.apply(this,arguments)};f.extend(o.prototype,k,{changed:null,_silent:null,_pending:null,idAttribute:"id",initialize:function(){},toJSON:function(){return f.clone(this.attributes)},get:function(a){return this.attributes[a]},escape:function(a){var b;if(b=this._escapedAttributes[a])return b;b=this.get(a);return this._escapedAttributes[a]=f.escape(null==
|
||||
b?"":""+b)},has:function(a){return null!=this.get(a)},set:function(a,b,c){var d,e;f.isObject(a)||null==a?(d=a,c=b):(d={},d[a]=b);c||(c={});if(!d)return this;d instanceof o&&(d=d.attributes);if(c.unset)for(e in d)d[e]=void 0;if(!this._validate(d,c))return!1;this.idAttribute in d&&(this.id=d[this.idAttribute]);var b=c.changes={},h=this.attributes,g=this._escapedAttributes,j=this._previousAttributes||{};for(e in d){a=d[e];if(!f.isEqual(h[e],a)||c.unset&&f.has(h,e))delete g[e],(c.silent?this._silent:
|
||||
b)[e]=!0;c.unset?delete h[e]:h[e]=a;!f.isEqual(j[e],a)||f.has(h,e)!=f.has(j,e)?(this.changed[e]=a,c.silent||(this._pending[e]=!0)):(delete this.changed[e],delete this._pending[e])}c.silent||this.change(c);return this},unset:function(a,b){(b||(b={})).unset=!0;return this.set(a,null,b)},clear:function(a){(a||(a={})).unset=!0;return this.set(f.clone(this.attributes),a)},fetch:function(a){var a=a?f.clone(a):{},b=this,c=a.success;a.success=function(d,e,f){if(!b.set(b.parse(d,f),a))return!1;c&&c(b,d)};
|
||||
a.error=g.wrapError(a.error,b,a);return(this.sync||g.sync).call(this,"read",this,a)},save:function(a,b,c){var d,e;f.isObject(a)||null==a?(d=a,c=b):(d={},d[a]=b);c=c?f.clone(c):{};if(c.wait){if(!this._validate(d,c))return!1;e=f.clone(this.attributes)}a=f.extend({},c,{silent:!0});if(d&&!this.set(d,c.wait?a:c))return!1;var h=this,i=c.success;c.success=function(a,b,e){b=h.parse(a,e);if(c.wait){delete c.wait;b=f.extend(d||{},b)}if(!h.set(b,c))return false;i?i(h,a):h.trigger("sync",h,a,c)};c.error=g.wrapError(c.error,
|
||||
h,c);b=this.isNew()?"create":"update";b=(this.sync||g.sync).call(this,b,this,c);c.wait&&this.set(e,a);return b},destroy:function(a){var a=a?f.clone(a):{},b=this,c=a.success,d=function(){b.trigger("destroy",b,b.collection,a)};if(this.isNew())return d(),!1;a.success=function(e){a.wait&&d();c?c(b,e):b.trigger("sync",b,e,a)};a.error=g.wrapError(a.error,b,a);var e=(this.sync||g.sync).call(this,"delete",this,a);a.wait||d();return e},url:function(){var a=n(this,"urlRoot")||n(this.collection,"url")||t();
|
||||
return this.isNew()?a:a+("/"==a.charAt(a.length-1)?"":"/")+encodeURIComponent(this.id)},parse:function(a){return a},clone:function(){return new this.constructor(this.attributes)},isNew:function(){return null==this.id},change:function(a){a||(a={});var b=this._changing;this._changing=!0;for(var c in this._silent)this._pending[c]=!0;var d=f.extend({},a.changes,this._silent);this._silent={};for(c in d)this.trigger("change:"+c,this,this.get(c),a);if(b)return this;for(;!f.isEmpty(this._pending);){this._pending=
|
||||
{};this.trigger("change",this,a);for(c in this.changed)!this._pending[c]&&!this._silent[c]&&delete this.changed[c];this._previousAttributes=f.clone(this.attributes)}this._changing=!1;return this},hasChanged:function(a){return!arguments.length?!f.isEmpty(this.changed):f.has(this.changed,a)},changedAttributes:function(a){if(!a)return this.hasChanged()?f.clone(this.changed):!1;var b,c=!1,d=this._previousAttributes,e;for(e in a)if(!f.isEqual(d[e],b=a[e]))(c||(c={}))[e]=b;return c},previous:function(a){return!arguments.length||
|
||||
!this._previousAttributes?null:this._previousAttributes[a]},previousAttributes:function(){return f.clone(this._previousAttributes)},isValid:function(){return!this.validate(this.attributes)},_validate:function(a,b){if(b.silent||!this.validate)return!0;var a=f.extend({},this.attributes,a),c=this.validate(a,b);if(!c)return!0;b&&b.error?b.error(this,c,b):this.trigger("error",this,c,b);return!1}});var r=g.Collection=function(a,b){b||(b={});b.model&&(this.model=b.model);b.comparator&&(this.comparator=b.comparator);
|
||||
this._reset();this.initialize.apply(this,arguments);a&&this.reset(a,{silent:!0,parse:b.parse})};f.extend(r.prototype,k,{model:o,initialize:function(){},toJSON:function(a){return this.map(function(b){return b.toJSON(a)})},add:function(a,b){var c,d,e,g,i,j={},k={},l=[];b||(b={});a=f.isArray(a)?a.slice():[a];c=0;for(d=a.length;c<d;c++){if(!(e=a[c]=this._prepareModel(a[c],b)))throw Error("Can't add an invalid model to a collection");g=e.cid;i=e.id;j[g]||this._byCid[g]||null!=i&&(k[i]||this._byId[i])?
|
||||
l.push(c):j[g]=k[i]=e}for(c=l.length;c--;)a.splice(l[c],1);c=0;for(d=a.length;c<d;c++)(e=a[c]).on("all",this._onModelEvent,this),this._byCid[e.cid]=e,null!=e.id&&(this._byId[e.id]=e);this.length+=d;A.apply(this.models,[null!=b.at?b.at:this.models.length,0].concat(a));this.comparator&&this.sort({silent:!0});if(b.silent)return this;c=0;for(d=this.models.length;c<d;c++)if(j[(e=this.models[c]).cid])b.index=c,e.trigger("add",e,this,b);return this},remove:function(a,b){var c,d,e,g;b||(b={});a=f.isArray(a)?
|
||||
a.slice():[a];c=0;for(d=a.length;c<d;c++)if(g=this.getByCid(a[c])||this.get(a[c]))delete this._byId[g.id],delete this._byCid[g.cid],e=this.indexOf(g),this.models.splice(e,1),this.length--,b.silent||(b.index=e,g.trigger("remove",g,this,b)),this._removeReference(g);return this},push:function(a,b){a=this._prepareModel(a,b);this.add(a,b);return a},pop:function(a){var b=this.at(this.length-1);this.remove(b,a);return b},unshift:function(a,b){a=this._prepareModel(a,b);this.add(a,f.extend({at:0},b));return a},
|
||||
shift:function(a){var b=this.at(0);this.remove(b,a);return b},get:function(a){return null==a?void 0:this._byId[null!=a.id?a.id:a]},getByCid:function(a){return a&&this._byCid[a.cid||a]},at:function(a){return this.models[a]},where:function(a){return f.isEmpty(a)?[]:this.filter(function(b){for(var c in a)if(a[c]!==b.get(c))return!1;return!0})},sort:function(a){a||(a={});if(!this.comparator)throw Error("Cannot sort a set without a comparator");var b=f.bind(this.comparator,this);1==this.comparator.length?
|
||||
this.models=this.sortBy(b):this.models.sort(b);a.silent||this.trigger("reset",this,a);return this},pluck:function(a){return f.map(this.models,function(b){return b.get(a)})},reset:function(a,b){a||(a=[]);b||(b={});for(var c=0,d=this.models.length;c<d;c++)this._removeReference(this.models[c]);this._reset();this.add(a,f.extend({silent:!0},b));b.silent||this.trigger("reset",this,b);return this},fetch:function(a){a=a?f.clone(a):{};void 0===a.parse&&(a.parse=!0);var b=this,c=a.success;a.success=function(d,
|
||||
e,f){b[a.add?"add":"reset"](b.parse(d,f),a);c&&c(b,d)};a.error=g.wrapError(a.error,b,a);return(this.sync||g.sync).call(this,"read",this,a)},create:function(a,b){var c=this,b=b?f.clone(b):{},a=this._prepareModel(a,b);if(!a)return!1;b.wait||c.add(a,b);var d=b.success;b.success=function(e,f){b.wait&&c.add(e,b);d?d(e,f):e.trigger("sync",a,f,b)};a.save(null,b);return a},parse:function(a){return a},chain:function(){return f(this.models).chain()},_reset:function(){this.length=0;this.models=[];this._byId=
|
||||
{};this._byCid={}},_prepareModel:function(a,b){b||(b={});a instanceof o?a.collection||(a.collection=this):(b.collection=this,a=new this.model(a,b),a._validate(a.attributes,b)||(a=!1));return a},_removeReference:function(a){this==a.collection&&delete a.collection;a.off("all",this._onModelEvent,this)},_onModelEvent:function(a,b,c,d){("add"==a||"remove"==a)&&c!=this||("destroy"==a&&this.remove(b,d),b&&a==="change:"+b.idAttribute&&(delete this._byId[b.previous(b.idAttribute)],this._byId[b.id]=b),this.trigger.apply(this,
|
||||
arguments))}});f.each("forEach,each,map,reduce,reduceRight,find,detect,filter,select,reject,every,all,some,any,include,contains,invoke,max,min,sortBy,sortedIndex,toArray,size,first,initial,rest,last,without,indexOf,shuffle,lastIndexOf,isEmpty,groupBy".split(","),function(a){r.prototype[a]=function(){return f[a].apply(f,[this.models].concat(f.toArray(arguments)))}});var u=g.Router=function(a){a||(a={});a.routes&&(this.routes=a.routes);this._bindRoutes();this.initialize.apply(this,arguments)},B=/:\w+/g,
|
||||
C=/\*\w+/g,D=/[-[\]{}()+?.,\\^$|#\s]/g;f.extend(u.prototype,k,{initialize:function(){},route:function(a,b,c){g.history||(g.history=new m);f.isRegExp(a)||(a=this._routeToRegExp(a));c||(c=this[b]);g.history.route(a,f.bind(function(d){d=this._extractParameters(a,d);c&&c.apply(this,d);this.trigger.apply(this,["route:"+b].concat(d));g.history.trigger("route",this,b,d)},this));return this},navigate:function(a,b){g.history.navigate(a,b)},_bindRoutes:function(){if(this.routes){var a=[],b;for(b in this.routes)a.unshift([b,
|
||||
this.routes[b]]);b=0;for(var c=a.length;b<c;b++)this.route(a[b][0],a[b][1],this[a[b][1]])}},_routeToRegExp:function(a){a=a.replace(D,"\\$&").replace(B,"([^/]+)").replace(C,"(.*?)");return RegExp("^"+a+"$")},_extractParameters:function(a,b){return a.exec(b).slice(1)}});var m=g.History=function(){this.handlers=[];f.bindAll(this,"checkUrl")},s=/^[#\/]/,E=/msie [\w.]+/;m.started=!1;f.extend(m.prototype,k,{interval:50,getHash:function(a){return(a=(a?a.location:window.location).href.match(/#(.*)$/))?a[1]:
|
||||
""},getFragment:function(a,b){if(null==a)if(this._hasPushState||b){var a=window.location.pathname,c=window.location.search;c&&(a+=c)}else a=this.getHash();a.indexOf(this.options.root)||(a=a.substr(this.options.root.length));return a.replace(s,"")},start:function(a){if(m.started)throw Error("Backbone.history has already been started");m.started=!0;this.options=f.extend({},{root:"/"},this.options,a);this._wantsHashChange=!1!==this.options.hashChange;this._wantsPushState=!!this.options.pushState;this._hasPushState=
|
||||
!(!this.options.pushState||!window.history||!window.history.pushState);var a=this.getFragment(),b=document.documentMode;if(b=E.exec(navigator.userAgent.toLowerCase())&&(!b||7>=b))this.iframe=i('<iframe src="javascript:0" tabindex="-1" />').hide().appendTo("body")[0].contentWindow,this.navigate(a);this._hasPushState?i(window).bind("popstate",this.checkUrl):this._wantsHashChange&&"onhashchange"in window&&!b?i(window).bind("hashchange",this.checkUrl):this._wantsHashChange&&(this._checkUrlInterval=setInterval(this.checkUrl,
|
||||
this.interval));this.fragment=a;a=window.location;b=a.pathname==this.options.root;if(this._wantsHashChange&&this._wantsPushState&&!this._hasPushState&&!b)return this.fragment=this.getFragment(null,!0),window.location.replace(this.options.root+"#"+this.fragment),!0;this._wantsPushState&&this._hasPushState&&b&&a.hash&&(this.fragment=this.getHash().replace(s,""),window.history.replaceState({},document.title,a.protocol+"//"+a.host+this.options.root+this.fragment));if(!this.options.silent)return this.loadUrl()},
|
||||
stop:function(){i(window).unbind("popstate",this.checkUrl).unbind("hashchange",this.checkUrl);clearInterval(this._checkUrlInterval);m.started=!1},route:function(a,b){this.handlers.unshift({route:a,callback:b})},checkUrl:function(){var a=this.getFragment();a==this.fragment&&this.iframe&&(a=this.getFragment(this.getHash(this.iframe)));if(a==this.fragment)return!1;this.iframe&&this.navigate(a);this.loadUrl()||this.loadUrl(this.getHash())},loadUrl:function(a){var b=this.fragment=this.getFragment(a);return f.any(this.handlers,
|
||||
function(a){if(a.route.test(b))return a.callback(b),!0})},navigate:function(a,b){if(!m.started)return!1;if(!b||!0===b)b={trigger:b};var c=(a||"").replace(s,"");this.fragment!=c&&(this._hasPushState?(0!=c.indexOf(this.options.root)&&(c=this.options.root+c),this.fragment=c,window.history[b.replace?"replaceState":"pushState"]({},document.title,c)):this._wantsHashChange?(this.fragment=c,this._updateHash(window.location,c,b.replace),this.iframe&&c!=this.getFragment(this.getHash(this.iframe))&&(b.replace||
|
||||
this.iframe.document.open().close(),this._updateHash(this.iframe.location,c,b.replace))):window.location.assign(this.options.root+a),b.trigger&&this.loadUrl(a))},_updateHash:function(a,b,c){c?a.replace(a.toString().replace(/(javascript:|#).*$/,"")+"#"+b):a.hash=b}});var v=g.View=function(a){this.cid=f.uniqueId("view");this._configure(a||{});this._ensureElement();this.initialize.apply(this,arguments);this.delegateEvents()},F=/^(\S+)\s*(.*)$/,w="model,collection,el,id,attributes,className,tagName".split(",");
|
||||
f.extend(v.prototype,k,{tagName:"div",$:function(a){return this.$el.find(a)},initialize:function(){},render:function(){return this},remove:function(){this.$el.remove();return this},make:function(a,b,c){a=document.createElement(a);b&&i(a).attr(b);c&&i(a).html(c);return a},setElement:function(a,b){this.$el&&this.undelegateEvents();this.$el=a instanceof i?a:i(a);this.el=this.$el[0];!1!==b&&this.delegateEvents();return this},delegateEvents:function(a){if(a||(a=n(this,"events"))){this.undelegateEvents();
|
||||
for(var b in a){var c=a[b];f.isFunction(c)||(c=this[a[b]]);if(!c)throw Error('Method "'+a[b]+'" does not exist');var d=b.match(F),e=d[1],d=d[2],c=f.bind(c,this),e=e+(".delegateEvents"+this.cid);""===d?this.$el.bind(e,c):this.$el.delegate(d,e,c)}}},undelegateEvents:function(){this.$el.unbind(".delegateEvents"+this.cid)},_configure:function(a){this.options&&(a=f.extend({},this.options,a));for(var b=0,c=w.length;b<c;b++){var d=w[b];a[d]&&(this[d]=a[d])}this.options=a},_ensureElement:function(){if(this.el)this.setElement(this.el,
|
||||
!1);else{var a=n(this,"attributes")||{};this.id&&(a.id=this.id);this.className&&(a["class"]=this.className);this.setElement(this.make(this.tagName,a),!1)}}});o.extend=r.extend=u.extend=v.extend=function(a,b){var c=G(this,a,b);c.extend=this.extend;return c};var H={create:"POST",update:"PUT","delete":"DELETE",read:"GET"};g.sync=function(a,b,c){var d=H[a];c||(c={});var e={type:d,dataType:"json"};c.url||(e.url=n(b,"url")||t());if(!c.data&&b&&("create"==a||"update"==a))e.contentType="application/json",
|
||||
e.data=JSON.stringify(b.toJSON());g.emulateJSON&&(e.contentType="application/x-www-form-urlencoded",e.data=e.data?{model:e.data}:{});if(g.emulateHTTP&&("PUT"===d||"DELETE"===d))g.emulateJSON&&(e.data._method=d),e.type="POST",e.beforeSend=function(a){a.setRequestHeader("X-HTTP-Method-Override",d)};"GET"!==e.type&&!g.emulateJSON&&(e.processData=!1);return i.ajax(f.extend(e,c))};g.wrapError=function(a,b,c){return function(d,e){e=d===b?e:d;a?a(b,e,c):b.trigger("error",b,e,c)}};var x=function(){},G=function(a,
|
||||
b,c){var d;d=b&&b.hasOwnProperty("constructor")?b.constructor:function(){a.apply(this,arguments)};f.extend(d,a);x.prototype=a.prototype;d.prototype=new x;b&&f.extend(d.prototype,b);c&&f.extend(d,c);d.prototype.constructor=d;d.__super__=a.prototype;return d},n=function(a,b){return!a||!a[b]?null:f.isFunction(a[b])?a[b]():a[b]},t=function(){throw Error('A "url" property or function must be specified');}}).call(this);
|
19
src/messenger/webim/js/libs/backbone.marionette.min.js
vendored
Normal file
19
src/messenger/webim/js/libs/backbone.marionette.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
5
src/messenger/webim/js/libs/underscore-min.js
vendored
Normal file
5
src/messenger/webim/js/libs/underscore-min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
172
src/messenger/webim/js/source/chat/app.js
Normal file
172
src/messenger/webim/js/source/chat/app.js
Normal file
@ -0,0 +1,172 @@
|
||||
/**
|
||||
* @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, Backbone) {
|
||||
|
||||
// Create application instance
|
||||
var App = new Backbone.Marionette.Application();
|
||||
|
||||
// Define regions
|
||||
App.addRegions({
|
||||
controlsRegion: '#controls-region',
|
||||
avatarRegion: '#avatar-region',
|
||||
messagesRegion: Mibew.Regions.Messages,
|
||||
statusRegion: '#status-region',
|
||||
messageFormRegion: '#message-form-region',
|
||||
soundRegion: '#sound-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;
|
||||
|
||||
|
||||
// Initialize Server, Thread and User
|
||||
objs.server = new Mibew.Server(options.server);
|
||||
objs.thread = new Mibew.Thread(options.thread);
|
||||
models.user = new Mibew.Models.User(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.push(controls.userName);
|
||||
|
||||
// Create mail control
|
||||
controls.sendMail = new Mibew.Models.SendMailControl({
|
||||
weight: 200,
|
||||
link: options.links.mailLink
|
||||
});
|
||||
ctrlsCollection.push(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.push(controls.redirect);
|
||||
|
||||
controls.history = new Mibew.Models.HistoryControl({
|
||||
weight: 180,
|
||||
link: options.links.historyLink
|
||||
});
|
||||
ctrlsCollection.push(controls.history);
|
||||
}
|
||||
|
||||
// Create toggle sound button
|
||||
controls.sound = new Mibew.Models.SoundControl({
|
||||
weight: 160
|
||||
});
|
||||
ctrlsCollection.push(controls.sound);
|
||||
|
||||
// Create refresh button
|
||||
controls.refresh = new Mibew.Models.RefreshControl({
|
||||
weight: 140
|
||||
});
|
||||
ctrlsCollection.push(controls.refresh);
|
||||
|
||||
if (options.links.sslLink) {
|
||||
controls.secureMode = new Mibew.Models.SecureModeControl({
|
||||
weight: 120,
|
||||
link: options.links.sslLink
|
||||
});
|
||||
ctrlsCollection.push(controls.secureMode);
|
||||
}
|
||||
|
||||
// Create close button
|
||||
controls.close = new Mibew.Models.CloseControl({
|
||||
weight: 100
|
||||
});
|
||||
ctrlsCollection.push(controls.close);
|
||||
|
||||
objs.Collections.controls = ctrlsCollection;
|
||||
|
||||
// Display controls
|
||||
App.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
|
||||
App.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();
|
||||
App.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
|
||||
App.messageFormRegion.show(new Mibew.Views.MessageForm({
|
||||
model: models.messageForm
|
||||
}));
|
||||
|
||||
// Display messages
|
||||
App.messagesRegion.show(new Mibew.Views.MessagesCollection({
|
||||
collection: objs.Collections.messages
|
||||
}));
|
||||
|
||||
|
||||
// Initialize sounds
|
||||
models.sound = new Mibew.Models.Sound();
|
||||
App.soundRegion.show(new Mibew.Views.Sound({
|
||||
model: models.sound
|
||||
}));
|
||||
|
||||
|
||||
// Run server updater
|
||||
objs.server.runUpdater();
|
||||
});
|
||||
|
||||
Mibew.Application = App;
|
||||
})(Mibew, Backbone);
|
27
src/messenger/webim/js/source/chat/collections/controls.js
vendored
Normal file
27
src/messenger/webim/js/source/chat/collections/controls.js
vendored
Normal file
@ -0,0 +1,27 @@
|
||||
/**
|
||||
* @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, Backbone){
|
||||
|
||||
/**
|
||||
* @class Represents collection of chat controls
|
||||
*/
|
||||
Mibew.Collections.Controls = Backbone.Collection.extend(
|
||||
/** @lends Mibew.Collections.Controls.prototype */
|
||||
{
|
||||
/**
|
||||
* Use for sort controls in collection
|
||||
* @param {Backbone.Model} model Control model
|
||||
*/
|
||||
comparator: function(model) {
|
||||
return model.get('weight');
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
})(Mibew, Backbone);
|
135
src/messenger/webim/js/source/chat/collections/messages.js
Normal file
135
src/messenger/webim/js/source/chat/collections/messages.js
Normal file
@ -0,0 +1,135 @@
|
||||
/**
|
||||
* @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, Backbone, _){
|
||||
|
||||
/**
|
||||
* @class Represents messages list
|
||||
*/
|
||||
Mibew.Collections.Messages = Backbone.Collection.extend(
|
||||
/** @lends Mibew.Collections.Message.prototype */
|
||||
{
|
||||
/**
|
||||
* Default contructor for model
|
||||
* @type Function
|
||||
*/
|
||||
model: Mibew.Models.Message,
|
||||
|
||||
/**
|
||||
* Collection initializer.
|
||||
*/
|
||||
initialize: function() {
|
||||
// Add periodic functions
|
||||
Mibew.Objects.server.callFunctionsPeriodically(
|
||||
_.bind(this.updateFunctionBuilder, this),
|
||||
_.bind(this.updateChatState, this)
|
||||
);
|
||||
|
||||
// Register API functions
|
||||
Mibew.Objects.server.registerFunction(
|
||||
'updateMessages',
|
||||
_.bind(this.apiUpdateMessages, this)
|
||||
);
|
||||
},
|
||||
|
||||
/**
|
||||
* Update messages if they are exist.
|
||||
* This is an API function.
|
||||
* @param args {Object} An object of passed arguments
|
||||
*/
|
||||
apiUpdateMessages: function(args) {
|
||||
|
||||
// Update last message id
|
||||
if (args.lastId) {
|
||||
Mibew.Objects.thread.lastId = args.lastId;
|
||||
}
|
||||
|
||||
// Get all new messages
|
||||
var newMessages = [];
|
||||
for(var i = 0, length = args.messages.length; i < length; i++) {
|
||||
// Store message
|
||||
newMessages.push(
|
||||
new Mibew.Models.Message(args.messages[i])
|
||||
);
|
||||
}
|
||||
|
||||
// Add new messages to the message collection if there are any
|
||||
// messages
|
||||
if (newMessages.length > 0) {
|
||||
this.add(newMessages);
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Builds update function, that should be called periodically at
|
||||
* the server side
|
||||
* @returns {Object[]} Array of functions objects
|
||||
*/
|
||||
updateFunctionBuilder: function() {
|
||||
// Get thread and user objects
|
||||
var thread = Mibew.Objects.thread;
|
||||
var user = Mibew.Objects.Models.user;
|
||||
|
||||
// Build functions list
|
||||
return [
|
||||
{
|
||||
"function": "update",
|
||||
"arguments": {
|
||||
"return": {
|
||||
'typing': 'typing',
|
||||
'canPost': 'canPost'
|
||||
},
|
||||
"references": {},
|
||||
"threadId": thread.threadId,
|
||||
"token": thread.token,
|
||||
"lastId": thread.lastId,
|
||||
"typed": user.get('typing'),
|
||||
"user": (! user.get('isAgent'))
|
||||
}
|
||||
}
|
||||
];
|
||||
},
|
||||
|
||||
/**
|
||||
* Updates chat status
|
||||
* @param {Object} args Arguments passed from the server
|
||||
*/
|
||||
updateChatState: 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
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Override Backbone.Collection.add method to call additional event
|
||||
*/
|
||||
add: function() {
|
||||
// Get arguments list
|
||||
var args = Array.prototype.slice.apply(arguments);
|
||||
// Call method of the parent class
|
||||
var res = Backbone.Collection.prototype.add.apply(this, args);
|
||||
// Triggers additional event
|
||||
this.trigger('multiple:add');
|
||||
return res;
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
})(Mibew, Backbone, _);
|
27
src/messenger/webim/js/source/chat/collections/status.js
Normal file
27
src/messenger/webim/js/source/chat/collections/status.js
Normal file
@ -0,0 +1,27 @@
|
||||
/**
|
||||
* @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, Backbone){
|
||||
|
||||
/**
|
||||
* @class Represents status bar
|
||||
*/
|
||||
Mibew.Collections.Status = Backbone.Collection.extend(
|
||||
/** @lends Mibew.Collections.Status.prototype */
|
||||
{
|
||||
/**
|
||||
* Use for sort controls in collection
|
||||
* @param {Backbone.Model} model Control model
|
||||
*/
|
||||
comparator: function(model) {
|
||||
return model.get('weight');
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
})(Mibew, Backbone);
|
29
src/messenger/webim/js/source/chat/handlebars_helpers.js
Normal file
29
src/messenger/webim/js/source/chat/handlebars_helpers.js
Normal file
@ -0,0 +1,29 @@
|
||||
/**
|
||||
* @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(Handlebars){
|
||||
|
||||
/**
|
||||
* Register 'allowTags' Handlebars helper.
|
||||
*
|
||||
* This helper unescape HTML entities for allowed (span and strong) tags.
|
||||
*/
|
||||
Handlebars.registerHelper('allowTags', function(text) {
|
||||
var result = text;
|
||||
result = result.replace(
|
||||
/<(span|strong)>(.*?)<\/\1>/g,
|
||||
'<$1>$2</$1>'
|
||||
);
|
||||
result = result.replace(
|
||||
/<span class="(.*?)">(.*?)<\/span>/g,
|
||||
'<span class="$1">$2</span>'
|
||||
);
|
||||
return new Handlebars.SafeString(result);
|
||||
});
|
||||
|
||||
})(Handlebars);
|
26
src/messenger/webim/js/source/chat/init.js
Normal file
26
src/messenger/webim/js/source/chat/init.js
Normal file
@ -0,0 +1,26 @@
|
||||
/**
|
||||
* @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 application region constructors
|
||||
*/
|
||||
Mibew.Regions = {};
|
||||
|
||||
/**
|
||||
* @namespace Holds instances of control models
|
||||
*/
|
||||
Mibew.Objects.Models.Controls = {};
|
||||
|
||||
/**
|
||||
* @namespace Holds instances of status models
|
||||
*/
|
||||
Mibew.Objects.Models.Status = {};
|
||||
|
||||
})(Mibew);
|
53
src/messenger/webim/js/source/chat/models/avatar.js
Normal file
53
src/messenger/webim/js/source/chat/models/avatar.js
Normal file
@ -0,0 +1,53 @@
|
||||
/**
|
||||
* @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, _){
|
||||
|
||||
/**
|
||||
* @class Represents agent's avatar
|
||||
*/
|
||||
Mibew.Models.Avatar = Mibew.Models.Base.extend(
|
||||
/** @lends Mibew.Models.Avatar.prototype */
|
||||
{
|
||||
/**
|
||||
* A list of default model values.
|
||||
* @type Object
|
||||
*/
|
||||
defaults : {
|
||||
/**
|
||||
* An URL of the avatar image or false by default.
|
||||
* @type String|Boolean
|
||||
*/
|
||||
imageLink: false
|
||||
},
|
||||
|
||||
/**
|
||||
* Model initializer.
|
||||
*/
|
||||
initialize: function() {
|
||||
// Register API function
|
||||
Mibew.Objects.server.registerFunction(
|
||||
'setupAvatar',
|
||||
_.bind(this.apiSetupAvatar, this)
|
||||
);
|
||||
},
|
||||
|
||||
/**
|
||||
* Set avatar
|
||||
* This is an API function.
|
||||
* @param args {Object} An object of passed arguments
|
||||
*/
|
||||
apiSetupAvatar: function(args) {
|
||||
if (args.imageLink) {
|
||||
this.set({imageLink: args.imageLink});
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
})(Mibew, _);
|
@ -0,0 +1,38 @@
|
||||
/**
|
||||
* @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){
|
||||
|
||||
/**
|
||||
* @class Base class for controls
|
||||
*/
|
||||
Mibew.Models.Control = Mibew.Models.Base.extend(
|
||||
/** @lends Mibew.Models.Control.prototype */
|
||||
{
|
||||
/**
|
||||
* A list of model default values.
|
||||
*/
|
||||
defaults : {
|
||||
|
||||
/**
|
||||
* Control title
|
||||
* @type String
|
||||
*/
|
||||
title: '',
|
||||
|
||||
/**
|
||||
* Control weight. Used for ordering controls.
|
||||
* @type Number
|
||||
*/
|
||||
weight: 0
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
})(Mibew);
|
66
src/messenger/webim/js/source/chat/models/controls/close.js
Normal file
66
src/messenger/webim/js/source/chat/models/controls/close.js
Normal file
@ -0,0 +1,66 @@
|
||||
/**
|
||||
* @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){
|
||||
|
||||
/**
|
||||
* @class Close control model
|
||||
*/
|
||||
Mibew.Models.CloseControl = Mibew.Models.Control.extend(
|
||||
/** @lends Mibew.Models.CloseControl.prototype */
|
||||
{
|
||||
/**
|
||||
* Returns model type
|
||||
* @returns {String} Model type
|
||||
*/
|
||||
getModelType: function() {
|
||||
return 'CloseControl';
|
||||
},
|
||||
|
||||
/**
|
||||
* Close chat thread at the server
|
||||
*
|
||||
* If something went wrong update status message otherwise close
|
||||
* chat window
|
||||
*
|
||||
* @todo May be move to Mibew.Thread class
|
||||
*/
|
||||
closeThread: function() {
|
||||
// Get thread and user objects
|
||||
var thread = Mibew.Objects.thread;
|
||||
var user = Mibew.Objects.Models.user;
|
||||
// Send request to the server
|
||||
Mibew.Objects.server.callFunctions(
|
||||
[{
|
||||
"function": "close",
|
||||
"arguments": {
|
||||
"references": {},
|
||||
"return": {"closed": "closed"},
|
||||
"threadId": thread.threadId,
|
||||
"token": thread.token,
|
||||
"lastId": thread.lastId,
|
||||
"user": (! user.get('isAgent'))
|
||||
}
|
||||
}],
|
||||
function(args){
|
||||
if (args.closed) {
|
||||
window.close();
|
||||
} else {
|
||||
// Something went wrong. Display error message
|
||||
Mibew.Objects.Models.Status.message.setMessage(
|
||||
args.errorMessage || 'Cannot close'
|
||||
);
|
||||
}
|
||||
},
|
||||
true
|
||||
);
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
})(Mibew);
|
@ -0,0 +1,47 @@
|
||||
/**
|
||||
* @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, _){
|
||||
|
||||
/**
|
||||
* @class History control model
|
||||
*/
|
||||
Mibew.Models.HistoryControl = Mibew.Models.Control.extend(
|
||||
/** @lends Mibew.Models.HistoryControl.prototype */
|
||||
{
|
||||
/**
|
||||
* A list of default model values.
|
||||
*
|
||||
* The model inherits defaults from
|
||||
* {@link Mibew.Models.Control.prototype.defaults}.
|
||||
* @type Object
|
||||
*/
|
||||
defaults: _.extend(
|
||||
{},
|
||||
Mibew.Models.Control.prototype.defaults,
|
||||
{
|
||||
/**
|
||||
* An URL of the History page or false by default.
|
||||
* @type String|Boolean
|
||||
*/
|
||||
link: false
|
||||
}
|
||||
),
|
||||
|
||||
/**
|
||||
* Returns model type
|
||||
* @returns {String} Model type
|
||||
*/
|
||||
getModelType: function() {
|
||||
return 'HistoryControl';
|
||||
}
|
||||
|
||||
}
|
||||
);
|
||||
|
||||
})(Mibew, _);
|
@ -0,0 +1,47 @@
|
||||
/**
|
||||
* @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, _){
|
||||
|
||||
/**
|
||||
* @class Redirect control model
|
||||
*/
|
||||
Mibew.Models.RedirectControl = Mibew.Models.Control.extend(
|
||||
/** @lends Mibew.Models.RedirectControl.prototype */
|
||||
{
|
||||
/**
|
||||
* A list of default model values.
|
||||
*
|
||||
* The model inherits defaults from
|
||||
* {@link Mibew.Models.Control.prototype.defaults}.
|
||||
* @type Object
|
||||
*/
|
||||
defaults: _.extend(
|
||||
{},
|
||||
Mibew.Models.Control.prototype.defaults,
|
||||
{
|
||||
/**
|
||||
* An URL of the Redirect page or false by default.
|
||||
* @type String|Boolean
|
||||
*/
|
||||
link: false
|
||||
}
|
||||
),
|
||||
|
||||
/**
|
||||
* Returns model type
|
||||
* @returns {String} Model type
|
||||
*/
|
||||
getModelType: function() {
|
||||
return 'RedirectControl';
|
||||
}
|
||||
|
||||
}
|
||||
);
|
||||
|
||||
})(Mibew, _);
|
@ -0,0 +1,34 @@
|
||||
/**
|
||||
* @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){
|
||||
|
||||
/**
|
||||
* @class Represent Refresh control model
|
||||
*/
|
||||
Mibew.Models.RefreshControl = Mibew.Models.Control.extend(
|
||||
/** @lends Mibew.Models.RefreshControl.prototype */
|
||||
{
|
||||
/**
|
||||
* Returns model type
|
||||
* @returns {String} Model type
|
||||
*/
|
||||
getModelType: function() {
|
||||
return 'RefreshControl';
|
||||
},
|
||||
|
||||
/**
|
||||
* Refresh message window
|
||||
*/
|
||||
refresh: function() {
|
||||
Mibew.Objects.server.restartUpdater();
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
})(Mibew);
|
@ -0,0 +1,46 @@
|
||||
/**
|
||||
* @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, _){
|
||||
|
||||
/**
|
||||
* @class Represent Secure mode control model
|
||||
*/
|
||||
Mibew.Models.SecureModeControl = Mibew.Models.Control.extend(
|
||||
/** @lends Mibew.Models.SecureModeControl.prototype */
|
||||
{
|
||||
/**
|
||||
* A list of default model values.
|
||||
*
|
||||
* The model inherits defaults from
|
||||
* {@link Mibew.Models.Control.prototype.defaults}.
|
||||
* @type Object
|
||||
*/
|
||||
defaults: _.extend(
|
||||
{},
|
||||
Mibew.Models.Control.prototype.defaults,
|
||||
{
|
||||
/**
|
||||
* An URL of the secure chat or false by default.
|
||||
* @type String|Boolean
|
||||
*/
|
||||
link: false
|
||||
}
|
||||
),
|
||||
|
||||
/**
|
||||
* Returns model type
|
||||
* @returns {String} Model type
|
||||
*/
|
||||
getModelType: function() {
|
||||
return 'SecureModeControl';
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
})(Mibew, _);
|
@ -0,0 +1,45 @@
|
||||
/**
|
||||
* @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, _){
|
||||
|
||||
/**
|
||||
* @class Represent Send mail control model
|
||||
*/
|
||||
Mibew.Models.SendMailControl = Mibew.Models.Control.extend(
|
||||
/** @lends Mibew.Models.SendMailControl.prototype */
|
||||
{
|
||||
/**
|
||||
* A list of default model values.
|
||||
*
|
||||
* The model inherits defaults from
|
||||
* {@link Mibew.Models.Control.prototype.defaults}.
|
||||
* @type Object
|
||||
*/
|
||||
defaults: _.extend(
|
||||
{},
|
||||
Mibew.Models.Control.prototype.defaults,
|
||||
{
|
||||
/**
|
||||
* An URL of the Mail page or false by default.
|
||||
* @type String|Boolean
|
||||
*/
|
||||
link: false
|
||||
}
|
||||
),
|
||||
/**
|
||||
* Returns model type
|
||||
* @returns {String} Model type
|
||||
*/
|
||||
getModelType: function() {
|
||||
return 'SendMailControl';
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
})(Mibew, _);
|
45
src/messenger/webim/js/source/chat/models/controls/sound.js
Normal file
45
src/messenger/webim/js/source/chat/models/controls/sound.js
Normal file
@ -0,0 +1,45 @@
|
||||
/**
|
||||
* @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, _){
|
||||
|
||||
/**
|
||||
* @class Represents toggle sound control model
|
||||
*/
|
||||
Mibew.Models.SoundControl = Mibew.Models.Control.extend(
|
||||
/** @lends Mibew.Models.SoundControl.prototype */
|
||||
{
|
||||
/**
|
||||
* A list of default model values.
|
||||
* The model inherits defaults from
|
||||
* {@link Mibew.Models.Control.prototype.defaults}.
|
||||
* @type Object
|
||||
*/
|
||||
defaults: _.extend(
|
||||
{},
|
||||
Mibew.Models.Control.prototype.defaults,
|
||||
{
|
||||
/**
|
||||
* Indicates if sound enable.
|
||||
* @type Boolean
|
||||
*/
|
||||
enabled: true
|
||||
}
|
||||
),
|
||||
|
||||
/**
|
||||
* Returns model type
|
||||
* @returns {String} Model type
|
||||
*/
|
||||
getModelType: function() {
|
||||
return 'SoundControl'
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
})(Mibew, _);
|
@ -0,0 +1,71 @@
|
||||
/**
|
||||
* @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){
|
||||
|
||||
/**
|
||||
* @class User name control model
|
||||
*/
|
||||
Mibew.Models.UserNameControl = Mibew.Models.Control.extend(
|
||||
/** @lends Mibew.Models.UserNameControl.prototype */
|
||||
{
|
||||
/**
|
||||
* Returns model type
|
||||
* @returns {String} Model type
|
||||
*/
|
||||
getModelType: function() {
|
||||
return 'UserNameControl';
|
||||
},
|
||||
|
||||
/**
|
||||
* Change user name at client and server sides
|
||||
* @param {String} newName New user name
|
||||
*/
|
||||
changeName: function(newName) {
|
||||
// Get thread and user objects
|
||||
var user = Mibew.Objects.Models.user;
|
||||
var thread = Mibew.Objects.thread;
|
||||
// Store old name in closure
|
||||
var oldName = user.get('name');
|
||||
// Check if name should be changed
|
||||
if (! newName || oldName == newName) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Try to change user name at the server side
|
||||
Mibew.Objects.server.callFunctions(
|
||||
[{
|
||||
"function": "rename",
|
||||
"arguments": {
|
||||
"references": {},
|
||||
"return": {},
|
||||
"threadId": thread.threadId,
|
||||
"token": thread.token,
|
||||
"name": newName
|
||||
}
|
||||
}],
|
||||
function(args){
|
||||
if (args.errorCode) {
|
||||
// Something went wrong. Show error message and
|
||||
// restore old name
|
||||
Mibew.Objects.Models.Status.message.setMessage(
|
||||
args.errorMessage || 'Cannot rename'
|
||||
);
|
||||
user.set({name: oldName});
|
||||
}
|
||||
},
|
||||
true
|
||||
);
|
||||
|
||||
// Change user name at the cient side
|
||||
user.set({name: newName});
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
})(Mibew);
|
@ -0,0 +1,30 @@
|
||||
/**
|
||||
* @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){
|
||||
|
||||
/**
|
||||
* @class Base class for message models
|
||||
*/
|
||||
Mibew.Models.Message = Mibew.Models.Base.extend(
|
||||
/** @lends Mibew.Models.Message.prototype */
|
||||
{
|
||||
/**
|
||||
* Default values of model
|
||||
*/
|
||||
defaults : {
|
||||
/**
|
||||
* Text of the message
|
||||
* @type String
|
||||
*/
|
||||
message: ''
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
})(Mibew);
|
@ -0,0 +1,79 @@
|
||||
/**
|
||||
* @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){
|
||||
|
||||
/**
|
||||
* @class Represents message form model
|
||||
*/
|
||||
Mibew.Models.MessageForm = Mibew.Models.Base.extend(
|
||||
/** @lends Mibew.Models.MessageForm.prototype */
|
||||
{
|
||||
/**
|
||||
* A list of default model values.
|
||||
* @type Object
|
||||
*/
|
||||
defaults: {
|
||||
/**
|
||||
* Array of predifined answers
|
||||
* @type Array
|
||||
*/
|
||||
predefinedAnswers: [],
|
||||
|
||||
/**
|
||||
* Indicates if Enter or Ctrl+Enter should send message
|
||||
* @type Boolean
|
||||
*/
|
||||
ignoreCtrl: false
|
||||
},
|
||||
|
||||
/**
|
||||
* Post message.
|
||||
* Send message to the server and run callback function after that.
|
||||
* @param {String} msg Message to send
|
||||
*/
|
||||
postMessage: function(msg) {
|
||||
// Get thread and user objects
|
||||
var thread = Mibew.Objects.thread;
|
||||
var user = Mibew.Objects.Models.user;
|
||||
|
||||
// Check if user can post a message
|
||||
if (! user.get('canPost')) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Triggers before post event
|
||||
this.trigger('before:post', this);
|
||||
|
||||
// Store link to the object
|
||||
var self = this;
|
||||
|
||||
// Post message to the server
|
||||
Mibew.Objects.server.callFunctions(
|
||||
[{
|
||||
"function": "post",
|
||||
"arguments": {
|
||||
"references": {},
|
||||
"return": {},
|
||||
"message": msg,
|
||||
"threadId": thread.threadId,
|
||||
"token": thread.token,
|
||||
"user": (! user.get('isAgent'))
|
||||
}
|
||||
}],
|
||||
function() {
|
||||
self.trigger('after:post', self);
|
||||
},
|
||||
true
|
||||
);
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
|
||||
})(Mibew);
|
@ -0,0 +1,83 @@
|
||||
/**
|
||||
* @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, _){
|
||||
|
||||
/**
|
||||
* @class Represents base status model
|
||||
*/
|
||||
Mibew.Models.Status = Mibew.Models.Base.extend(
|
||||
/** @lends Mibew.Models.Status */
|
||||
{
|
||||
/**
|
||||
* A list of default model values.
|
||||
* @type Object
|
||||
*/
|
||||
defaults: {
|
||||
/**
|
||||
* Indicates if status element is visible or not.
|
||||
* @type Boolean
|
||||
*/
|
||||
visible: true,
|
||||
|
||||
/**
|
||||
* Use for ordering status elements in status collection.
|
||||
* @type Number
|
||||
*/
|
||||
weight: 0,
|
||||
|
||||
/**
|
||||
* Time in milliseconds after that status message will be
|
||||
* cleaned.
|
||||
* @type Number
|
||||
*/
|
||||
hideTimeout: 4000,
|
||||
|
||||
/**
|
||||
* Title of status element.
|
||||
* @type String
|
||||
*/
|
||||
title: ''
|
||||
},
|
||||
|
||||
/**
|
||||
* Class initializer
|
||||
*/
|
||||
initialize: function () {
|
||||
/**
|
||||
* Timer for hiding status element
|
||||
*/
|
||||
this.hideTimer = null;
|
||||
},
|
||||
|
||||
/**
|
||||
* Automatically hide status element after timeout
|
||||
* @param {Number} [timeout] Timeout in milliseconds before hide
|
||||
* status element. Default value is this.get('hideTimeout').
|
||||
*/
|
||||
autoHide: function(timeout) {
|
||||
var delay = timeout || this.get('hideTimeout');
|
||||
|
||||
// Clear timer if it runs
|
||||
if (this.hideTimer) {
|
||||
clearTimeout(this.hideTimer);
|
||||
}
|
||||
|
||||
// Hide status element after a while
|
||||
this.hideTimer = setTimeout(
|
||||
_.bind(
|
||||
function(){this.set({visible: false});},
|
||||
this
|
||||
),
|
||||
delay
|
||||
);
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
})(Mibew, _);
|
66
src/messenger/webim/js/source/chat/models/status/message.js
Normal file
66
src/messenger/webim/js/source/chat/models/status/message.js
Normal file
@ -0,0 +1,66 @@
|
||||
/**
|
||||
* @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, _){
|
||||
|
||||
/**
|
||||
* @class Represents status message model
|
||||
*/
|
||||
Mibew.Models.StatusMessage = Mibew.Models.Status.extend(
|
||||
/** @lends Mibew.Models.StatusMessage.prototype */
|
||||
{
|
||||
/**
|
||||
* A list of default model values.
|
||||
* The model inherits defaults from
|
||||
* {@link Mibew.Models.Status.prototype.defaults}.
|
||||
* @type Object
|
||||
*/
|
||||
defaults: _.extend(
|
||||
{},
|
||||
Mibew.Models.Status.prototype.defaults,
|
||||
{
|
||||
/**
|
||||
* Text of the status message.
|
||||
* @type String
|
||||
*/
|
||||
message: '',
|
||||
|
||||
/**
|
||||
* Indicates if status message is visible or not.
|
||||
* @type Boolean
|
||||
*/
|
||||
visible: false
|
||||
}
|
||||
),
|
||||
|
||||
/**
|
||||
* Returns model type
|
||||
* @returns {String} Model type
|
||||
*/
|
||||
getModelType: function() {
|
||||
return 'StatusMessage'
|
||||
},
|
||||
|
||||
/**
|
||||
* Update status message
|
||||
* @param {String} msg New status message
|
||||
*/
|
||||
setMessage: function(msg) {
|
||||
// Update status message
|
||||
this.set({
|
||||
message: msg,
|
||||
visible: true
|
||||
});
|
||||
|
||||
// Hide status message after a while
|
||||
this.autoHide();
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
})(Mibew, _);
|
65
src/messenger/webim/js/source/chat/models/status/typing.js
Normal file
65
src/messenger/webim/js/source/chat/models/status/typing.js
Normal file
@ -0,0 +1,65 @@
|
||||
/**
|
||||
* @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, _){
|
||||
|
||||
/**
|
||||
* @class Represents typing status model
|
||||
*/
|
||||
Mibew.Models.StatusTyping = Mibew.Models.Status.extend(
|
||||
/** @lends Mibew.Models.StatusTyping.prototype */
|
||||
{
|
||||
/**
|
||||
* A list of default model values.
|
||||
*
|
||||
* The model inherits defaults from
|
||||
* {@link Mibew.Models.Status.prototype.defaults}.
|
||||
* @type Object
|
||||
*/
|
||||
defaults: _.extend(
|
||||
{},
|
||||
Mibew.Models.Status.prototype.defaults,
|
||||
{
|
||||
/**
|
||||
* Indicates if status element is visible or not.
|
||||
* @type Boolean
|
||||
*/
|
||||
visible: false,
|
||||
|
||||
/**
|
||||
* Time in milliseconds after that status message will be
|
||||
* cleaned.
|
||||
* @type Number
|
||||
*/
|
||||
hideTimeout: 2000
|
||||
}
|
||||
),
|
||||
|
||||
/**
|
||||
* Returns model type
|
||||
* @returns {String} Model type
|
||||
*/
|
||||
getModelType: function() {
|
||||
return 'StatusTyping'
|
||||
},
|
||||
|
||||
/**
|
||||
* Make the status element visible
|
||||
* @todo May be move it to the view!?
|
||||
*/
|
||||
show: function() {
|
||||
// Make typing status visible
|
||||
this.set({visible: true});
|
||||
|
||||
// Hide it after a while
|
||||
this.autoHide();
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
})(Mibew, _);
|
42
src/messenger/webim/js/source/chat/regions/messages.js
Normal file
42
src/messenger/webim/js/source/chat/regions/messages.js
Normal file
@ -0,0 +1,42 @@
|
||||
/**
|
||||
* @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, Backbone){
|
||||
|
||||
/**
|
||||
* @class Represents Messages region
|
||||
*/
|
||||
Mibew.Regions.Messages = Backbone.Marionette.Region.extend(
|
||||
/** @lends Mibew.Regions.Message */
|
||||
{
|
||||
/**
|
||||
* DOM element for the region
|
||||
* @type String
|
||||
*/
|
||||
el: '#messages-region',
|
||||
|
||||
/**
|
||||
* Show view event handler. Register handler to view's
|
||||
* 'after:item:added' event.
|
||||
* @param {Backbone.Marionette.ItemView} view View to show in region
|
||||
*/
|
||||
onShow: function(view) {
|
||||
view.on('after:item:added', this.scrollToBottom, this);
|
||||
},
|
||||
|
||||
/**
|
||||
* Scroll region to bottom.
|
||||
*/
|
||||
scrollToBottom: function() {
|
||||
this.$el.scrollTop(this.$el.prop('scrollHeight'));
|
||||
}
|
||||
|
||||
}
|
||||
);
|
||||
|
||||
})(Mibew, Backbone);
|
39
src/messenger/webim/js/source/chat/views/avatar.js
Normal file
39
src/messenger/webim/js/source/chat/views/avatar.js
Normal file
@ -0,0 +1,39 @@
|
||||
/**
|
||||
* @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, Backbone, Handlebars) {
|
||||
|
||||
/**
|
||||
* @class Represents user avatar view
|
||||
*/
|
||||
Mibew.Views.Avatar = Backbone.Marionette.ItemView.extend(
|
||||
/** @lends Mibew.Views.Avatar.prototype */
|
||||
{
|
||||
/**
|
||||
* Template function
|
||||
* @type Function
|
||||
*/
|
||||
template: Handlebars.templates.avatar,
|
||||
|
||||
/**
|
||||
* Class name for view's DOM element
|
||||
* @type String
|
||||
*/
|
||||
className: 'avatar',
|
||||
|
||||
/**
|
||||
* Map model events to the view methods
|
||||
* @type Object
|
||||
*/
|
||||
modelEvents: {
|
||||
'change': 'render'
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
})(Mibew, Backbone, Handlebars);
|
@ -0,0 +1,110 @@
|
||||
/**
|
||||
* @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, Backbone, Handlebars) {
|
||||
|
||||
/**
|
||||
* @class Represents default control. Implement some basic functionality.
|
||||
*/
|
||||
Mibew.Views.Control = Backbone.Marionette.ItemView.extend(
|
||||
/** @lends Mibew.Views.Control.prototype */
|
||||
{
|
||||
/**
|
||||
* Template function
|
||||
* @type Function
|
||||
*/
|
||||
template: Handlebars.templates.control,
|
||||
|
||||
/**
|
||||
* Map model events to the view methods
|
||||
* @type Object
|
||||
*/
|
||||
modelEvents: {
|
||||
'change': 'render'
|
||||
},
|
||||
/**
|
||||
* Map ui events to view methods. Use as default for all child
|
||||
* views.
|
||||
* @type Object
|
||||
*/
|
||||
events: {
|
||||
'mouseover': 'mouseOver',
|
||||
'mouseleave': 'mouseLeave'
|
||||
},
|
||||
|
||||
/**
|
||||
* Generate hash of view's DOM element attributes. Add default CSS
|
||||
* classes whose names based on the result of model's 'getModelType'
|
||||
* method.
|
||||
*/
|
||||
attributes: function() {
|
||||
// Init classes list
|
||||
var classes = [];
|
||||
|
||||
// Add default for all controls CSS class
|
||||
classes.push('control');
|
||||
|
||||
// Add CSS class from className properti of the view
|
||||
if (this.className) {
|
||||
classes.push(this.className);
|
||||
// Prevent using className property instead of result of
|
||||
// this method
|
||||
this.className = '';
|
||||
}
|
||||
|
||||
// Add CSS class based on model type
|
||||
var controlType = this.getDashedControlType();
|
||||
if (controlType) {
|
||||
classes.push(controlType);
|
||||
}
|
||||
return {
|
||||
'class': classes.join(' ')
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Handles mouse over event on the control. Add 'active' CSS class
|
||||
* to the view's DOM element.
|
||||
*/
|
||||
mouseOver: function() {
|
||||
var controlType = this.getDashedControlType();
|
||||
this.$el.addClass(
|
||||
'active' +
|
||||
(controlType ? '-' + controlType : '' )
|
||||
);
|
||||
},
|
||||
|
||||
/**
|
||||
* Handles mouse leave event on the control. Remove 'active' CSS
|
||||
* class from the view's DOM element.
|
||||
*/
|
||||
mouseLeave: function() {
|
||||
var controlType = this.getDashedControlType();
|
||||
this.$el.removeClass(
|
||||
'active' +
|
||||
(controlType ? '-' + controlType : '' )
|
||||
);
|
||||
},
|
||||
|
||||
/**
|
||||
* Create dasherized version of the model type or use cached one.
|
||||
* @returns {Strring} Model type
|
||||
*/
|
||||
getDashedControlType: function() {
|
||||
if (typeof this.dashedControlType == 'undefined') {
|
||||
// There is no control type in the cache
|
||||
this.dashedControlType = Mibew.Utils.toDashFormat(
|
||||
this.model.getModelType()
|
||||
) || '';
|
||||
}
|
||||
return this.dashedControlType;
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
})(Mibew, Backbone, Handlebars);
|
53
src/messenger/webim/js/source/chat/views/controls/close.js
Normal file
53
src/messenger/webim/js/source/chat/views/controls/close.js
Normal file
@ -0,0 +1,53 @@
|
||||
/**
|
||||
* @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, Handlebars, _) {
|
||||
|
||||
/**
|
||||
* @class Represents Close control view
|
||||
*/
|
||||
Mibew.Views.CloseControl = Mibew.Views.Control.extend(
|
||||
/** @lends Mibew.Views.CloseControl.prototype */
|
||||
{
|
||||
/**
|
||||
* Template function
|
||||
* @type Function
|
||||
*/
|
||||
template: Handlebars.templates.close_control,
|
||||
|
||||
/**
|
||||
* Map ui events to view methods
|
||||
* The view inherits events from
|
||||
* {@link Mibew.Views.Control.prototype.events}.
|
||||
* @type Object
|
||||
*/
|
||||
events: _.extend(
|
||||
{},
|
||||
Mibew.Views.Control.prototype.events,
|
||||
{
|
||||
'click': 'close'
|
||||
}
|
||||
),
|
||||
|
||||
/**
|
||||
* Display confirmation dialog and close chat window
|
||||
*/
|
||||
close: function() {
|
||||
// Show confirmation message if can
|
||||
var confirmMessage = Mibew.Localization.get('chat.close.confirmation');
|
||||
if (confirmMessage !== false) {
|
||||
if (! confirm(confirmMessage)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
this.model.closeThread();
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
})(Mibew, Handlebars, _);
|
@ -0,0 +1,31 @@
|
||||
/**
|
||||
* @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) {
|
||||
|
||||
/**
|
||||
* @class Represents controls bar
|
||||
*/
|
||||
Mibew.Views.ControlsCollection = Mibew.Views.CollectionBase.extend(
|
||||
/** @lends Mibew.Views.ControlsCollection.prototype */
|
||||
{
|
||||
/**
|
||||
* Default item view constructor.
|
||||
* @type Function
|
||||
*/
|
||||
itemView: Mibew.Views.Control,
|
||||
|
||||
/**
|
||||
* Class name for view's DOM element
|
||||
* @type String
|
||||
*/
|
||||
className: 'controls-collection'
|
||||
}
|
||||
);
|
||||
|
||||
})(Mibew);
|
63
src/messenger/webim/js/source/chat/views/controls/history.js
Normal file
63
src/messenger/webim/js/source/chat/views/controls/history.js
Normal file
@ -0,0 +1,63 @@
|
||||
/**
|
||||
* @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, Handlebars, _) {
|
||||
|
||||
/**
|
||||
* @class Represents History control view
|
||||
*/
|
||||
Mibew.Views.HistoryControl = Mibew.Views.Control.extend(
|
||||
/** @lends Mibew.Views.HistoryControl.prototype */
|
||||
{
|
||||
/**
|
||||
* Template function
|
||||
* @type Function
|
||||
*/
|
||||
template: Handlebars.templates.history_control,
|
||||
|
||||
/**
|
||||
* Map ui events to view methods
|
||||
* The view inherits events from
|
||||
* {@link Mibew.Views.Control.prototype.events}.
|
||||
* @type Object
|
||||
*/
|
||||
events: _.extend(
|
||||
{},
|
||||
Mibew.Views.Control.prototype.events,
|
||||
{
|
||||
'click': 'showHistory'
|
||||
}
|
||||
),
|
||||
|
||||
/**
|
||||
* Dispalay history window
|
||||
*/
|
||||
showHistory: function() {
|
||||
var user = Mibew.Objects.Models.user;
|
||||
var link = this.model.get('link');
|
||||
if (user.get('isAgent') && link) {
|
||||
// TODO: Create wiki docs for it
|
||||
var winParams = this.$el
|
||||
.find('.control-config')
|
||||
.eq(0)
|
||||
.data('win-params');
|
||||
|
||||
// TODO: Kill & at the server side
|
||||
link = link.replace('&', '&', 'g');
|
||||
|
||||
var newWindow = window.open(link, 'UserHistory', winParams);
|
||||
if (newWindow !== null) {
|
||||
newWindow.focus();
|
||||
newWindow.opener=window;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
})(Mibew, Handlebars, _);
|
@ -0,0 +1,73 @@
|
||||
/**
|
||||
* @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, Handlebars, _) {
|
||||
|
||||
/**
|
||||
* @class Represents Redirect control view
|
||||
*/
|
||||
Mibew.Views.RedirectControl = Mibew.Views.Control.extend(
|
||||
/** @lends Mibew.Views.RedirectControl.prototype */
|
||||
{
|
||||
/**
|
||||
* Template function
|
||||
* @type Function
|
||||
*/
|
||||
template: Handlebars.templates.redirect_control,
|
||||
|
||||
/**
|
||||
* Map ui events to view methods
|
||||
* The view inherits events from
|
||||
* {@link Mibew.Views.Control.prototype.events}.
|
||||
* @type Object
|
||||
*/
|
||||
events: _.extend(
|
||||
{},
|
||||
Mibew.Views.Control.prototype.events,
|
||||
{
|
||||
'click': 'redirect'
|
||||
}
|
||||
),
|
||||
|
||||
/**
|
||||
* View initializer.
|
||||
*/
|
||||
initialize: function() {
|
||||
Mibew.Objects.Models.user.on('change', this.render, this);
|
||||
},
|
||||
|
||||
/**
|
||||
* Override Backbone.Marionette.ItemView.serializeData to pass some
|
||||
* extra fields to template.
|
||||
* @returns {Object} Template data
|
||||
*/
|
||||
serializeData: function() {
|
||||
var data = this.model.toJSON();
|
||||
data.user = Mibew.Objects.Models.user.toJSON();
|
||||
return data;
|
||||
},
|
||||
|
||||
/**
|
||||
* Display user redirection window
|
||||
*/
|
||||
redirect: function() {
|
||||
var user = Mibew.Objects.Models.user;
|
||||
if (user.get('isAgent') && user.get('canPost')) {
|
||||
var link = this.model.get('link');
|
||||
if (link) {
|
||||
// Redirect browser to user redirection page
|
||||
var style = Mibew.Objects.Models.page.get('style');
|
||||
window.location.href = link.replace(/\&\;/g, '&')
|
||||
+ (style ? ('&style=' + style) : '');
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
})(Mibew, Handlebars, _);
|
46
src/messenger/webim/js/source/chat/views/controls/refresh.js
Normal file
46
src/messenger/webim/js/source/chat/views/controls/refresh.js
Normal file
@ -0,0 +1,46 @@
|
||||
/**
|
||||
* @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, Handlebars, _) {
|
||||
|
||||
/**
|
||||
* @class Represents Refresh control View
|
||||
*/
|
||||
Mibew.Views.RefreshControl = Mibew.Views.Control.extend(
|
||||
/** @lends Mibew.Views.RefreshControl.prototype */
|
||||
{
|
||||
/**
|
||||
* Template function
|
||||
* @type Function
|
||||
*/
|
||||
template: Handlebars.templates.refresh_control,
|
||||
|
||||
/**
|
||||
* Map ui events to view methods
|
||||
* The view inherits events from
|
||||
* {@link Mibew.Views.Control.prototype.events}.
|
||||
* @type Object
|
||||
*/
|
||||
events: _.extend(
|
||||
{},
|
||||
Mibew.Views.Control.prototype.events,
|
||||
{
|
||||
'click': 'refresh'
|
||||
}
|
||||
),
|
||||
|
||||
/**
|
||||
* Refresh chat window via model's refresh method
|
||||
*/
|
||||
refresh: function() {
|
||||
this.model.refresh();
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
})(Mibew, Handlebars, _);
|
@ -0,0 +1,51 @@
|
||||
/**
|
||||
* @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, Handlebars, _) {
|
||||
|
||||
/**
|
||||
* @class Represents Secure mode control View
|
||||
*/
|
||||
Mibew.Views.SecureModeControl = Mibew.Views.Control.extend(
|
||||
/** @lends Mibew.Views.SecureModeControl.prototype */
|
||||
{
|
||||
/**
|
||||
* Template function
|
||||
* @type Function
|
||||
*/
|
||||
template: Handlebars.templates.secure_mode_control,
|
||||
|
||||
/**
|
||||
* Map ui events to view methods
|
||||
* The view inherits events from
|
||||
* {@link Mibew.Views.Control.prototype.events}.
|
||||
* @type Object
|
||||
*/
|
||||
events: _.extend(
|
||||
{},
|
||||
Mibew.Views.Control.prototype.events,
|
||||
{
|
||||
'click': 'secure'
|
||||
}
|
||||
),
|
||||
|
||||
/**
|
||||
* Move to secure chat
|
||||
*/
|
||||
secure: function() {
|
||||
var link = this.model.get('link')
|
||||
if (link) {
|
||||
var style = Mibew.Objects.Models.page.get('style');
|
||||
window.location.href = link.replace(/\&\;/g, '&')
|
||||
+ (style ? ('&style=' + style) : '');
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
})(Mibew, Handlebars, _);
|
@ -0,0 +1,65 @@
|
||||
/**
|
||||
* @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, Handlebars, _) {
|
||||
|
||||
/**
|
||||
* @class Represents Send mail control View
|
||||
*/
|
||||
Mibew.Views.SendMailControl = Mibew.Views.Control.extend(
|
||||
/** @lends Mibew.Views.SendMailControl.prototype */
|
||||
{
|
||||
/**
|
||||
* Template function
|
||||
* @type Function
|
||||
*/
|
||||
template: Handlebars.templates.send_mail_control,
|
||||
|
||||
/**
|
||||
* Map ui events to view methods
|
||||
* The view inherits events from
|
||||
* {@link Mibew.Views.Control.prototype.events}.
|
||||
* @type Object
|
||||
*/
|
||||
events: _.extend(
|
||||
{},
|
||||
Mibew.Views.Control.prototype.events,
|
||||
{
|
||||
'click': 'sendMail'
|
||||
}
|
||||
),
|
||||
|
||||
/**
|
||||
* Load and display send mail window
|
||||
*/
|
||||
sendMail: function() {
|
||||
var link = this.model.get('link')
|
||||
if (link) {
|
||||
// TODO: Create wiki docs for it
|
||||
var winParams = this.$el
|
||||
.find('.control-config')
|
||||
.eq(0)
|
||||
.data('win-params');
|
||||
|
||||
var style = Mibew.Objects.Models.page.get('style');
|
||||
|
||||
// TODO: Kill & at the server side
|
||||
link = link.replace(/\&\;/g, '&')
|
||||
+ (style ? ('&style=' + style) : '');
|
||||
|
||||
var newWindow = window.open(link, 'ForwardMail', winParams);
|
||||
if (newWindow !== null) {
|
||||
newWindow.focus();
|
||||
newWindow.opener=window;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
})(Mibew, Handlebars, _);
|
48
src/messenger/webim/js/source/chat/views/controls/sound.js
Normal file
48
src/messenger/webim/js/source/chat/views/controls/sound.js
Normal file
@ -0,0 +1,48 @@
|
||||
/**
|
||||
* @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, Handlebars, _) {
|
||||
|
||||
/**
|
||||
* @class Represents cound control view
|
||||
*/
|
||||
Mibew.Views.SoundControl = Mibew.Views.Control.extend(
|
||||
/** @lends Mibew.Views.SoundControl.prototype */
|
||||
{
|
||||
/**
|
||||
* Template function
|
||||
* @type Function
|
||||
*/
|
||||
template: Handlebars.templates.sound_control,
|
||||
|
||||
/**
|
||||
* Map ui events to view methods
|
||||
* The view inherits events from
|
||||
* {@link Mibew.Views.Control.prototype.events}.
|
||||
* @type Object
|
||||
*/
|
||||
events: _.extend(
|
||||
{},
|
||||
Mibew.Views.Control.prototype.events,
|
||||
{
|
||||
'click': 'toggle'
|
||||
}
|
||||
),
|
||||
|
||||
/**
|
||||
* Toggle sound state
|
||||
*/
|
||||
toggle: function() {
|
||||
this.model.set({
|
||||
enabled: !this.model.get('enabled')
|
||||
});
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
})(Mibew, Handlebars, _);
|
109
src/messenger/webim/js/source/chat/views/controls/user_name.js
Normal file
109
src/messenger/webim/js/source/chat/views/controls/user_name.js
Normal file
@ -0,0 +1,109 @@
|
||||
/**
|
||||
* @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, Handlebars, _) {
|
||||
|
||||
Mibew.Views.UserNameControl = Mibew.Views.Control.extend(
|
||||
/** @lends Mibew.Views.UserNameControl.prototype */
|
||||
{
|
||||
/**
|
||||
* Template function
|
||||
* @type Function
|
||||
*/
|
||||
template: Handlebars.templates.user_name_control,
|
||||
|
||||
/**
|
||||
* Map ui events to view methods
|
||||
* The view inherits events from
|
||||
* {@link Mibew.Views.Control.prototype.events}.
|
||||
* @type Object
|
||||
*/
|
||||
events: _.extend(
|
||||
{},
|
||||
Mibew.Views.Control.prototype.events,
|
||||
{
|
||||
'click .user-name-control-set': 'changeName',
|
||||
'click .user-name-control-change': 'showNameInput',
|
||||
'keydown #user-name-control-input': 'inputKeyDown'
|
||||
}
|
||||
),
|
||||
|
||||
/**
|
||||
* Define shortcuts for ui elements
|
||||
* @type Object
|
||||
*/
|
||||
ui: {
|
||||
'nameInput': '#user-name-control-input'
|
||||
},
|
||||
|
||||
/**
|
||||
* View initializer
|
||||
*/
|
||||
initialize: function() {
|
||||
// Hide name input on every user name change
|
||||
Mibew.Objects.Models.user.on(
|
||||
'change:name',
|
||||
this.hideNameInput,
|
||||
this
|
||||
);
|
||||
|
||||
// Show or hide name input by default
|
||||
this.nameInput = Mibew.Objects.Models.user.get('defaultName');
|
||||
},
|
||||
|
||||
/**
|
||||
* Override Backbone.Marionette.ItemView.serializeData to pass some
|
||||
* extra fields to template.
|
||||
* @returns {Object} Template data
|
||||
*/
|
||||
serializeData: function() {
|
||||
var data = this.model.toJSON();
|
||||
data.user = Mibew.Objects.Models.user.toJSON();
|
||||
data.nameInput = this.nameInput;
|
||||
return data;
|
||||
},
|
||||
|
||||
/**
|
||||
* Handles key down event on the name input
|
||||
* @param {Event} e Event object
|
||||
*/
|
||||
inputKeyDown: function(e) {
|
||||
var key = e.which;
|
||||
if (key == 13 || key == 10) {
|
||||
// Change name after Enter key pressed
|
||||
this.changeName();
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Hide name input and rerender the view
|
||||
*/
|
||||
hideNameInput: function() {
|
||||
this.nameInput = false;
|
||||
this.render();
|
||||
},
|
||||
|
||||
/**
|
||||
* Show name input and rerender the view
|
||||
*/
|
||||
showNameInput: function() {
|
||||
this.nameInput = true;
|
||||
this.render();
|
||||
},
|
||||
|
||||
/**
|
||||
* Change user name
|
||||
*/
|
||||
changeName: function () {
|
||||
var newName = this.ui.nameInput.val();
|
||||
this.model.changeName(newName);
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
})(Mibew, Handlebars, _);
|
150
src/messenger/webim/js/source/chat/views/messages/message.js
Normal file
150
src/messenger/webim/js/source/chat/views/messages/message.js
Normal file
@ -0,0 +1,150 @@
|
||||
/**
|
||||
* @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, Backbone, Handlebars) {
|
||||
|
||||
/**
|
||||
* List of replacements pairs
|
||||
* @type Object
|
||||
* @private
|
||||
*/
|
||||
var badCharList = {
|
||||
"<": "<",
|
||||
">": ">",
|
||||
"&": "&",
|
||||
'"': """,
|
||||
"'": "'",
|
||||
"`": "`"
|
||||
}
|
||||
|
||||
/**
|
||||
* Regular expression for characters that must be replaced by HTML entities
|
||||
* @type RegExp
|
||||
* @private
|
||||
*/
|
||||
var badCharRegEx = /[&<>'"`]/g;
|
||||
|
||||
/**
|
||||
* @class Represents default message view
|
||||
*/
|
||||
Mibew.Views.Message = Backbone.Marionette.ItemView.extend(
|
||||
/** @lends Mibew.Views.Message.prototype */
|
||||
{
|
||||
/**
|
||||
* Template function
|
||||
* @type Function
|
||||
*/
|
||||
template: Handlebars.templates.message,
|
||||
|
||||
/**
|
||||
* Class name for view's DOM element
|
||||
* @type String
|
||||
*/
|
||||
className: 'message',
|
||||
|
||||
/**
|
||||
* Map model events to the view methods
|
||||
* @type Object
|
||||
*/
|
||||
modelEvents: {
|
||||
'change': 'render'
|
||||
},
|
||||
|
||||
/**
|
||||
* Override Backbone.Marionette.ItemView.serializeData to pass some
|
||||
* extra fields to template.
|
||||
* @returns {Object} Template data
|
||||
*/
|
||||
serializeData: function() {
|
||||
var msg = this.model.toJSON();
|
||||
var messageKind = this.model.get('kind');
|
||||
|
||||
// Add message fields
|
||||
msg.allowFormatting = (messageKind != this.KIND_USER
|
||||
&& messageKind != this.KIND_AGENT);
|
||||
msg.kindName = this.kindToString(messageKind);
|
||||
msg.message = this.escapeString(msg.message);
|
||||
|
||||
return msg;
|
||||
},
|
||||
|
||||
/**
|
||||
* Map message kide code to kind name
|
||||
* @param {Number} kind Kind code
|
||||
* @returns {String} Kind name
|
||||
*/
|
||||
kindToString: function(kind) {
|
||||
if (kind == this.KIND_USER) {
|
||||
return "user";
|
||||
}
|
||||
if (kind == this.KIND_AGENT) {
|
||||
return "agent";
|
||||
}
|
||||
if (kind == this.KIND_FOR_AGENT) {
|
||||
return "hidden";
|
||||
}
|
||||
if (kind == this.KIND_INFO) {
|
||||
return "inf";
|
||||
}
|
||||
if (kind == this.KIND_CONN) {
|
||||
return "conn";
|
||||
}
|
||||
if (kind == this.KIND_EVENTS) {
|
||||
return "event";
|
||||
}
|
||||
return "";
|
||||
},
|
||||
|
||||
/**
|
||||
* Replace HTML special characters('<', '>', '&', "'", '"', '`') by
|
||||
* corresponding HTML entities.
|
||||
*
|
||||
* @param {String} str Unescaped string
|
||||
* @returns {String} Escaped string
|
||||
*/
|
||||
escapeString: function(str) {
|
||||
return str.replace(
|
||||
badCharRegEx,
|
||||
function(chr) {
|
||||
return badCharList[chr] || "&";
|
||||
}
|
||||
);
|
||||
},
|
||||
|
||||
/** Message kind constants */
|
||||
|
||||
/** Message sent by user. */
|
||||
KIND_USER: 1,
|
||||
|
||||
/** Message sent by operator */
|
||||
KIND_AGENT: 2,
|
||||
|
||||
/** Hidden system message to operator */
|
||||
KIND_FOR_AGENT: 3,
|
||||
|
||||
/** System messages for user and operator */
|
||||
KIND_INFO: 4,
|
||||
|
||||
/** Message for user if operator have connection problems */
|
||||
KIND_CONN: 5,
|
||||
|
||||
/** System message about some events (like rename). */
|
||||
KIND_EVENTS: 6,
|
||||
|
||||
/**
|
||||
* Message with operators avatar
|
||||
*
|
||||
* This kind of message leaved only for compatibility with core
|
||||
*/
|
||||
KIND_AVATAR: 7
|
||||
|
||||
/** End of message kind constants */
|
||||
}
|
||||
);
|
||||
|
||||
})(Mibew, Backbone, Handlebars);
|
@ -0,0 +1,199 @@
|
||||
/**
|
||||
* @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, Backbone, Handlebars) {
|
||||
|
||||
/**
|
||||
* @class Represents Message Processor View
|
||||
*/
|
||||
Mibew.Views.MessageForm = Backbone.Marionette.ItemView.extend(
|
||||
/** @lends Mibew.Views.MessageForm.prototype */
|
||||
{
|
||||
/**
|
||||
* Template function
|
||||
* @type Function
|
||||
*/
|
||||
template: Handlebars.templates.message_form,
|
||||
|
||||
/**
|
||||
* UI events hash.
|
||||
* Map UI events on the view methods.
|
||||
* @type Object
|
||||
*/
|
||||
events: {
|
||||
'click #send-message': 'postMessage',
|
||||
'keydown #message-input': 'messageKeyDown',
|
||||
'keyup #message-input': 'checkUserTyping',
|
||||
'change #message-input': 'checkUserTyping',
|
||||
'change #predefined': 'selectPredefinedAnswer',
|
||||
'focus #message-input': 'setFocus',
|
||||
'blur #message-input': 'dropFocus'
|
||||
},
|
||||
|
||||
/**
|
||||
* Map model events to the view methods
|
||||
* @type Object
|
||||
*/
|
||||
modelEvents: {
|
||||
'change': 'render'
|
||||
},
|
||||
|
||||
/**
|
||||
* Shortcuts for ui elements
|
||||
* @type Object
|
||||
*/
|
||||
ui: {
|
||||
message: '#message-input',
|
||||
send: '#send-message',
|
||||
predefinedAnswer: '#predefined'
|
||||
},
|
||||
|
||||
/**
|
||||
* View initializer.
|
||||
*/
|
||||
initialize: function() {
|
||||
Mibew.Objects.Models.user.on('change:canPost', this.render, this);
|
||||
},
|
||||
|
||||
/**
|
||||
* Override Backbone.Marionette.ItemView.serializeData to pass some
|
||||
* extra fields to template.
|
||||
* @returns {Object} Template data
|
||||
*/
|
||||
serializeData: function() {
|
||||
var data = this.model.toJSON();
|
||||
data.user = Mibew.Objects.Models.user.toJSON();
|
||||
return data;
|
||||
},
|
||||
|
||||
/**
|
||||
* Get, check and post message
|
||||
*/
|
||||
postMessage: function() {
|
||||
var msg = this.ui.message.val();
|
||||
// TODO: Think about it
|
||||
// Cut multiple line breaks
|
||||
//msg = msg.replace(/(\r\n|\n|\r)+$/,"\n");
|
||||
if (msg != '') {
|
||||
this.disableInput();
|
||||
this.model.postMessage(msg);
|
||||
}
|
||||
Mibew.Objects.Collections.messages.on(
|
||||
'multiple:add',
|
||||
this.postMessageComplete,
|
||||
this
|
||||
);
|
||||
},
|
||||
|
||||
/**
|
||||
* Handler of key down event on the message input. Send message if
|
||||
* Enter/Ctrl+Enter pressed.
|
||||
*/
|
||||
messageKeyDown: function(e) {
|
||||
var key = e.which;
|
||||
var ctrl = e.ctrlKey;
|
||||
// Keycode of Enter key is '10' for Mac and '13' for other
|
||||
// systems.
|
||||
// There is no traditional Ctrl key on Mac.
|
||||
if ((key == 13 && (ctrl || this.model.get('ignoreCtrl'))) || key == 10) {
|
||||
this.postMessage();
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Enable message input area
|
||||
*/
|
||||
enableInput: function() {
|
||||
this.ui.message.removeAttr('disabled');
|
||||
},
|
||||
|
||||
/**
|
||||
* Disable message input area
|
||||
*/
|
||||
disableInput: function() {
|
||||
this.ui.message.attr('disabled', 'disabled');
|
||||
},
|
||||
|
||||
/**
|
||||
* Clear message input area
|
||||
*/
|
||||
clearInput: function() {
|
||||
this.ui.message
|
||||
// Set empty value
|
||||
.val('')
|
||||
// And manually trigger change event
|
||||
.change();
|
||||
},
|
||||
|
||||
/**
|
||||
* Callback function for message post.
|
||||
* Clear input area and enable it.
|
||||
*/
|
||||
postMessageComplete: function() {
|
||||
this.clearInput();
|
||||
this.enableInput();
|
||||
if (this.focused) {
|
||||
this.ui.focus();
|
||||
}
|
||||
Mibew.Objects.Collections.messages.off(
|
||||
'multiple:add',
|
||||
this.postMessageComplete,
|
||||
this
|
||||
);
|
||||
},
|
||||
|
||||
/**
|
||||
* Set message to selected predefined answer and reset predefined
|
||||
* answer selectbox.
|
||||
*/
|
||||
selectPredefinedAnswer: function() {
|
||||
var message = this.ui.message;
|
||||
var answer = this.ui.predefinedAnswer;
|
||||
var index = answer.get(0).selectedIndex;
|
||||
// Index should be set and not equals to zero
|
||||
if (index) {
|
||||
// Set message
|
||||
message
|
||||
// Set new value
|
||||
.val(this.model.get('predefinedAnswers')[index-1].full)
|
||||
// And manually trigger change event
|
||||
.change();
|
||||
message.focus();
|
||||
// Reset predefined answer selector
|
||||
answer.get(0).selectedIndex = 0;
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Check if user typing and update user info
|
||||
*/
|
||||
checkUserTyping: function() {
|
||||
var user = Mibew.Objects.Models.user;
|
||||
var isTyping = (this.ui.message.val() != '');
|
||||
if (isTyping != user.get('typing')) {
|
||||
user.set({typing: isTyping});
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Set focus indicator
|
||||
*/
|
||||
setFocus: function() {
|
||||
this.focused = true
|
||||
},
|
||||
|
||||
/**
|
||||
* Unset focus indicator
|
||||
*/
|
||||
dropFocus: function() {
|
||||
this.focused = false;
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
})(Mibew, Backbone, Handlebars);
|
@ -0,0 +1,76 @@
|
||||
/**
|
||||
* @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) {
|
||||
|
||||
/**
|
||||
* @class Represents messages list view
|
||||
*/
|
||||
Mibew.Views.MessagesCollection = Mibew.Views.CollectionBase.extend(
|
||||
/** @lends Mibew.Views.MessagesCollection.prototype */
|
||||
{
|
||||
/**
|
||||
* Default item view constructor.
|
||||
* @type Function
|
||||
*/
|
||||
itemView: Mibew.Views.Message,
|
||||
|
||||
/**
|
||||
* Class name for view's DOM element
|
||||
* @type String
|
||||
*/
|
||||
className: 'messages-collection',
|
||||
|
||||
/**
|
||||
* View initializer.
|
||||
*/
|
||||
initialize: function() {
|
||||
this.collection.on('multiple:add', this.messagesAdded, this);
|
||||
Mibew.Objects.Models.messageForm.on(
|
||||
'before:post',
|
||||
this.messagePost,
|
||||
this
|
||||
);
|
||||
},
|
||||
|
||||
/**
|
||||
* Indicates if next sound should be skipped
|
||||
* @type Boolean
|
||||
*/
|
||||
skipNextSound: true,
|
||||
|
||||
/**
|
||||
* Messages form 'after:post' event handler. Disable next sound.
|
||||
*/
|
||||
messagePost: function() {
|
||||
this.skipNextSound = true;
|
||||
},
|
||||
|
||||
/**
|
||||
* Messages collection 'add:all' event handler. Try to play sound
|
||||
* about new message
|
||||
*/
|
||||
messagesAdded: function() {
|
||||
if (! this.skipNextSound) {
|
||||
// Check if sound disabled by user via sound control
|
||||
if (Mibew.Objects.Models.Controls.sound.get('enabled')) {
|
||||
// Build sound path
|
||||
var path = Mibew.Objects.Models.page.get('webimRoot');
|
||||
if (path) {
|
||||
path += '/sounds/new_message.wav';
|
||||
// Play sound
|
||||
Mibew.Objects.Models.sound.play(path);
|
||||
}
|
||||
}
|
||||
}
|
||||
this.skipNextSound = false;
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
})(Mibew);
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user