Update Chat JavaScript Application

Make prechat survey and leave message parts of the Chat
JavaScript Application
This commit is contained in:
Dmitriy Simushev 2013-02-26 10:19:26 +00:00
parent 9436b486f9
commit a570ed75d0
54 changed files with 1967 additions and 659 deletions

View File

@ -47,8 +47,6 @@ if (get_remote_level($_SERVER['HTTP_USER_AGENT']) == 'old') {
exit;
}
$page = array();
if( !isset($_GET['token']) || !isset($_GET['thread']) ) {
$thread = NULL;
@ -57,6 +55,8 @@ if( !isset($_GET['token']) || !isset($_GET['thread']) ) {
}
if( !$thread ) {
// Load group info
$groupid = "";
$groupname = "";
$group = NULL;
@ -72,102 +72,58 @@ if( !isset($_GET['token']) || !isset($_GET['thread']) ) {
}
}
// Get visitor info
$visitor = visitor_from_request();
if(isset($_POST['survey']) && $_POST['survey'] == 'on') {
$firstmessage = getparam("message");
$info = getparam("info");
$email = getparam("email");
$referrer = urldecode(getparam("referrer"));
$info = getgetparam('info');
$email = getgetparam('email');
if(Settings::get('usercanchangename') == "1" && isset($_POST['name'])) {
$newname = getparam("name");
if($newname != $visitor['name']) {
$data = strtr(base64_encode(myiconv($webim_encoding,"utf-8",$newname)), '+/=', '-_,');
setcookie($namecookie, $data, time()+60*60*24*365);
$visitor['name'] = $newname;
}
}
} else {
$firstmessage = NULL;
$info = getgetparam('info');
$email = getgetparam('email');
$referrer = isset($_GET['url']) ? $_GET['url'] :
(isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : "");
if(isset($_GET['referrer']) && $_GET['referrer']) {
$referrer .= "\n".$_GET['referrer'];
}
// Get referrer
$referrer = isset($_GET['url'])
? $_GET['url']
: (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : "");
if(isset($_GET['referrer']) && $_GET['referrer']) {
$referrer .= "\n".$_GET['referrer'];
}
// Check if there are online operators
if(!has_online_operators($groupid)) {
// Create page array
// Display leave message page
$page = array_merge_recursive(
setup_logo($group),
setup_leavemessage($visitor['name'],$email,$firstmessage,$groupid,$groupname,$info,$referrer)
setup_leavemessage(
$visitor['name'],
$email,
$groupid,
$info,
$referrer
)
);
expand("styles/dialogs", getchatstyle(), "leavemessage.tpl");
$page['leaveMessageOptions'] = json_encode($page['leaveMessage']);
expand("styles/dialogs", getchatstyle(), "chat.tpl");
exit;
}
// Get invitation info
$invitation_state = invitation_state($_SESSION['visitorid']);
$visitor_is_invited = Settings::get('enabletracking') && $invitation_state['invited'] && !$invitation_state['threadid'];
if(Settings::get('enablepresurvey') == '1' && !(isset($_POST['survey']) && $_POST['survey'] == 'on') && !$visitor_is_invited) {
// Create page array
$visitor_is_invited = Settings::get('enabletracking')
&& $invitation_state['invited']
&& !$invitation_state['threadid'];
// Check if survey should be displayed
if(Settings::get('enablepresurvey') == '1' && !$visitor_is_invited) {
// Display prechat survey
$page = array_merge_recursive(
setup_logo($group),
setup_survey($visitor['name'], $email, $groupid, $info, $referrer)
);
expand("styles/dialogs", getchatstyle(), "survey.tpl");
$page['surveyOptions'] = json_encode($page['survey']);
expand("styles/dialogs", getchatstyle(), "chat.tpl");
exit;
}
$remoteHost = get_remote_host();
$userbrowser = $_SERVER['HTTP_USER_AGENT'];
if(Thread::connectionLimitReached($remoteHost)) {
die("number of connections from your IP is exceeded, try again later");
}
$thread = Thread::create();
$thread->groupId = $groupid;
$thread->userName = $visitor['name'];
$thread->remote = $remoteHost;
$thread->referer = $referrer;
$thread->locale = $current_locale;
$thread->userId = $visitor['id'];
$thread->userAgent = $userbrowser;
$thread->state = Thread::STATE_LOADING;
$thread->save();
$_SESSION['threadid'] = $thread->id;
$operator = invitation_accept($_SESSION['visitorid'], $thread->id);
if ($operator) {
$operator = operator_by_id($operator);
$operatorName = ($current_locale == $home_locale) ? $operator['vclocalename'] : $operator['vccommonname'];
$thread->postMessage(
Thread::KIND_FOR_AGENT,
getstring2('chat.visitor.invitation.accepted', array($operatorName))
);
}
if( $referrer ) {
$thread->postMessage(
Thread::KIND_FOR_AGENT,
getstring2('chat.came.from',array($referrer))
);
}
$thread->postMessage(Thread::KIND_INFO, getstring('chat.wait'));
if($email) {
$thread->postMessage(Thread::KIND_FOR_AGENT, getstring2('chat.visitor.email',array($email)));
}
if($info) {
$thread->postMessage(Thread::KIND_FOR_AGENT, getstring2('chat.visitor.info',array($info)));
}
if($firstmessage) {
$postedid = $thread->postMessage(Thread::KIND_USER, $firstmessage, $visitor['name']);
$thread->shownMessageId = $postedid;
$thread->save();
}
// Start chat thread
$thread = chat_start_for_user($groupid, $visitor['id'], $visitor['name'], $referrer, $info);
}
$threadid = $thread->id;
$token = $thread->lastToken;
@ -184,21 +140,14 @@ if (! $thread) {
die("wrong thread");
}
$page = array_merge_recursive(
$page,
setup_chatview_for_user($thread)
);
$page = setup_chatview_for_user($thread);
$pparam = verifyparam( "act", "/^(mailthread)$/", "default");
if( $pparam == "mailthread" ) {
expand("styles/dialogs", getchatstyle(), "mail.tpl");
} else {
// Load JavaScript plugins and JavaScripts, CSS files required by them
$page['additional_css'] = get_additional_css('client_chat_window');
$page['additional_js'] = get_additional_js('client_chat_window');
$page['js_plugin_options'] = get_js_plugin_options('client_chat_window');
// Build js application options
$page['chatModule'] = json_encode($page['chat']);
$page['chatOptions'] = json_encode($page['chat']);
// Expand page
expand("styles/dialogs", getchatstyle(), "chat.tpl");
}

View File

@ -5,4 +5,5 @@
Copyright (c) 2005-2011 Mibew Messenger Community
License: http://mibew.org/license.php
*/
(function(a,d){var b=a.Application;b.addRegions({mainRegion:"#main-region"});b.addInitializer(function(c){a.Objects.server=new a.Server(d.extend({interactionType:MibewAPIChatInteraction},c.server));b.Chat.start(c)});b.on("start",function(){a.Objects.server.runUpdater()})})(Mibew,_);
(function(a,d){var b=a.Application;b.addRegions({mainRegion:"#main-region"});b.addInitializer(function(c){a.Objects.server=new a.Server(d.extend({interactionType:MibewAPIChatInteraction},c.server));a.Objects.Models.page=new a.Models.Page(c.page);switch(c.startFrom){case "chat":b.Chat.start(c.chatOptions);break;case "survey":b.Survey.start(c.surveyOptions);break;case "leaveMessage":b.LeaveMessage.start(c.leaveMessageOptions);break;default:throw Error("Dont know how to start!");}});b.on("start",function(){a.Objects.server.runUpdater()})})(Mibew,
_);

View File

@ -5,4 +5,4 @@
Copyright (c) 2005-2011 Mibew Messenger Community
License: http://mibew.org/license.php
*/
(function(a,b){a.Layouts.Chat=b.Marionette.Layout.extend({template:Handlebars.templates.chat_layout,regions:{controlsRegion:"#controls-region",avatarRegion:"#avatar-region",messagesRegion:{selector:"#messages-region",regionType:a.Regions.Messages},statusRegion:"#status-region",messageFormRegion:"#message-form-region",soundRegion:"#sound-region"},serializeData:function(){return{user:a.Objects.Models.user.toJSON()}}})})(Mibew,Backbone);
(function(a,c){a.Layouts.Chat=c.Marionette.Layout.extend({template:Handlebars.templates.chat_layout,regions:{controlsRegion:"#controls-region",avatarRegion:"#avatar-region",messagesRegion:{selector:"#messages-region",regionType:a.Regions.Messages},statusRegion:"#status-region",messageFormRegion:"#message-form-region",soundRegion:"#sound-region"},serializeData:function(){var b=a.Objects.Models;return{page:b.page.toJSON(),user:b.user.toJSON()}}})})(Mibew,Backbone);

View 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.Layouts.LeaveMessage=b.Marionette.Layout.extend({template:Handlebars.templates.leave_message_layout,regions:{leaveMessageFormRegion:"#content-wrapper",descriptionRegion:"#description-region"},serializeData:function(){return{page:a.Objects.Models.page.toJSON()}}})})(Mibew,Backbone);

View 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.Layouts.Survey=b.Marionette.Layout.extend({template:Handlebars.templates.survey_layout,regions:{surveyFormRegion:"#content-wrapper"},serializeData:function(){return{page:a.Objects.Models.page.toJSON()}}})})(Mibew,Backbone);

View 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.LeaveMessageDescription=b.Marionette.ItemView.extend({template:c.templates.leave_message_description,serializeData:function(){return{page:a.Objects.Models.page.toJSON()}}})})(Mibew,Backbone,Handlebars);

View File

@ -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(d,e,b){var c=d.Views.BaseSurveyForm;d.Views.LeaveMessageForm=c.extend({template:e.templates.leave_message_form,events:b.extend({},c.prototype.events,{"click #send-message":"submitForm"}),ui:b.extend({},c.prototype.ui,{captcha:'input[name="captcha"]',captchaImg:"#captcha-img"}),modelEvents:b.extend({},c.prototype.modelEvents,{"submit:error":"showError submitError"}),submitForm:function(){var a={};this.model.get("groups")&&(a.groupId=this.ui.groupSelect.val());a.name=this.ui.name.val()||"";
a.email=this.ui.email.val()||"";a.message=this.ui.message.val()||"";this.model.get("showCaptcha")&&(a.captcha=this.ui.captcha.val()||"");this.model.set(a,{validate:!0});this.model.submit()},submitError:function(a,c){if(c.code==a.ERROR_WRONG_CAPTCHA&&a.get("showCaptcha")){var b=this.ui.captchaImg.attr("src"),b=b.replace(/\?d\=[0-9]+/,"");this.ui.captchaImg.attr("src",b+"?d="+(new Date).getTime())}}})})(Mibew,Handlebars,_);

View 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.LeaveMessageSentDescription=b.Marionette.ItemView.extend({template:c.templates.leave_message_sent_description,serializeData:function(){return{page:a.Objects.Models.page.toJSON()}}})})(Mibew,Backbone,Handlebars);

View File

@ -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){c.Views.BaseSurveyForm=d.Marionette.ItemView.extend({events:{'change select[name="group"]':"changeGroupDescription","submit form":"preventSubmit"},ui:{groupSelect:'select[name="group"]',groupDescription:"#groupDescription",name:'input[name="name"]',email:'input[name="email"]',message:'textarea[name="message"]',errors:".errors"},modelEvents:{invalid:"showError","submit:error":"showError"},preventSubmit:function(b){b.preventDefault()},changeGroupDescription:function(){var b=this.ui.groupSelect.prop("selectedIndex"),
a=this.model.get("groups").descriptions||[];this.ui.groupDescription.text(a[b]||"")},showError:function(b,a){this.ui.errors.html("string"==typeof a?a:a.message)}})})(Mibew,Backbone);

View File

@ -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,d,e){var c=b.Views.BaseSurveyForm;b.Views.SurveyForm=c.extend({template:d.templates.survey_form,events:e.extend({},c.prototype.events,{"click #submit-survey":"submitForm"}),submitForm:function(){var a={};this.model.get("groups")&&(a.groupId=this.ui.groupSelect.val());this.model.get("canChangeName")&&(a.name=this.ui.name.val()||"");this.model.get("showEmail")&&(a.email=this.ui.email.val()||"");this.model.get("showMessage")&&(a.message=this.ui.message.val()||"");this.model.set(a,{validate:!0});
this.model.submit()}})})(Mibew,Handlebars,_);

View 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(c,e){var d=c.Models.BaseSurveyForm;c.Models.LeaveMessageForm=d.extend({defaults:e.extend({},d.prototype.defaults,{showCaptcha:!1,captcha:""}),validate:function(a){var b=c.Localization;if("undefined"!=typeof a.email){if(!a.email)return b.get("leavemessage.error.email.required");if(!c.Utils.checkEmail(a.email))return b.get("leavemessage.error.wrong.email")}if("undefined"!=typeof a.name&&!a.name)return b.get("leavemessage.error.name.required");if("undefined"!=typeof a.message&&!a.message)return b.get("leavemessage.error.message.required");
if(this.get("showCaptcha")&&"undefined"!=typeof a.captcha&&!a.captcha)return b.get("errors.captcha")},submit:function(){if(!this.validate(this.attributes)){var a=this;c.Objects.server.callFunctions([{"function":"processLeaveMessage",arguments:{references:{},"return":{},groupId:a.get("groupId"),name:a.get("name"),info:a.get("info"),email:a.get("email"),message:a.get("message"),referrer:a.get("referrer"),captcha:a.get("captcha"),threadId:null,token:null}}],function(b){0==b.errorCode?a.trigger("submit:complete",
a):a.trigger("submit:error",a,{code:b.errorCode,message:b.errorMessage||""})},!0)}},ERROR_WRONG_CAPTCHA:10})})(Mibew,_);

View File

@ -5,4 +5,4 @@
Copyright (c) 2005-2011 Mibew Messenger Community
License: http://mibew.org/license.php
*/
EventHelper.register(window,"onload",function(){MessageForm=new ClientForm(document.leaveMessageForm)});
(function(a){a.Models.BaseSurveyForm=a.Models.Base.extend({defaults:{name:"",email:"",message:"",info:"",referrer:"",groupId:null,groups:null}})})(Mibew);

View 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,e){var d=b.Models.BaseSurveyForm;b.Models.SurveyForm=d.extend({defaults:e.extend({},d.prototype.defaults,{showEmail:!1,showMessage:!1,canChangeName:!1}),validate:function(a){if(this.get("showEmail")&&"undefined"!=typeof a.email&&!b.Utils.checkEmail(a.email))return b.Localization.get("presurvey.error.wrong_email")},submit:function(){if(!this.validate(this.attributes)){var a=this;b.Objects.server.callFunctions([{"function":"processSurvey",arguments:{references:{},"return":{next:"next",options:"options"},
groupId:a.get("groupId"),name:a.get("name"),info:a.get("info"),email:a.get("email"),message:a.get("message"),referrer:a.get("referrer"),threadId:null,token:null}}],function(c){if(0==c.errorCode)switch(a.trigger("submit:complete",a),b.Application.Survey.stop(),c.next){case "chat":b.Application.Chat.start(c.options);break;case "leaveMessage":b.Application.LeaveMessage.start(c.options);break;default:throw Error("Do not know how to continue!");}else a.trigger("submit:error",a,{code:c.errorCode,message:c.errorMessage||
""})},!0)}}})})(Mibew,_);

View File

@ -5,10 +5,10 @@
Copyright (c) 2005-2011 Mibew Messenger Community
License: http://mibew.org/license.php
*/
(function(a){a.Objects.Models.Controls={};a.Objects.Models.Status={};var j=[],k=a.Application,l=k.module("Chat",{startWithParent:!1});l.addInitializer(function(c){var e=c.chatModule,g=a.Objects,d=a.Objects.Models,b=a.Objects.Models.Controls,h=a.Objects.Models.Status;d.thread=new a.Models.Thread(e.thread);d.user=new a.Models.ChatUser(e.user);d.page=new a.Models.Page(c.page);c=new a.Layouts.Chat;a.Objects.chatLayout=c;k.mainRegion.show(c);var f=new a.Collections.Controls;d.user.get("isAgent")||(b.userName=
new a.Models.UserNameControl({weight:220}),f.add(b.userName),b.sendMail=new a.Models.SendMailControl({weight:200,link:e.links.mail,windowParams:e.windowsParams.mail}),f.add(b.sendMail));d.user.get("isAgent")&&(b.redirect=new a.Models.RedirectControl({weight:200,link:e.links.redirect}),f.add(b.redirect),b.history=new a.Models.HistoryControl({weight:180,link:e.links.history,windowParams:e.windowsParams.history}),f.add(b.history));b.sound=new a.Models.SoundControl({weight:160});f.add(b.sound);b.refresh=
new a.Models.RefreshControl({weight:140});f.add(b.refresh);e.links.ssl&&(b.secureMode=new a.Models.SecureModeControl({weight:120,link:e.links.ssl}),f.add(b.secureMode));b.close=new a.Models.CloseControl({weight:100});f.add(b.close);g.Collections.controls=f;c.controlsRegion.show(new a.Views.ControlsCollection({collection:f}));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]);
c.statusRegion.show(new a.Views.StatusCollection({collection:g.Collections.status}));d.user.get("isAgent")||(d.avatar=new a.Models.Avatar,c.avatarRegion.show(new a.Views.Avatar({model:d.avatar})));g.Collections.messages=new a.Collections.Messages;d.messageForm=new a.Models.MessageForm(e.messageForm);c.messageFormRegion.show(new a.Views.MessageForm({model:d.messageForm}));c.messagesRegion.show(new a.Views.MessagesCollection({collection:g.Collections.messages}));d.sound=new a.Models.Sound;c.soundRegion.show(new a.Views.Sound({model:d.sound}));
j.push(g.server.callFunctionsPeriodically(function(){var b=a.Objects.Models.thread,c=a.Objects.Models.user;return[{"function":"update",arguments:{"return":{typing:"typing",canPost:"canPost"},references:{},threadId:b.get("id"),token:b.get("token"),lastId:b.get("lastId"),typed:c.get("typing"),user:!c.get("isAgent")}}]},function(b){b.errorCode?a.Objects.Models.Status.message.setMessage(b.errorMessage||"refresh failed"):(b.typing&&a.Objects.Models.Status.typing.show(),a.Objects.Models.user.set({canPost:b.canPost||
!1}))}))});l.addFinalizer(function(){a.Objects.chatLayout.close();for(var c=0;c<j.length;c++)a.Objects.server.stopCallFunctionsPeriodically(j[c]);"undefined"!=typeof a.Objects.Models.avatar&&a.Objects.Models.avatar.finalize();a.Objects.Collections.messages.finalize();delete a.Objects.chatLayout;delete a.Objects.Models.thread;delete a.Objects.Models.user;delete a.Objects.Models.page;delete a.Objects.Models.avatar;delete a.Objects.Models.messageForm;delete a.Objects.Models.sound;delete a.Objects.Models.Controls;
delete a.Objects.Models.Status;delete a.Objects.Collections.messages;delete a.Objects.Collections.controls;delete a.Objects.Collections.status})})(Mibew);
(function(a){a.Objects.Models.Controls={};a.Objects.Models.Status={};var j=[],k=a.Application,l=k.module("Chat",{startWithParent:!1});l.addInitializer(function(b){var g=a.Objects,d=a.Objects.Models,c=a.Objects.Models.Controls,h=a.Objects.Models.Status;b.page&&d.page.set(b.page);d.thread=new a.Models.Thread(b.thread);d.user=new a.Models.ChatUser(b.user);var f=new a.Layouts.Chat;g.chatLayout=f;k.mainRegion.show(f);var e=new a.Collections.Controls;d.user.get("isAgent")||(c.userName=new a.Models.UserNameControl({weight:220}),
e.add(c.userName),c.sendMail=new a.Models.SendMailControl({weight:200,link:b.links.mail,windowParams:b.windowsParams.mail}),e.add(c.sendMail));d.user.get("isAgent")&&(c.redirect=new a.Models.RedirectControl({weight:200,link:b.links.redirect}),e.add(c.redirect),c.history=new a.Models.HistoryControl({weight:180,link:b.links.history,windowParams:b.windowsParams.history}),e.add(c.history));c.sound=new a.Models.SoundControl({weight:160});e.add(c.sound);c.refresh=new a.Models.RefreshControl({weight:140});
e.add(c.refresh);b.links.ssl&&(c.secureMode=new a.Models.SecureModeControl({weight:120,link:b.links.ssl}),e.add(c.secureMode));c.close=new a.Models.CloseControl({weight:100});e.add(c.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}));
d.user.get("isAgent")||(d.avatar=new a.Models.Avatar,f.avatarRegion.show(new a.Views.Avatar({model:d.avatar})));g.Collections.messages=new a.Collections.Messages;d.messageForm=new a.Models.MessageForm(b.messageForm);f.messageFormRegion.show(new a.Views.MessageForm({model:d.messageForm}));f.messagesRegion.show(new a.Views.MessagesCollection({collection:g.Collections.messages}));d.sound=new a.Models.Sound;f.soundRegion.show(new a.Views.Sound({model:d.sound}));j.push(g.server.callFunctionsPeriodically(function(){var b=
a.Objects.Models.thread,c=a.Objects.Models.user;return[{"function":"update",arguments:{"return":{typing:"typing",canPost:"canPost"},references:{},threadId:b.get("id"),token:b.get("token"),lastId:b.get("lastId"),typed:c.get("typing"),user:!c.get("isAgent")}}]},function(b){b.errorCode?a.Objects.Models.Status.message.setMessage(b.errorMessage||"refresh failed"):(b.typing&&a.Objects.Models.Status.typing.show(),a.Objects.Models.user.set({canPost:b.canPost||!1}))}))});l.addFinalizer(function(){a.Objects.chatLayout.close();
for(var b=0;b<j.length;b++)a.Objects.server.stopCallFunctionsPeriodically(j[b]);"undefined"!=typeof a.Objects.Models.avatar&&a.Objects.Models.avatar.finalize();a.Objects.Collections.messages.finalize();delete a.Objects.chatLayout;delete a.Objects.Models.thread;delete a.Objects.Models.user;delete a.Objects.Models.page;delete a.Objects.Models.avatar;delete a.Objects.Models.messageForm;delete a.Objects.Models.sound;delete a.Objects.Models.Controls;delete a.Objects.Models.Status;delete a.Objects.Collections.messages;
delete a.Objects.Collections.controls;delete a.Objects.Collections.status})})(Mibew);

View File

@ -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){var e=a.Application,f=e.module("LeaveMessage",{startWithParent:!1});f.addInitializer(function(d){var b=a.Objects,c=a.Objects.Models;d.page&&c.page.set(d.page);b.leaveMessageLayout=new a.Layouts.LeaveMessage;e.mainRegion.show(b.leaveMessageLayout);c.leaveMessageForm=new a.Models.LeaveMessageForm(d.leaveMessageForm);b.leaveMessageLayout.leaveMessageFormRegion.show(new a.Views.LeaveMessageForm({model:c.leaveMessageForm}));b.leaveMessageLayout.descriptionRegion.show(new a.Views.LeaveMessageDescription);
c.leaveMessageForm.on("submit:complete",function(){b.leaveMessageLayout.leaveMessageFormRegion.close();b.leaveMessageLayout.descriptionRegion.close();b.leaveMessageLayout.descriptionRegion.show(new a.Views.LeaveMessageSentDescription)})});f.addFinalizer(function(){a.Objects.leaveMessageLayout.close();delete a.Objects.Models.leaveMessageForm})})(Mibew);

View 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){var d=a.Application,b=d.module("Survey",{startWithParent:!1});b.addInitializer(function(b){var c=a.Objects,e=a.Objects.Models;c.surveyLayout=new a.Layouts.Survey;d.mainRegion.show(c.surveyLayout);e.surveyForm=new a.Models.SurveyForm(b.surveyForm);c.surveyLayout.surveyFormRegion.show(new a.Views.SurveyForm({model:e.surveyForm}))});b.addFinalizer(function(){a.Objects.surveyLayout.close();delete a.Objects.Models.surveyForm})})(Mibew);

View File

@ -25,6 +25,13 @@ MibewAPIChatInteraction=function(){this.obligatoryArguments={"*":{threadId:null,
Copyright (c) 2005-2011 Mibew Messenger Community
License: http://mibew.org/license.php
*/
(function(a){a.Models.BaseSurveyForm=a.Models.Base.extend({defaults:{name:"",email:"",message:"",info:"",referrer:"",groupId:null,groups:null}})})(Mibew);
/*
This file is part of Mibew Messenger project.
http://mibew.org
Copyright (c) 2005-2011 Mibew Messenger Community
License: http://mibew.org/license.php
*/
(function(b,c){b.Models.Avatar=b.Models.Base.extend({defaults:{imageLink:!1},initialize:function(){this.registeredFunctions=[];this.registeredFunctions.push(b.Objects.server.registerFunction("setupAvatar",c.bind(this.apiSetupAvatar,this)))},finalize:function(){for(var a=0;a<this.registeredFunctions.length;a++)b.Objects.server.unregisterFunction(this.registeredFunctions[a])},apiSetupAvatar:function(a){a.imageLink&&this.set({imageLink:a.imageLink})}})})(Mibew,_);
/*
This file is part of Mibew Messenger project.
@ -95,6 +102,15 @@ MibewAPIChatInteraction=function(){this.obligatoryArguments={"*":{threadId:null,
Copyright (c) 2005-2011 Mibew Messenger Community
License: http://mibew.org/license.php
*/
(function(c,e){var d=c.Models.BaseSurveyForm;c.Models.LeaveMessageForm=d.extend({defaults:e.extend({},d.prototype.defaults,{showCaptcha:!1,captcha:""}),validate:function(a){var b=c.Localization;if("undefined"!=typeof a.email){if(!a.email)return b.get("leavemessage.error.email.required");if(!c.Utils.checkEmail(a.email))return b.get("leavemessage.error.wrong.email")}if("undefined"!=typeof a.name&&!a.name)return b.get("leavemessage.error.name.required");if("undefined"!=typeof a.message&&!a.message)return b.get("leavemessage.error.message.required");
if(this.get("showCaptcha")&&"undefined"!=typeof a.captcha&&!a.captcha)return b.get("errors.captcha")},submit:function(){if(!this.validate(this.attributes)){var a=this;c.Objects.server.callFunctions([{"function":"processLeaveMessage",arguments:{references:{},"return":{},groupId:a.get("groupId"),name:a.get("name"),info:a.get("info"),email:a.get("email"),message:a.get("message"),referrer:a.get("referrer"),captcha:a.get("captcha"),threadId:null,token:null}}],function(b){0==b.errorCode?a.trigger("submit:complete",
a):a.trigger("submit:error",a,{code:b.errorCode,message:b.errorMessage||""})},!0)}},ERROR_WRONG_CAPTCHA:10})})(Mibew,_);
/*
This file is part of Mibew Messenger project.
http://mibew.org
Copyright (c) 2005-2011 Mibew Messenger Community
License: http://mibew.org/license.php
*/
(function(a){a.Models.MessageForm=a.Models.Base.extend({defaults:{predefinedAnswers:[],ignoreCtrl:!1},postMessage:function(e){var b=a.Objects.Models.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.get("id"),token:b.get("token"),user:!c.get("isAgent")}}],function(){d.trigger("after:post",d)},!0)}}})})(Mibew);
/*
This file is part of Mibew Messenger project.
@ -116,6 +132,15 @@ MibewAPIChatInteraction=function(){this.obligatoryArguments={"*":{threadId:null,
Copyright (c) 2005-2011 Mibew Messenger Community
License: http://mibew.org/license.php
*/
(function(b,e){var d=b.Models.BaseSurveyForm;b.Models.SurveyForm=d.extend({defaults:e.extend({},d.prototype.defaults,{showEmail:!1,showMessage:!1,canChangeName:!1}),validate:function(a){if(this.get("showEmail")&&"undefined"!=typeof a.email&&!b.Utils.checkEmail(a.email))return b.Localization.get("presurvey.error.wrong_email")},submit:function(){if(!this.validate(this.attributes)){var a=this;b.Objects.server.callFunctions([{"function":"processSurvey",arguments:{references:{},"return":{next:"next",options:"options"},
groupId:a.get("groupId"),name:a.get("name"),info:a.get("info"),email:a.get("email"),message:a.get("message"),referrer:a.get("referrer"),threadId:null,token:null}}],function(c){if(0==c.errorCode)switch(a.trigger("submit:complete",a),b.Application.Survey.stop(),c.next){case "chat":b.Application.Chat.start(c.options);break;case "leaveMessage":b.Application.LeaveMessage.start(c.options);break;default:throw Error("Do not know how to continue!");}else a.trigger("submit:error",a,{code:c.errorCode,message:c.errorMessage||
""})},!0)}}})})(Mibew,_);
/*
This file is part of Mibew Messenger project.
http://mibew.org
Copyright (c) 2005-2011 Mibew Messenger Community
License: http://mibew.org/license.php
*/
(function(b,d,f){b.Collections.Messages=d.Collection.extend({model:b.Models.Message,initialize:function(){this.periodicallyCalled=[];this.periodicallyCalled.push(b.Objects.server.callFunctionsPeriodically(f.bind(this.updateMessagesFunctionBuilder,this),f.bind(this.updateMessages,this)))},finalize:function(){for(var a=0;a<this.periodicallyCalled.length;a++)b.Objects.server.stopCallFunctionsPeriodically(this.periodicallyCalled[a])},updateMessages:function(a){a.lastId&&b.Objects.Models.thread.set({lastId:a.lastId});
for(var c=[],e=0,d=a.messages.length;e<d;e++)c.push(new b.Models.Message(a.messages[e]));0<c.length&&this.add(c)},updateMessagesFunctionBuilder:function(){var a=b.Objects.Models.thread,c=b.Objects.Models.user;return[{"function":"updateMessages",arguments:{"return":{messages:"messages",lastId:"lastId"},references:{},threadId:a.get("id"),token:a.get("token"),lastId:a.get("lastId"),user:!c.get("isAgent")}}]},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,_);
@ -139,6 +164,14 @@ a);this.trigger("multiple:add");return a}})})(Mibew,Backbone,_);
Copyright (c) 2005-2011 Mibew Messenger Community
License: http://mibew.org/license.php
*/
(function(c,d){c.Views.BaseSurveyForm=d.Marionette.ItemView.extend({events:{'change select[name="group"]':"changeGroupDescription","submit form":"preventSubmit"},ui:{groupSelect:'select[name="group"]',groupDescription:"#groupDescription",name:'input[name="name"]',email:'input[name="email"]',message:'textarea[name="message"]',errors:".errors"},modelEvents:{invalid:"showError","submit:error":"showError"},preventSubmit:function(b){b.preventDefault()},changeGroupDescription:function(){var b=this.ui.groupSelect.prop("selectedIndex"),
a=this.model.get("groups").descriptions||[];this.ui.groupDescription.text(a[b]||"")},showError:function(b,a){this.ui.errors.html("string"==typeof a?a:a.message)}})})(Mibew,Backbone);
/*
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);
/*
This file is part of Mibew Messenger project.
@ -204,6 +237,28 @@ this.model.toJSON();a.user=b.Objects.Models.user.toJSON();a.nameInput=this.nameI
Copyright (c) 2005-2011 Mibew Messenger Community
License: http://mibew.org/license.php
*/
(function(a,b,c){a.Views.LeaveMessageDescription=b.Marionette.ItemView.extend({template:c.templates.leave_message_description,serializeData:function(){return{page:a.Objects.Models.page.toJSON()}}})})(Mibew,Backbone,Handlebars);
/*
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,e,b){var c=d.Views.BaseSurveyForm;d.Views.LeaveMessageForm=c.extend({template:e.templates.leave_message_form,events:b.extend({},c.prototype.events,{"click #send-message":"submitForm"}),ui:b.extend({},c.prototype.ui,{captcha:'input[name="captcha"]',captchaImg:"#captcha-img"}),modelEvents:b.extend({},c.prototype.modelEvents,{"submit:error":"showError submitError"}),submitForm:function(){var a={};this.model.get("groups")&&(a.groupId=this.ui.groupSelect.val());a.name=this.ui.name.val()||"";
a.email=this.ui.email.val()||"";a.message=this.ui.message.val()||"";this.model.get("showCaptcha")&&(a.captcha=this.ui.captcha.val()||"");this.model.set(a,{validate:!0});this.model.submit()},submitError:function(a,c){if(c.code==a.ERROR_WRONG_CAPTCHA&&a.get("showCaptcha")){var b=this.ui.captchaImg.attr("src"),b=b.replace(/\?d\=[0-9]+/,"");this.ui.captchaImg.attr("src",b+"?d="+(new Date).getTime())}}})})(Mibew,Handlebars,_);
/*
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.LeaveMessageSentDescription=b.Marionette.ItemView.extend({template:c.templates.leave_message_sent_description,serializeData:function(){return{page:a.Objects.Models.page.toJSON()}}})})(Mibew,Backbone,Handlebars);
/*
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,
@ -228,6 +283,14 @@ c=""!=this.ui.message.val();c!=a.get("typing")&&a.set({typing:c})},setFocus:func
Copyright (c) 2005-2011 Mibew Messenger Community
License: http://mibew.org/license.php
*/
(function(b,d,e){var c=b.Views.BaseSurveyForm;b.Views.SurveyForm=c.extend({template:d.templates.survey_form,events:e.extend({},c.prototype.events,{"click #submit-survey":"submitForm"}),submitForm:function(){var a={};this.model.get("groups")&&(a.groupId=this.ui.groupSelect.val());this.model.get("canChangeName")&&(a.name=this.ui.name.val()||"");this.model.get("showEmail")&&(a.email=this.ui.email.val()||"");this.model.get("showMessage")&&(a.message=this.ui.message.val()||"");this.model.set(a,{validate:!0});
this.model.submit()}})})(Mibew,Handlebars,_);
/*
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);
/*
@ -250,24 +313,54 @@ c=""!=this.ui.message.val();c!=a.get("typing")&&a.set({typing:c})},setFocus:func
Copyright (c) 2005-2011 Mibew Messenger Community
License: http://mibew.org/license.php
*/
(function(a,b){a.Layouts.Chat=b.Marionette.Layout.extend({template:Handlebars.templates.chat_layout,regions:{controlsRegion:"#controls-region",avatarRegion:"#avatar-region",messagesRegion:{selector:"#messages-region",regionType:a.Regions.Messages},statusRegion:"#status-region",messageFormRegion:"#message-form-region",soundRegion:"#sound-region"},serializeData:function(){return{user:a.Objects.Models.user.toJSON()}}})})(Mibew,Backbone);
(function(a,c){a.Layouts.Chat=c.Marionette.Layout.extend({template:Handlebars.templates.chat_layout,regions:{controlsRegion:"#controls-region",avatarRegion:"#avatar-region",messagesRegion:{selector:"#messages-region",regionType:a.Regions.Messages},statusRegion:"#status-region",messageFormRegion:"#message-form-region",soundRegion:"#sound-region"},serializeData:function(){var b=a.Objects.Models;return{page:b.page.toJSON(),user:b.user.toJSON()}}})})(Mibew,Backbone);
/*
This file is part of Mibew Messenger project.
http://mibew.org
Copyright (c) 2005-2011 Mibew Messenger Community
License: http://mibew.org/license.php
*/
(function(a){a.Objects.Models.Controls={};a.Objects.Models.Status={};var j=[],k=a.Application,l=k.module("Chat",{startWithParent:!1});l.addInitializer(function(c){var e=c.chatModule,g=a.Objects,d=a.Objects.Models,b=a.Objects.Models.Controls,h=a.Objects.Models.Status;d.thread=new a.Models.Thread(e.thread);d.user=new a.Models.ChatUser(e.user);d.page=new a.Models.Page(c.page);c=new a.Layouts.Chat;a.Objects.chatLayout=c;k.mainRegion.show(c);var f=new a.Collections.Controls;d.user.get("isAgent")||(b.userName=
new a.Models.UserNameControl({weight:220}),f.add(b.userName),b.sendMail=new a.Models.SendMailControl({weight:200,link:e.links.mail,windowParams:e.windowsParams.mail}),f.add(b.sendMail));d.user.get("isAgent")&&(b.redirect=new a.Models.RedirectControl({weight:200,link:e.links.redirect}),f.add(b.redirect),b.history=new a.Models.HistoryControl({weight:180,link:e.links.history,windowParams:e.windowsParams.history}),f.add(b.history));b.sound=new a.Models.SoundControl({weight:160});f.add(b.sound);b.refresh=
new a.Models.RefreshControl({weight:140});f.add(b.refresh);e.links.ssl&&(b.secureMode=new a.Models.SecureModeControl({weight:120,link:e.links.ssl}),f.add(b.secureMode));b.close=new a.Models.CloseControl({weight:100});f.add(b.close);g.Collections.controls=f;c.controlsRegion.show(new a.Views.ControlsCollection({collection:f}));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]);
c.statusRegion.show(new a.Views.StatusCollection({collection:g.Collections.status}));d.user.get("isAgent")||(d.avatar=new a.Models.Avatar,c.avatarRegion.show(new a.Views.Avatar({model:d.avatar})));g.Collections.messages=new a.Collections.Messages;d.messageForm=new a.Models.MessageForm(e.messageForm);c.messageFormRegion.show(new a.Views.MessageForm({model:d.messageForm}));c.messagesRegion.show(new a.Views.MessagesCollection({collection:g.Collections.messages}));d.sound=new a.Models.Sound;c.soundRegion.show(new a.Views.Sound({model:d.sound}));
j.push(g.server.callFunctionsPeriodically(function(){var b=a.Objects.Models.thread,c=a.Objects.Models.user;return[{"function":"update",arguments:{"return":{typing:"typing",canPost:"canPost"},references:{},threadId:b.get("id"),token:b.get("token"),lastId:b.get("lastId"),typed:c.get("typing"),user:!c.get("isAgent")}}]},function(b){b.errorCode?a.Objects.Models.Status.message.setMessage(b.errorMessage||"refresh failed"):(b.typing&&a.Objects.Models.Status.typing.show(),a.Objects.Models.user.set({canPost:b.canPost||
!1}))}))});l.addFinalizer(function(){a.Objects.chatLayout.close();for(var c=0;c<j.length;c++)a.Objects.server.stopCallFunctionsPeriodically(j[c]);"undefined"!=typeof a.Objects.Models.avatar&&a.Objects.Models.avatar.finalize();a.Objects.Collections.messages.finalize();delete a.Objects.chatLayout;delete a.Objects.Models.thread;delete a.Objects.Models.user;delete a.Objects.Models.page;delete a.Objects.Models.avatar;delete a.Objects.Models.messageForm;delete a.Objects.Models.sound;delete a.Objects.Models.Controls;
delete a.Objects.Models.Status;delete a.Objects.Collections.messages;delete a.Objects.Collections.controls;delete a.Objects.Collections.status})})(Mibew);
(function(a,b){a.Layouts.LeaveMessage=b.Marionette.Layout.extend({template:Handlebars.templates.leave_message_layout,regions:{leaveMessageFormRegion:"#content-wrapper",descriptionRegion:"#description-region"},serializeData:function(){return{page:a.Objects.Models.page.toJSON()}}})})(Mibew,Backbone);
/*
This file is part of Mibew Messenger project.
http://mibew.org
Copyright (c) 2005-2011 Mibew Messenger Community
License: http://mibew.org/license.php
*/
(function(a,d){var b=a.Application;b.addRegions({mainRegion:"#main-region"});b.addInitializer(function(c){a.Objects.server=new a.Server(d.extend({interactionType:MibewAPIChatInteraction},c.server));b.Chat.start(c)});b.on("start",function(){a.Objects.server.runUpdater()})})(Mibew,_);
(function(a,b){a.Layouts.Survey=b.Marionette.Layout.extend({template:Handlebars.templates.survey_layout,regions:{surveyFormRegion:"#content-wrapper"},serializeData:function(){return{page:a.Objects.Models.page.toJSON()}}})})(Mibew,Backbone);
/*
This file is part of Mibew Messenger project.
http://mibew.org
Copyright (c) 2005-2011 Mibew Messenger Community
License: http://mibew.org/license.php
*/
(function(a){a.Objects.Models.Controls={};a.Objects.Models.Status={};var j=[],k=a.Application,l=k.module("Chat",{startWithParent:!1});l.addInitializer(function(b){var g=a.Objects,d=a.Objects.Models,c=a.Objects.Models.Controls,h=a.Objects.Models.Status;b.page&&d.page.set(b.page);d.thread=new a.Models.Thread(b.thread);d.user=new a.Models.ChatUser(b.user);var f=new a.Layouts.Chat;g.chatLayout=f;k.mainRegion.show(f);var e=new a.Collections.Controls;d.user.get("isAgent")||(c.userName=new a.Models.UserNameControl({weight:220}),
e.add(c.userName),c.sendMail=new a.Models.SendMailControl({weight:200,link:b.links.mail,windowParams:b.windowsParams.mail}),e.add(c.sendMail));d.user.get("isAgent")&&(c.redirect=new a.Models.RedirectControl({weight:200,link:b.links.redirect}),e.add(c.redirect),c.history=new a.Models.HistoryControl({weight:180,link:b.links.history,windowParams:b.windowsParams.history}),e.add(c.history));c.sound=new a.Models.SoundControl({weight:160});e.add(c.sound);c.refresh=new a.Models.RefreshControl({weight:140});
e.add(c.refresh);b.links.ssl&&(c.secureMode=new a.Models.SecureModeControl({weight:120,link:b.links.ssl}),e.add(c.secureMode));c.close=new a.Models.CloseControl({weight:100});e.add(c.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}));
d.user.get("isAgent")||(d.avatar=new a.Models.Avatar,f.avatarRegion.show(new a.Views.Avatar({model:d.avatar})));g.Collections.messages=new a.Collections.Messages;d.messageForm=new a.Models.MessageForm(b.messageForm);f.messageFormRegion.show(new a.Views.MessageForm({model:d.messageForm}));f.messagesRegion.show(new a.Views.MessagesCollection({collection:g.Collections.messages}));d.sound=new a.Models.Sound;f.soundRegion.show(new a.Views.Sound({model:d.sound}));j.push(g.server.callFunctionsPeriodically(function(){var b=
a.Objects.Models.thread,c=a.Objects.Models.user;return[{"function":"update",arguments:{"return":{typing:"typing",canPost:"canPost"},references:{},threadId:b.get("id"),token:b.get("token"),lastId:b.get("lastId"),typed:c.get("typing"),user:!c.get("isAgent")}}]},function(b){b.errorCode?a.Objects.Models.Status.message.setMessage(b.errorMessage||"refresh failed"):(b.typing&&a.Objects.Models.Status.typing.show(),a.Objects.Models.user.set({canPost:b.canPost||!1}))}))});l.addFinalizer(function(){a.Objects.chatLayout.close();
for(var b=0;b<j.length;b++)a.Objects.server.stopCallFunctionsPeriodically(j[b]);"undefined"!=typeof a.Objects.Models.avatar&&a.Objects.Models.avatar.finalize();a.Objects.Collections.messages.finalize();delete a.Objects.chatLayout;delete a.Objects.Models.thread;delete a.Objects.Models.user;delete a.Objects.Models.page;delete a.Objects.Models.avatar;delete a.Objects.Models.messageForm;delete a.Objects.Models.sound;delete a.Objects.Models.Controls;delete a.Objects.Models.Status;delete a.Objects.Collections.messages;
delete a.Objects.Collections.controls;delete a.Objects.Collections.status})})(Mibew);
/*
This file is part of Mibew Messenger project.
http://mibew.org
Copyright (c) 2005-2011 Mibew Messenger Community
License: http://mibew.org/license.php
*/
(function(a){var e=a.Application,f=e.module("LeaveMessage",{startWithParent:!1});f.addInitializer(function(d){var b=a.Objects,c=a.Objects.Models;d.page&&c.page.set(d.page);b.leaveMessageLayout=new a.Layouts.LeaveMessage;e.mainRegion.show(b.leaveMessageLayout);c.leaveMessageForm=new a.Models.LeaveMessageForm(d.leaveMessageForm);b.leaveMessageLayout.leaveMessageFormRegion.show(new a.Views.LeaveMessageForm({model:c.leaveMessageForm}));b.leaveMessageLayout.descriptionRegion.show(new a.Views.LeaveMessageDescription);
c.leaveMessageForm.on("submit:complete",function(){b.leaveMessageLayout.leaveMessageFormRegion.close();b.leaveMessageLayout.descriptionRegion.close();b.leaveMessageLayout.descriptionRegion.show(new a.Views.LeaveMessageSentDescription)})});f.addFinalizer(function(){a.Objects.leaveMessageLayout.close();delete a.Objects.Models.leaveMessageForm})})(Mibew);
/*
This file is part of Mibew Messenger project.
http://mibew.org
Copyright (c) 2005-2011 Mibew Messenger Community
License: http://mibew.org/license.php
*/
(function(a){var d=a.Application,b=d.module("Survey",{startWithParent:!1});b.addInitializer(function(b){var c=a.Objects,e=a.Objects.Models;c.surveyLayout=new a.Layouts.Survey;d.mainRegion.show(c.surveyLayout);e.surveyForm=new a.Models.SurveyForm(b.surveyForm);c.surveyLayout.surveyFormRegion.show(new a.Views.SurveyForm({model:e.surveyForm}))});b.addFinalizer(function(){a.Objects.surveyLayout.close();delete a.Objects.Models.surveyForm})})(Mibew);
/*
This file is part of Mibew Messenger project.
http://mibew.org
Copyright (c) 2005-2011 Mibew Messenger Community
License: http://mibew.org/license.php
*/
(function(a,d){var b=a.Application;b.addRegions({mainRegion:"#main-region"});b.addInitializer(function(c){a.Objects.server=new a.Server(d.extend({interactionType:MibewAPIChatInteraction},c.server));a.Objects.Models.page=new a.Models.Page(c.page);switch(c.startFrom){case "chat":b.Chat.start(c.chatOptions);break;case "survey":b.Survey.start(c.surveyOptions);break;case "leaveMessage":b.LeaveMessage.start(c.leaveMessageOptions);break;default:throw Error("Dont know how to start!");}});b.on("start",function(){a.Objects.server.runUpdater()})})(Mibew,
_);

View File

@ -1,8 +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 SurveyForm=Class.create();Class.inherit(SurveyForm,ClientForm,{checkFields:function(){return null==this.form.email||"hidden"==this.form.email.getAttribute("type")?null:!this.emailIsValid(this.form.email)?this.localizedStrings.wrongEmail||"":null}});EventHelper.register(window,"onload",function(){Survey=new SurveyForm(document.surveyForm);Survey.localize(localizedStrings)});

View File

@ -18,14 +18,29 @@
// Initialize application
app.addInitializer(function(options){
// Initialize Server, Thread and User
// Initialize Server
Mibew.Objects.server = new Mibew.Server(_.extend(
{
'interactionType': MibewAPIChatInteraction
},
{'interactionType': MibewAPIChatInteraction},
options.server
));
app.Chat.start(options);
// Initialize Page
Mibew.Objects.Models.page = new Mibew.Models.Page(options.page);
switch (options.startFrom) {
case 'chat':
app.Chat.start(options.chatOptions);
break;
case 'survey':
app.Survey.start(options.surveyOptions);
break;
case 'leaveMessage':
app.LeaveMessage.start(options.leaveMessageOptions);
break;
default:
throw new Error('Dont know how to start!');
break;
}
});
app.on('start', function() {

View File

@ -46,9 +46,10 @@
* @returns {Object} Template data
*/
serializeData: function() {
var user = Mibew.Objects.Models.user.toJSON();
var models = Mibew.Objects.Models;
return {
user: user
page: models.page.toJSON(),
user: models.user.toJSON()
}
}
}

View File

@ -0,0 +1,49 @@
/**
* @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){
/**
* Represents leave message page layout
*/
Mibew.Layouts.LeaveMessage = Backbone.Marionette.Layout.extend(
/** @lends Mibew.Layouts.LeaveMessage.prototype */
{
/**
* Template function
* @type Function
*/
template: Handlebars.templates.leave_message_layout,
/**
* Regions list
* @type Object
*/
regions: {
leaveMessageFormRegion: '#content-wrapper',
descriptionRegion: '#description-region'
},
/**
* Override Backbone.Marionette.ItemView.serializeData to pass some
* extra fields to template.
*
* Use undocumented feature of layouts: passing data to template via
* serializeData method.
*
* @returns {Object} Template data
*/
serializeData: function() {
return {
page: Mibew.Objects.Models.page.toJSON()
}
}
}
);
})(Mibew, Backbone);

View 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, Backbone){
/**
* Represents survey layout
*/
Mibew.Layouts.Survey = Backbone.Marionette.Layout.extend(
/** @lends Mibew.Layouts.Survey.prototype */
{
/**
* Template function
* @type Function
*/
template: Handlebars.templates.survey_layout,
/**
* Regions list
* @type Object
*/
regions: {
surveyFormRegion: '#content-wrapper'
},
/**
* Override Backbone.Marionette.ItemView.serializeData to pass some
* extra fields to template.
*
* Use undocumented feature of layouts: passing data to template via
* serializeData method.
*
* @returns {Object} Template data
*/
serializeData: function() {
return {
page: Mibew.Objects.Models.page.toJSON()
}
}
}
);
})(Mibew, Backbone);

View File

@ -0,0 +1,40 @@
/**
* @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 leave message description
*/
Mibew.Views.LeaveMessageDescription = Backbone.Marionette.ItemView.extend(
/** @lends Mibew.Views.LeaveMessageDescription.prototype */
{
/**
* Template function
* @type Function
*/
template: Handlebars.templates.leave_message_description,
/**
* Override Backbone.Marionette.ItemView.serializeData to pass some
* extra fields to template.
*
* Use undocumented feature of layouts: passing data to template via
* serializeData method.
*
* @returns {Object} Template data
*/
serializeData: function() {
return {
page: Mibew.Objects.Models.page.toJSON()
}
}
}
);
})(Mibew, Backbone, Handlebars);

View File

@ -0,0 +1,108 @@
/**
* @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, _){
// Create shortcut for base view
var BaseView = Mibew.Views.BaseSurveyForm;
/**
* @class Represents leave message form view
*/
Mibew.Views.LeaveMessageForm = BaseView.extend(
/** @lends Mibew.Views.LeaveMessageForm.prototype */
{
/**
* Template function
* @type Function
*/
template: Handlebars.templates.leave_message_form,
/**
* Map ui events to view methods.
* The view inherits events from
* {@link Mibew.Views.BaseSurveyForm.prototype.events}.
* @type Object
*/
events: _.extend(
{},
BaseView.prototype.events,
{
'click #send-message': 'submitForm'
}
),
/**
* Shortcuts for ui elements.
* The view inherits ui elements from
* {@link Mibew.Views.BaseSurveyForm.prototype.ui}.
* @type Object
*/
ui: _.extend(
{},
BaseView.prototype.ui,
{
captcha: 'input[name="captcha"]',
captchaImg: '#captcha-img'
}
),
modelEvents: _.extend(
{},
BaseView.prototype.modelEvents,
{
'submit:error': 'showError submitError'
}
),
/**
* Update model fields and call model.submit() method.
*/
submitForm: function() {
// Update model fields
var values = {};
// Update group id
if (this.model.get('groups')) {
values.groupId = this.ui.groupSelect.val()
}
// Update name
values.name = this.ui.name.val() || '';
// Update email
values.email = this.ui.email.val() || '';
// Update message
values.message = this.ui.message.val() || '';
if (this.model.get('showCaptcha')) {
values.captcha = this.ui.captcha.val() || '';
}
// Update model fields
this.model.set(values, {validate: true});
// Submit form
this.model.submit();
},
submitError: function(model, error) {
if (error.code == model.ERROR_WRONG_CAPTCHA && model.get('showCaptcha')) {
var src = this.ui.captchaImg.attr('src');
src = src.replace(/\?d\=[0-9]+/, '');
this.ui.captchaImg.attr(
'src',
src + '?d=' + (new Date()).getTime()
);
}
}
}
);
})(Mibew, Handlebars, _);

View File

@ -0,0 +1,40 @@
/**
* @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 leave message sent description
*/
Mibew.Views.LeaveMessageSentDescription = Backbone.Marionette.ItemView.extend(
/** @lends Mibew.Views.LeaveMessageSentDescription.prototype */
{
/**
* Template function
* @type Function
*/
template: Handlebars.templates.leave_message_sent_description,
/**
* Override Backbone.Marionette.ItemView.serializeData to pass some
* extra fields to template.
*
* Use undocumented feature of layouts: passing data to template via
* serializeData method.
*
* @returns {Object} Template data
*/
serializeData: function() {
return {
page: Mibew.Objects.Models.page.toJSON()
}
}
}
);
})(Mibew, Backbone, Handlebars);

View File

@ -0,0 +1,81 @@
/**
* @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 base class for survey form view
*/
Mibew.Views.BaseSurveyForm = Backbone.Marionette.ItemView.extend(
/** @lends Mibew.Views.BaseSurveyForm.prototype */
{
/**
* Map ui events to view methods.
* @type Object
*/
events: {
'change select[name="group"]': 'changeGroupDescription',
'submit form': 'preventSubmit'
},
/**
* Shortcuts for ui elements
* @type Object
*/
ui: {
groupSelect: 'select[name="group"]',
groupDescription: '#groupDescription',
name: 'input[name="name"]',
email: 'input[name="email"]',
message: 'textarea[name="message"]',
errors: '.errors'
},
/**
* Map model events to the view methods
* @type Object
*/
modelEvents: {
'invalid': 'showError',
'submit:error': 'showError'
},
/**
* Prevent form submitting
*/
preventSubmit: function(event) {
event.preventDefault();
},
/**
* Change group description
*/
changeGroupDescription: function() {
var groupId = this.ui.groupSelect.prop('selectedIndex');
var descriptions = this.model.get('groups').descriptions || [];
this.ui.groupDescription.text(descriptions[groupId] || '');
},
/**
* Display error messages
* @param Array errors Array of errors
*/
showError: function(model, error) {
var errorMessage;
if (typeof error == 'string') {
errorMessage = error;
} else {
errorMessage = error.message;
}
// TODO: Think about moving this to template
this.ui.errors.html(errorMessage);
}
}
);
})(Mibew, Backbone);

View File

@ -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, Handlebars, _){
// Create shortcut for base view
var BaseView = Mibew.Views.BaseSurveyForm;
/**
* @class Represents survey form view
*/
Mibew.Views.SurveyForm = BaseView.extend(
/** @lends Mibew.Views.SurveyForm.prototype */
{
/**
* Template function
* @type Function
*/
template: Handlebars.templates.survey_form,
/**
* Map ui events to view methods.
* The view inherits events from
* {@link Mibew.Views.BaseSurveyForm.prototype.events}.
* @type Object
*/
events: _.extend(
{},
BaseView.prototype.events,
{
'click #submit-survey': 'submitForm'
}
),
/**
* Check form field, update model field and call model.submit()
* method.
*/
submitForm: function() {
var values = {};
// Update group id
if (this.model.get('groups')) {
values.groupId = this.ui.groupSelect.val()
}
// Update name
if (this.model.get('canChangeName')) {
values.name = this.ui.name.val() || '';
}
// Update email
if (this.model.get('showEmail')) {
values.email = this.ui.email.val() || '';
}
// Update message
if (this.model.get('showMessage')) {
values.message = this.ui.message.val() || '';
}
// Update model fields
this.model.set(values, {validate: true});
// Submit form
this.model.submit();
}
}
);
})(Mibew, Handlebars, _);

View File

@ -0,0 +1,143 @@
/**
* @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, _){
// Create shortcut for base model
var BaseModel = Mibew.Models.BaseSurveyForm;
/**
* @class Represents leave message form model
*/
Mibew.Models.LeaveMessageForm = BaseModel.extend(
/** @lends Mibew.Models.LeaveMessageForm.prototype */
{
/**
* A list of default model values.
* The model inherits default values from
* {@link Mibew.Models.BaseSurveyForm.prototype.defaults}
* @type Object
*/
defaults : _.extend(
{},
BaseModel.prototype.defaults,
{
/**
* Indicate if captcha should be shown
* @type Boolean
*/
showCaptcha: false,
/**
* Value of captcha field
* @type String
*/
captcha: ''
}
),
/**
* Check attributes before set
* @param Object attributes Attributes hash for test
*/
validate: function(attributes) {
// Create some shortcuts
var l = Mibew.Localization;
// Check email
if (typeof attributes.email != 'undefined') {
if (! attributes.email) {
return l.get('leavemessage.error.email.required');
}
if(! Mibew.Utils.checkEmail(attributes.email)) {
return l.get('leavemessage.error.wrong.email');
}
}
// Check name
if (typeof attributes.name != 'undefined') {
if (! attributes.name) {
return l.get('leavemessage.error.name.required');
}
}
// Check message
if (typeof attributes.message != 'undefined') {
if (! attributes.message) {
return l.get('leavemessage.error.message.required');
}
}
// Check captcha
if (this.get('showCaptcha')) {
if (typeof attributes.captcha != 'undefined') {
if (! attributes.captcha) {
return l.get('errors.captcha');
}
}
}
},
/**
* Send form information to server
*/
submit: function() {
if (! this.validate(this.attributes)) {
var self = this;
Mibew.Objects.server.callFunctions(
[{
"function": "processLeaveMessage",
"arguments": {
"references": {},
"return": {},
"groupId": self.get('groupId'),
"name": self.get('name'),
"info": self.get('info'),
"email": self.get('email'),
"message": self.get('message'),
"referrer": self.get('referrer'),
"captcha": self.get('captcha'),
// There is no initialized thread yet
"threadId": null,
"token": null
}
}],
function(args){
if (args.errorCode == 0) {
self.trigger('submit:complete', self);
} else {
self.trigger(
'submit:error',
self,
{
code: args.errorCode,
message: args.errorMessage || ''
}
);
}
},
true
);
}
},
/** Error codes */
/**
* User enter wrong captcha value.
* Correspond ThreadProcessorException::ERROR_WRONG_CAPTCHA at
* server side.
*/
ERROR_WRONG_CAPTCHA: 10
/** End of error codes */
}
);
})(Mibew, _);

View File

@ -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 base class for survey form model
*/
Mibew.Models.BaseSurveyForm = Mibew.Models.Base.extend(
/** @lends Mibew.Models.BaseSurveyForm.prototype */
{
/**
* A list of default model values.
* @type Object
*/
defaults : {
/**
* User name
* @type String
*/
name: '',
/**
* User email
* @type String
*/
email: '',
/**
* User message
* @type String
*/
message: '',
/**
* User info
* @type String
*/
info: '',
/**
* Page that user came from
* @type String
*/
referrer: '',
/**
* Selected group id
* @type Number
*/
groupId: null,
/**
* Available groups list.
*
* Contains following keys:
* - 'select': string, HTML code for select box;
* - 'descriptions': array, groups descriptions;
* - 'defaultDescription': string, description for group that
* selected by default.
*
* If there is no available groups this field is equal to null.
* @type Object
* @todo Create HTML code at client side
*/
groups: null
}
}
);
})(Mibew);

View File

@ -0,0 +1,137 @@
/**
* @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, _){
// Create shortcut for base model
var BaseModel = Mibew.Models.BaseSurveyForm;
/**
* @class Represents survey form model
*/
Mibew.Models.SurveyForm = BaseModel.extend(
/** @lends Mibew.Models.SurveyForm.prototype */
{
/**
* A list of default model values.
* The model inherits default values from
* {@link Mibew.Models.BaseSurveyForm.prototype.defaults}
* @type Object
*/
defaults : _.extend(
{},
BaseModel.prototype.defaults,
{
/**
* Indicate if filed for email input should be shown
* @type Boolean
*/
showEmail: false,
/**
* Indicate if field for input first message should be shown
* @type Boolean
*/
showMessage: false,
/**
* Indicate if user name can be changed
*/
canChangeName: false
}
),
/**
* Check attributes before set
* @param Object attributes Attributes hash for test
*/
validate: function(attributes) {
// Check email
if (this.get('showEmail')) {
if (typeof attributes.email != 'undefined') {
if(! Mibew.Utils.checkEmail(attributes.email)) {
return Mibew.Localization.get(
'presurvey.error.wrong_email'
);
}
}
}
},
/**
* Send form information to server
*/
submit: function() {
if (! this.validate(this.attributes)) {
var self = this;
Mibew.Objects.server.callFunctions(
[{
"function": "processSurvey",
"arguments": {
"references": {},
"return": {
'next': 'next',
'options': 'options'
},
"groupId": self.get('groupId'),
"name": self.get('name'),
"info": self.get('info'),
"email": self.get('email'),
"message": self.get('message'),
"referrer": self.get('referrer'),
// There is no initialized thread yet
"threadId": null,
"token": null
}
}],
function(args){
if (args.errorCode == 0) {
self.trigger('submit:complete', self);
// Stop survey module
Mibew.Application.Survey.stop();
// Start next module
switch (args.next) {
case 'chat':
// Start chat module
Mibew.Application.Chat.start(
args.options
);
break;
case 'leaveMessage':
// Start leave message module
Mibew.Application.LeaveMessage.start(
args.options
);
break;
default:
throw new Error(
'Do not know how to continue!'
);
}
} else {
self.trigger(
'submit:error',
self,
{
code: args.errorCode,
message: args.errorMessage || ''
}
);
}
},
true
);
}
}
}
);
})(Mibew, _);

View File

@ -34,22 +34,23 @@
// Add module initializer
chat.addInitializer(function(options) {
// Create some shortcuts
var chatOptions = options.chatModule;
var objs = Mibew.Objects;
var models = Mibew.Objects.Models;
var controls = Mibew.Objects.Models.Controls;
var status = Mibew.Objects.Models.Status;
// Initialize Thread and User
models.thread = new Mibew.Models.Thread(chatOptions.thread);
models.user = new Mibew.Models.ChatUser(chatOptions.user);
// Update page options to change logo block
if (options.page) {
models.page.set(options.page);
}
// Initialize Page
models.page = new Mibew.Models.Page(options.page);
// Initialize Thread and User
models.thread = new Mibew.Models.Thread(options.thread);
models.user = new Mibew.Models.ChatUser(options.user);
// Create instance of the chat layout
var layout = new Mibew.Layouts.Chat();
Mibew.Objects.chatLayout = layout;
objs.chatLayout = layout;
// Show layout at page
app.mainRegion.show(layout);
@ -70,8 +71,8 @@
// Create mail control
controls.sendMail = new Mibew.Models.SendMailControl({
weight: 200,
link: chatOptions.links.mail,
windowParams: chatOptions.windowsParams.mail
link: options.links.mail,
windowParams: options.windowsParams.mail
});
ctrlsCollection.add(controls.sendMail);
}
@ -80,14 +81,14 @@
if (models.user.get('isAgent')) {
controls.redirect = new Mibew.Models.RedirectControl({
weight: 200,
link: chatOptions.links.redirect
link: options.links.redirect
});
ctrlsCollection.add(controls.redirect);
controls.history = new Mibew.Models.HistoryControl({
weight: 180,
link: chatOptions.links.history,
windowParams: chatOptions.windowsParams.history
link: options.links.history,
windowParams: options.windowsParams.history
});
ctrlsCollection.add(controls.history);
}
@ -104,10 +105,10 @@
});
ctrlsCollection.add(controls.refresh);
if (chatOptions.links.ssl) {
if (options.links.ssl) {
controls.secureMode = new Mibew.Models.SecureModeControl({
weight: 120,
link: chatOptions.links.ssl
link: options.links.ssl
});
ctrlsCollection.add(controls.secureMode);
}
@ -160,7 +161,7 @@
// Create message processor model
models.messageForm = new Mibew.Models.MessageForm(
chatOptions.messageForm
options.messageForm
);
// Display message processor

View File

@ -0,0 +1,70 @@
/**
* @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){
// Create shortcut for Application object
var app = Mibew.Application;
// Create LeaveMessage module
var leaveMessage = app.module('LeaveMessage', {startWithParent: false});
// Add module initializer
leaveMessage.addInitializer(function(options) {
// Create some shortcuts
var objs = Mibew.Objects;
var models = Mibew.Objects.Models;
// Update page options to change logo block
if (options.page) {
models.page.set(options.page);
}
// Create instance of the leave message layout
objs.leaveMessageLayout = new Mibew.Layouts.LeaveMessage();
// Show layout at page
app.mainRegion.show(objs.leaveMessageLayout);
// Create an instance of the leave message form
models.leaveMessageForm = new Mibew.Models.LeaveMessageForm(
options.leaveMessageForm
);
objs.leaveMessageLayout.leaveMessageFormRegion.show(
new Mibew.Views.LeaveMessageForm({
model: models.leaveMessageForm
})
);
objs.leaveMessageLayout.descriptionRegion.show(
new Mibew.Views.LeaveMessageDescription()
);
// When message sent form should be hide and description should be
// changed
models.leaveMessageForm.on('submit:complete', function() {
objs.leaveMessageLayout.leaveMessageFormRegion.close();
objs.leaveMessageLayout.descriptionRegion.close();
objs.leaveMessageLayout.descriptionRegion.show(
new Mibew.Views.LeaveMessageSentDescription()
);
});
});
// Add module finalizer
leaveMessage.addFinalizer(function() {
// Close layout
Mibew.Objects.leaveMessageLayout.close();
// Remove instance of leaveMessage form model
delete Mibew.Objects.Models.leaveMessageForm;
});
})(Mibew);

View File

@ -0,0 +1,49 @@
/**
* @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){
// Create shortcut for Application object
var app = Mibew.Application;
// Create an Survey module instance
var survey = app.module('Survey', {startWithParent: false});
// Add module initializer
survey.addInitializer(function(options) {
// Create some shortcuts
var objs = Mibew.Objects;
var models = Mibew.Objects.Models;
// Create instance of the survey layout
objs.surveyLayout = new Mibew.Layouts.Survey();
// Show layout at page
app.mainRegion.show(objs.surveyLayout);
// Create an instance of the survey form
models.surveyForm = new Mibew.Models.SurveyForm(
options.surveyForm
);
objs.surveyLayout.surveyFormRegion.show(new Mibew.Views.SurveyForm({
model: models.surveyForm
}));
});
// Add module finalizer
survey.addFinalizer(function() {
// Close layout
Mibew.Objects.surveyLayout.close();
// Remove instance of survey form model
delete Mibew.Objects.Models.surveyForm;
});
})(Mibew);

View File

@ -1,11 +0,0 @@
/**
* @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
*/
EventHelper.register(window, 'onload', function(){
MessageForm = new ClientForm(document.leaveMessageForm);
});

View File

@ -1,25 +0,0 @@
/**
* @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
*/
var SurveyForm = Class.create();
Class.inherit(SurveyForm, ClientForm, {
checkFields: function() {
if(this.form.email == null || this.form.email.getAttribute('type') == 'hidden') {
return null;
}
if(! this.emailIsValid(this.form.email)){
return this.localizedStrings.wrongEmail || '';
}
return null;
}
});
EventHelper.register(window, 'onload', function(){
Survey = new SurveyForm(document.surveyForm);
Survey.localize(localizedStrings);
});

View File

@ -1,145 +0,0 @@
<?php
/*
* Copyright 2005-2013 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
require_once('libs/init.php');
require_once('libs/chat.php');
require_once('libs/expand.php');
require_once('libs/groups.php');
require_once('libs/captcha.php');
require_once('libs/notify.php');
require_once('libs/classes/thread.php');
$errors = array();
$page = array();
function store_message($name, $email, $info, $message,$groupid,$referrer) {
global $current_locale;
$remoteHost = get_remote_host();
$userbrowser = $_SERVER['HTTP_USER_AGENT'];
$visitor = visitor_from_request();
$thread = Thread::create();
$thread->groupId = $groupid;
$thread->userName = $name;
$thread->remote = $remoteHost;
$thread->referer = $referrer;
$thread->locale = $current_locale;
$thread->userId = $visitor['id'];
$thread->userAgent = $userbrowser;
$thread->state = Thread::STATE_LEFT;
$thread->save();
if( $referrer ) {
$thread->postMessage(Thread::KIND_FOR_AGENT,getstring2('chat.came.from',array($referrer)));
}
if($email) {
$thread->postMessage(Thread::KIND_FOR_AGENT, getstring2('chat.visitor.email',array($email)));
}
if($info) {
$thread->postMessage(Thread::KIND_FOR_AGENT, getstring2('chat.visitor.info',array($info)));
}
$thread->postMessage(Thread::KIND_USER, $message, $name);
}
$groupid = "";
$groupname = "";
$group = NULL;
if(Settings::get('enablegroups') == '1') {
$groupid = verifyparam( "group", "/^\d{1,8}$/", "");
if($groupid) {
$group = group_by_id($groupid);
if(!$group) {
$groupid = "";
} else {
$groupname = get_group_name($group);
}
}
}
$email = getparam('email');
$visitor_name = getparam('name');
$message = getparam('message');
$info = getparam('info');
$referrer = urldecode(getparam("referrer"));
if( !$email ) {
$errors[] = no_field("form.field.email");
} else if( !$visitor_name ) {
$errors[] = no_field("form.field.name");
} else if( !$message ) {
$errors[] = no_field("form.field.message");
} else {
if( !is_valid_email($email)) {
$errors[] = wrong_field("form.field.email");
}
}
if(Settings::get("enablecaptcha") == "1" && can_show_captcha()) {
$captcha = getparam('captcha');
$original = isset($_SESSION["mibew_captcha"]) ? $_SESSION["mibew_captcha"] : "";
if(empty($original) || empty($captcha) || $captcha != $original) {
$errors[] = getlocal('errors.captcha');
}
unset($_SESSION['mibew_captcha']);
}
if( count($errors) > 0 ) {
$page = array_merge_recursive(
$page,
setup_logo($group),
setup_leavemessage($visitor_name,$email,$message,$groupid,$groupname,$info,$referrer)
);
expand("styles/dialogs", getchatstyle(), "leavemessage.tpl");
exit;
}
$message_locale = Settings::get('left_messages_locale');
if(!locale_exists($message_locale)) {
$message_locale = $home_locale;
}
store_message($visitor_name, $email, $info, $message, $groupid, $referrer);
$subject = getstring2_("leavemail.subject", array($visitor_name), $message_locale);
$body = getstring2_("leavemail.body", array($visitor_name,$email,$message,$info ? "$info\n" : ""), $message_locale);
if (isset($group) && !empty($group['vcemail'])) {
$inbox_mail = $group['vcemail'];
} else {
if (! is_null($group['parent'])) {
$parentgroup = group_by_id($group['parent']);
if ($parentgroup && !empty($parentgroup['vcemail'])) {
$inbox_mail = $parentgroup['vcemail'];
}
}
}
if (empty($inbox_mail)) {
$inbox_mail = Settings::get('email');
}
if($inbox_mail) {
webim_mail($inbox_mail, $email, $subject, $body);
}
$page = array_merge_recursive(
$page,
setup_logo($group)
);
expand("styles/dialogs", getchatstyle(), "leavemessagesent.tpl");
?>

View File

@ -156,42 +156,93 @@ function setup_logo($group = NULL) {
return $data;
}
/**
* Prepare values common for chat, prechat survey form and leave message form.
* @return array
*/
function prepare_chat_app_data() {
$data = array();
// Set enter key shortcut
if (Settings::get('sendmessagekey') == 'enter') {
$data['send_shortcut'] = "Enter";
} else {
$data['send_shortcut'] = is_mac_opera()
? "&#8984;-Enter"
: "Ctrl-Enter";
}
// Set refresh frequency
$data['frequency'] = Settings::get('updatefrequency_chat');
// Load JavaScript plugins and JavaScripts, CSS files required by them
$data['additional_css'] = get_additional_css('client_chat_window');
$data['additional_js'] = get_additional_js('client_chat_window');
$data['js_plugin_options'] = get_js_plugin_options('client_chat_window');
// Set some localized strings
$data['localized'] = array(
'email.required' => no_field("form.field.email"),
'name.required' => no_field("form.field.name"),
'message.required' => no_field("form.field.message"),
'wrong.email' => wrong_field("form.field.email")
);
return $data;
}
/**
* Prepare data to display leave message form
*
* @param string $name User name
* @param string $email User email
* @param string $message First message text
* @param int $groupid Id of selected group
* @param string $groupname Name of selected group
* @param int $group_id Id of selected group
* @param string $info User info
* @param string $referrer URL of referrer page
* @return array Array of leave message form data
*
* @todo Think about $info param. It seems to this param is meaningless.
*/
function setup_leavemessage($name, $email, $message, $groupid, $groupname, $info, $referrer) {
$data = array();
function setup_leavemessage($name, $email, $group_id, $info, $referrer) {
$data = prepare_chat_app_data();
$canshowcaptcha = can_show_captcha();
$data['formname'] = topage($name);
$data['formemail'] = topage($email);
$data['formmessage'] = $message ? topage($message) : "";
$data['showcaptcha'] = Settings::get("enablecaptcha") == "1" && $canshowcaptcha ? "1" : "";
$data['formgroupid'] = $groupid;
$data['formgroupname'] = $groupname;
$data['forminfo'] = topage($info);
$data['referrer'] = urlencode(topage($referrer));
// Create some empty arrays
$data['leaveMessage'] = array();
$group = group_by_id($group_id);
$group_name = '';
if ($group) {
$group_name = get_group_name($group);
}
$data['leaveMessage']['leaveMessageForm'] = array(
'name' => topage($name),
'email' => topage($email),
'groupId' => $group_id,
'groupName' => $group_name,
'info' => topage($info),
'referrer' => topage($referrer),
'showCaptcha' => (bool)(Settings::get("enablecaptcha") == "1"
&& can_show_captcha())
);
$data['page.title'] = (empty($group_name)?'':$group_name.': ')
. getlocal('leavemessage.title');
$data['leaveMessage']['page'] = array(
'title' => $data['page.title']
);
if (Settings::get('enablegroups') == '1') {
$groups = setup_groups_select($groupid, false);
$groups = setup_groups_select($group_id, false);
if ($groups) {
$data['groups'] = $groups['select'];
$data['group.descriptions'] = json_encode($groups['descriptions']);
$data['default.department.description'] = $groups['defaultdescription'];
$data['leaveMessage']['leaveMessageForm']['groups'] = array(
'select' => $groups['select'],
'descriptions' => $groups['descriptions'],
'defaultDescription' => $groups['defaultdescription']
);
}
}
$data['startFrom'] = 'leaveMessage';
return $data;
}
@ -200,34 +251,47 @@ function setup_leavemessage($name, $email, $message, $groupid, $groupname, $info
*
* @param string $name User name
* @param string $email User email
* @param int $groupid Id of selected group
* @param int $group_id Id of selected group
* @param string $info User info
* @param string $referrer URL of referrer page
* @return array Array of survey data
*
* @todo Think about $info param. It seems to this param is meaningless.
*/
function setup_survey($name, $email, $groupid, $info, $referrer) {
$data = array();
function setup_survey($name, $email, $group_id, $info, $referrer) {
$data = prepare_chat_app_data();
$data['formname'] = topage($name);
$data['formemail'] = topage($email);
$data['formgroupid'] = $groupid;
$data['forminfo'] = topage($info);
$data['referrer'] = urlencode(topage($referrer));
// Create some empty arrays
$data['survey'] = array();
if (Settings::get('enablegroups') == '1' && Settings::get('surveyaskgroup') == '1') {
$groups = setup_groups_select($groupid, true);
$data['survey']['surveyForm'] = array(
'name' => topage($name),
'groupId' => $group_id,
'email' => topage($email),
'info' => topage($info),
'referrer' => topage($referrer),
'showEmail' => (bool)(Settings::get("surveyaskmail") == "1"),
'showMessage' => (bool)(Settings::get("surveyaskmessage") == "1"),
'canChangeName' => (bool)(Settings::get('usercanchangename') == "1")
);
$data['page.title'] = getlocal('presurvey.title');
$data['survey']['page'] = array(
'title' => $data['page.title']
);
if (Settings::get('enablegroups') == '1'
&& Settings::get('surveyaskgroup') == '1') {
$groups = setup_groups_select($group_id, true);
if ($groups) {
$data['groups'] = $groups['select'];
$data['group.descriptions'] = json_encode($groups['descriptions']);
$data['default.department.description'] = $groups['defaultdescription'];
$data['survey']['surveyForm']['groups'] = array(
'select' => $groups['select'],
'descriptions' => $groups['descriptions'],
'defaultDescription' => $groups['defaultdescription'],
);
}
}
$data['showemail'] = Settings::get("surveyaskmail") == "1" ? "1" : "";
$data['showmessage'] = Settings::get("surveyaskmessage") == "1" ? "1" : "";
$data['showname'] = Settings::get('usercanchangename') == "1" ? "1" : "";
$data['startFrom'] = 'survey';
return $data;
}
@ -283,7 +347,7 @@ function setup_groups_select($groupid, $markoffline)
* @return array Array of chat view data
*/
function setup_chatview(Thread $thread) {
$data = array();
$data = prepare_chat_app_data();
// Get group info
if (! empty($thread->groupId)) {
@ -306,11 +370,14 @@ function setup_chatview(Thread $thread) {
'token' => $thread->lastToken
);
$data['chat.title'] = topage(
$data['page.title'] = topage(
empty($group['vcchattitle'])
? Settings::get('chattitle')
: $group['vcchattitle']
);
$data['chat']['page'] = array(
'title' => $data['page.title']
);
// Setup logo
$data = array_merge_recursive(
@ -320,12 +387,8 @@ function setup_chatview(Thread $thread) {
// Set enter key shortcut
if (Settings::get('sendmessagekey') == 'enter') {
$data['send_shortcut'] = "Enter";
$data['chat']['messageForm']['ignoreCtrl'] = true;
} else {
$data['send_shortcut'] = is_mac_opera()
? "&#8984;-Enter"
: "Ctrl-Enter";
$data['chat']['messageForm']['ignoreCtrl'] = false;
}
@ -333,9 +396,6 @@ function setup_chatview(Thread $thread) {
$data['isOpera95'] = is_agent_opera95();
$data['neediframesrc'] = needsFramesrc();
// Set refresh frequency
$data['frequency'] = Settings::get('updatefrequency_chat');
// Load dialogs style options
$style_config = get_dialogs_style_config(getchatstyle());
$data['chat']['windowsParams']['mail']
@ -346,6 +406,8 @@ function setup_chatview(Thread $thread) {
$data['chat']['windowsParams']['history']
= $style_config['history']['window_params'];
$data['startFrom'] = 'chat';
return $data;
}
@ -531,4 +593,75 @@ function get_remote_host()
return isset($_SERVER['REMOTE_HOST']) ? $_SERVER['REMOTE_HOST'] : $extAddr;
}
/**
* Start chat thread for user
*
* @global string $current_locale Current locale code
* @param int $group_id Id of group related to thread
* @param string $visitor_id Id of the visitor
* @param string $visitor_name Name of the visitor
* @param string $referrer Page user came from
* @param string $info User info
*/
function chat_start_for_user($group_id, $visitor_id, $visitor_name, $referrer, $info) {
global $current_locale;
// Get user info
$remote_host = get_remote_host();
$user_browser = $_SERVER['HTTP_USER_AGENT'];
// Check connection limit
if(Thread::connectionLimitReached($remote_host)) {
die("number of connections from your IP is exceeded, try again later");
}
// Create thread
$thread = Thread::create();
$thread->groupId = $group_id;
$thread->userName = $visitor_name;
$thread->remote = $remote_host;
$thread->referer = $referrer;
$thread->locale = $current_locale;
$thread->userId = $visitor_id;
$thread->userAgent = $user_browser;
$thread->state = Thread::STATE_LOADING;
$thread->save();
$_SESSION['threadid'] = $thread->id;
// Check if invitation accept
$operator = invitation_accept($_SESSION['visitorid'], $thread->id);
if ($operator) {
$operator = operator_by_id($operator);
$operator_name = get_operator_name($operator);
$thread->postMessage(
Thread::KIND_FOR_AGENT,
getstring2(
'chat.visitor.invitation.accepted',
array($operator_name)
)
);
}
// Send some messages
if ($referrer) {
$thread->postMessage(
Thread::KIND_FOR_AGENT,
getstring2('chat.came.from',array($referrer))
);
}
$thread->postMessage(Thread::KIND_INFO, getstring('chat.wait'));
// TODO: May be move sending this message somewhere else?
if ($info) {
$thread->postMessage(
Thread::KIND_FOR_AGENT,
getstring2('chat.visitor.info',array($info))
);
}
return $thread;
}
?>

View File

@ -403,6 +403,254 @@ class ThreadProcessor extends ClientSideProcessor {
'closed' => true
);
}
/**
* Process submitted prechat survey.
*
* @global string $namecookie Name of cookie that store visitor name
* @param array $args Associative array of arguments. It must contains
* following keys:
* - 'threadId': for this function this param equals to null;
* - 'token': for this function this param equals to null;
* - 'name': string, user name;
* - 'email': string, user email;
* - 'message': string, first user message;
* - 'info': string, some info about user;
* - 'referrer': page user came from;
* - 'groupId': selected group id.
* @return array Array of results. It contains following keys:
* - 'next': string, indicates what module run next;
* - 'options': options array for next module.
*/
protected function apiProcessSurvey($args) {
global $namecookie;
$visitor = visitor_from_request();
// Get form values
$first_message = $args['message'];
$info = $args['info'];
$email = $args['email'];
$referrer = $args['referrer'];
// Verify group id
$group_id = '';
$group = NULL;
if(Settings::get('enablegroups') == '1') {
if (preg_match("/^\d{1,8}$/", $args['groupId']) != 0) {
$group = group_by_id($args['groupId']);
if ($group) {
$group_id = $args['groupId'];
}
}
}
if(Settings::get('usercanchangename') == "1" && !empty($args['name'])) {
$newname = $args['name'];
if($newname != $visitor['name']) {
$data = strtr(
base64_encode(myiconv($webim_encoding,"utf-8",$newname)),
'+/=',
'-_,'
);
setcookie($namecookie, $data, time()+60*60*24*365);
$visitor['name'] = $newname;
}
}
// Check if there are online operators
if(!has_online_operators($group_id)) {
// Display leave message page
$client_data = setup_leavemessage(
$visitor['name'],
$email,
$group_id,
$info,
$referrer
);
$options = $client_data['leaveMessage'];
$options['page'] += setup_logo($group);
return array(
'next' => 'leaveMessage',
'options' => $options
);
}
// Initialize dialog
$thread = chat_start_for_user(
$group_id,
$visitor['id'],
$visitor['name'],
$referrer,
$info
);
// Send some messages
if($email) {
$thread->postMessage(
Thread::KIND_FOR_AGENT,
getstring2('chat.visitor.email',array($email))
);
}
if($first_message) {
$posted_id = $thread->postMessage(
Thread::KIND_USER,
$first_message,
$visitor['name']
);
$thread->shownMessageId = $posted_id;
$thread->save();
}
// Prepare chat options
$client_data = setup_chatview_for_user($thread);
$options = $client_data['chat'];
$options['page'] += setup_logo($group);
return array(
'next' => 'chat',
'options' => $options
);
}
/**
* Process submitted leave message form.
*
* Send message to operator email and create special meil thread.
* @global string $home_locale Code of the home locale
* @global string $current_locale Code of the current locale
* @param array $args Associative array of arguments. It must contains
* following keys:
* - 'threadId': for this function this param equals to null;
* - 'token': for this function this param equals to null;
* - 'name': string, user name;
* - 'email': string, user email;
* - 'message': string, user message;
* - 'info': string, some info about user;
* - 'referrer': string, page user came from;
* - 'captcha': string, captcha value;
* - 'groupId': selected group id.
*
* @throws ThreadProcessorException Can throw an exception if captcha or
* email is wrong.
*/
protected function apiProcessLeaveMessage($args) {
global $home_locale, $current_locale;
// Check captcha
if(Settings::get('enablecaptcha') == '1' && can_show_captcha()) {
$captcha = $args['captcha'];
$original = isset($_SESSION["mibew_captcha"])
? $_SESSION["mibew_captcha"]
: '';
unset($_SESSION['mibew_captcha']);
if(empty($original) || empty($captcha) || $captcha != $original) {
throw new ThreadProcessorException(
getlocal('errors.captcha'),
ThreadProcessorException::ERROR_WRONG_CAPTCHA
);
}
}
// Get form fields
$email = $args['email'];
$name = $args['name'];
$message = $args['message'];
$info = $args['info'];
$referrer = $args['referrer'];
if( !is_valid_email($email)) {
throw new ThreadProcessorException(
wrong_field("form.field.email"),
ThreadProcessorException::ERROR_WRONG_EMAIL
);
}
// Verify group id
$group_id = '';
if(Settings::get('enablegroups') == '1') {
if (preg_match("/^\d{1,8}$/", $args['groupId']) != 0) {
$group = group_by_id($args['groupId']);
if ($group) {
$group_id = $args['groupId'];
}
}
}
// Create thread for left message
$remote_host = get_remote_host();
$user_browser = $_SERVER['HTTP_USER_AGENT'];
$visitor = visitor_from_request();
// Get message locale
$message_locale = Settings::get('left_messages_locale');
if(!locale_exists($message_locale)) {
$message_locale = $home_locale;
}
// Create thread
$thread = Thread::create();
$thread->groupId = $groupid;
$thread->userName = $name;
$thread->remote = $remote_host;
$thread->referer = $referrer;
$thread->locale = $current_locale;
$thread->userId = $visitor['id'];
$thread->userAgent = $user_browser;
$thread->state = Thread::STATE_LEFT;
$thread->save();
// Send some messages
if ($referrer) {
$thread->postMessage(
Thread::KIND_FOR_AGENT,
getstring2('chat.came.from', array($referrer))
);
}
if($email) {
$thread->postMessage(
Thread::KIND_FOR_AGENT,
getstring2('chat.visitor.email', array($email))
);
}
if($info) {
$thread->postMessage(
Thread::KIND_FOR_AGENT,
getstring2('chat.visitor.info', array($info))
);
}
$thread->postMessage(Thread::KIND_USER, $message, $name);
// Get email for message
$inbox_mail = get_group_email($group_id);
if (empty($inbox_mail)) {
$inbox_mail = Settings::get('email');
}
// Send email
if($inbox_mail) {
// Prepare message to send by email
$subject = getstring2_("leavemail.subject",
array($args['name']),
$message_locale
);
$body = getstring2_(
"leavemail.body",
array(
$args['name'],
$email,
$message,
$info ? $info."\n" : ""
),
$message_locale
);
// Send
webim_mail($inbox_mail, $email, $subject, $body);
}
}
}
class ThreadProcessorException extends RequestProcessorException {
@ -442,6 +690,14 @@ class ThreadProcessorException extends RequestProcessorException {
* Wrong recipient value
*/
const WRONG_RECIPIENT_VALUE = 9;
/**
* Wrong captcha value
*/
const ERROR_WRONG_CAPTCHA = 10;
/**
* Wrong email address
*/
const ERROR_WRONG_EMAIL = 11;
}
?>

View File

@ -104,4 +104,28 @@ function get_top_level_group($group)
return is_null($group['parent'])?$group:group_by_id($group['parent']);
}
/**
* Try to load email for specified group or for its parent.
* @param int $group_id Group id
* @return string|boolean Email address or false if there is no email
*/
function get_group_email($group_id) {
// Try to get group email
$group = group_by_id($group_id);
if ($group && !empty($group['vcemail'])) {
return $group['vcemail'];
}
// Try to get parent group email
if (! is_null($group['parent'])) {
$group = group_by_id($group['parent']);
if ($group && !empty($group['vcemail'])) {
return $group['vcemail'];
}
}
// There is no email
return false;
}
?>

View File

@ -128,12 +128,8 @@ if ($pparam == "redirect") {
setup_redirect_links($threadid, $operator, $token);
expand("../styles/dialogs", getchatstyle(), "redirect.tpl");
} else {
// Load JavaScript plugins and JavaScripts, CSS files required by them
$page['additional_css'] = get_additional_css('agent_chat_window');
$page['additional_js'] = get_additional_js('agent_chat_window');
$page['js_plugin_options'] = get_js_plugin_options('agent_chat_window');
// Build js application options
$page['chatModule'] = json_encode($page['chat']);
$page['chatOptions'] = json_encode($page['chat']);
// Expand page
expand("../styles/dialogs", getchatstyle(), "chat.tpl");
}

View File

@ -110,6 +110,12 @@ img {
height: 16px;
background: transparent url("images/buttons.gif") scroll no-repeat 0 0;
}
.iclosewin {
background-position: -128px -16px;
}
a:hover .iclosewin {
background-position: -128px 0;
}
.close-control .tpl-image {
background-position: -128px -16px;
}
@ -377,6 +383,8 @@ img {
}
.wndbr .buttons {
top: 14px;
position: absolute;
right: 25px;
}
#headers {
padding: 0 10px;

View File

@ -1,3 +1,30 @@
{{! Chat window top. Includes logo and some info about company}}
<div id="top">
<div id="logo">
{{#if page.company.chatLogoURL}}
{{! Use 'unless' instead of 'if' because of the bug with nested 'if else' in handlebars 1.0.0-rc.3}}
{{#unless page.webimHost}}
<img src="{{page.company.chatLogoURL}}" alt=""/>
{{else}}
<a onclick="window.open('{{page.webimHost}}');return false;" href="{{page.webimHost}}">
<img src="{{page.company.chatLogoURL}}" alt=""/>
</a>
{{/unless}}
{{else}}
{{#if page.webimHost}}
<a onclick="window.open('{{page.webimHost}}');return false;" href="{{page.webimHost}}">
<img src="{{page.tplRoot}}/images/default-logo.gif" alt=""/>
</a>
{{else}}
<img src="{{page.tplRoot}}/images/default-logo.gif" alt=""/>
{{/if}}
{{/if}}
&nbsp;
<div id="page-title">{{page.title}}</div>
<div class="clear">&nbsp;</div>
</div>
</div>
{{! Chat header}}
<div id="chat-header">
<div class="bgc"><div class="bgl"><div class="bgr">

View File

@ -0,0 +1,6 @@
<div class="buttons">
<a href="javascript:window.close();" title="{{L10n "leavemessage.close"}}">
<img class="tpl-image iclosewin" src="{{page.webimRoot}}/images/free.gif" alt="{{L10n "leavemessage.close"}}" />
</a>
</div>
<div class="messagetxt">{{L10n "leavemessage.descr"}}</div>

View File

@ -0,0 +1,43 @@
<form name="leaveMessageForm" method="post" action="">
<input type="hidden" name="style" value="{{page.style}}"/>
<input type="hidden" name="info" value="{{info}}"/>
<input type="hidden" name="referrer" value="{{referrer}}"/>
{{#unless groups}}{{#if groupId}}<input type="hidden" name="group" value="{{groupId}}"/>{{/if}}{{/unless}}
<div class="errors"></div>
<table cellspacing="1" cellpadding="5" border="0" class="form">
<tr>
<td><strong>{{L10n "form.field.email"}}:</strong></td>
<td><input type="text" name="email" size="50" value="{{email}}" class="username"/></td>
</tr>
<tr>
<td><strong>{{L10n "form.field.name"}}:</strong></td>
<td><input type="text" name="name" size="50" value="{{name}}" class="username"/></td>
</tr>
{{#if groups}}
<tr>
<td class="text"><strong>{{L10n "form.field.department"}}</strong></td>
<td><select name="group" style="min-width:200px;">{{{groups.select}}}</select></td>
</tr>
<tr>
<td class="text"><strong>{{L10n "form.field.department.description"}}</strong></td>
<td class="text" id="groupDescription">{{groups.defaultDescription}}</td>
</tr>
{{/if}}
<tr>
<td><strong>{{L10n "form.field.message"}}:</strong></td>
<td valign="top">
<textarea name="message" tabindex="0" cols="40" rows="5">{{message}}</textarea>
</td>
</tr>
{{#if showCaptcha}}
<tr>
<td><img id="captcha-img" src="captcha.php"/></td>
<td><input type="text" name="captcha" size="50" maxlength="15" value="" class="username"/></td>
</tr>
{{/if}}
</table>
<a href="javascript:void(0);" class="but" id="send-message">{{L10n "mailthread.perform"}}</a>
<div class="clear">&nbsp;</div>
</form>

View File

@ -0,0 +1,35 @@
{{! Logo block}}
<div id="top2">
<div id="logo">
{{#if page.company.chatLogoURL}}
{{! Use 'unless' instead of 'if' because of the bug with nested 'if else' in handlebars 1.0.0-rc.3}}
{{#unless page.webimHost}}
<img src="{{page.company.chatLogoURL}}" alt=""/>
{{else}}
<a onclick="window.open('{{page.webimHost}}');return false;" href="{{page.webimHost}}">
<img src="{{page.company.chatLogoURL}}" alt=""/>
</a>
{{/unless}}
{{else}}
{{#if page.webimHost}}
<a onclick="window.open('{{page.webimHost}}');return false;" href="{{page.webimHost}}">
<img src="{{page.tplRoot}}/images/default-logo.gif" alt=""/>
</a>
{{else}}
<img src="{{page.tplRoot}}/images/default-logo.gif" alt=""/>
{{/if}}
{{/if}}
&nbsp;
<div id="page-title">{{page.title}}</div>
<div class="clear">&nbsp;</div>
</div>
</div>
{{! Header block. Contains description}}
<div id="headers">
<div class="wndb"><div class="wndl"><div class="wndr"><div class="wndt"><div class="wndtl"><div class="wndtr"><div class="wndbl"><div class="wndbr" id="description-region">
</div></div></div></div></div></div></div></div>
</div>
{{! Empty container for main content}}
<div id="content-wrapper"></div>

View File

@ -0,0 +1,6 @@
<div class="buttons">
<a href="javascript:window.close();" title="{{L10n "chat.mailthread.sent.close"}}">
<img class="tpl-image iclosewin" src="{{page.webimRoot}}/images/free.gif" alt="{{L10n "chat.mailthread.sent.close"}}" />
</a>
</div>
<div class="messagetxt">{{L10n "leavemessage.sent.message"}}</div>

View File

@ -0,0 +1,42 @@
<form name="surveyForm" method="post" action="">
<input type="hidden" name="style" value="{{page.style}}"/>
<input type="hidden" name="info" value="{{info}}"/>
<input type="hidden" name="referrer" value="{{referrer}}"/>
<input type="hidden" name="survey" value="on"/>
{{#unless showEmail}}<input type="hidden" name="email" value="{{email}}"/>{{/unless}}
{{#unless groups}}{{#if groupId}}<input type="hidden" name="group" value="{{groupId}}"/>{{/if}}{{/unless}}
{{#unless showMessage}}<input type="hidden" name="message" value="{{message}}"/>{{/unless}}
<div class="errors"></div>
<table class="form">
{{#if groups}}
<tr>
<td><strong>{{L10n "form.field.department"}}</strong></td>
<td><select name="group">{{{groups.select}}}</select></td>
</tr>
<tr>
<td><strong>{{L10n "form.field.department.description"}}</strong></td>
<td id="groupDescription">{{groups.defaultDescription}}</td>
</tr>
{{/if}}
<tr>
<td><strong>{{L10n "presurvey.name"}}</strong></td>
<td><input type="text" name="name" size="50" value="{{name}}" class="username" {{#unless canChangeName}}disabled="disabled"{{/unless}}/></td>
</tr>
{{#if showEmail}}
<tr>
<td><strong>{{L10n "presurvey.mail"}}</strong></td>
<td><input type="text" name="email" size="50" value="{{email}}" class="username"/></td>
</tr>
{{/if}}
{{#if showMessage}}
<tr>
<td><strong>{{L10n "presurvey.question"}}</strong></td>
<td valign="top"><textarea name="message" tabindex="0" cols="45" rows="2">{{message}}</textarea></td>
</tr>
{{/if}}
</table>
<a href="javascript:void(0);" class="but" id="submit-survey">{{L10n "presurvey.submit"}}</a>
<div class="clear">&nbsp;</div>
</form>

View File

@ -0,0 +1,39 @@
{{! Logo block}}
<div id="top2">
<div id="logo">
{{#if page.company.chatLogoURL}}
{{! Use 'unless' instead of 'if' because of the bug with nested 'if else' in handlebars 1.0.0-rc.3}}
{{#unless page.webimHost}}
<img src="{{page.company.chatLogoURL}}" alt=""/>
{{else}}
<a onclick="window.open('{{page.webimHost}}');return false;" href="{{page.webimHost}}">
<img src="{{page.company.chatLogoURL}}" alt=""/>
</a>
{{/unless}}
{{else}}
{{#if page.webimHost}}
<a onclick="window.open('{{page.webimHost}}');return false;" href="{{page.webimHost}}">
<img src="{{page.tplRoot}}/images/default-logo.gif" alt=""/>
</a>
{{else}}
<img src="{{page.tplRoot}}/images/default-logo.gif" alt=""/>
{{/if}}
{{/if}}
&nbsp;
<div id="page-title">{{page.title}}</div>
<div class="clear">&nbsp;</div>
</div>
</div>
{{! Header block. Contains description and close link}}
<div id="headers">
<div class="wndb"><div class="wndl"><div class="wndr"><div class="wndt"><div class="wndtl"><div class="wndtr"><div class="wndbl"><div class="wndbr">
<div class="buttons">
<a href="javascript:window.close();" title="{{L10n "leavemessage.close"}}"><img class="tpl-image iclosewin" src="{{page.webimRoot}}/images/free.gif" alt="{{L10n "leavemessage.close"}}" /></a>
</div>
<div class="messagetxt">{{L10n "presurvey.intro"}}</div>
</div></div></div></div></div></div></div></div>
</div>
{{! Empty container for main content}}
<div id="content-wrapper"></div>

View File

@ -4,23 +4,57 @@
Copyright (c) 2005-2011 Mibew Messenger Community
License: http://mibew.org/license.php
*/
(function(){var l=Handlebars.template,n=Handlebars.templates=Handlebars.templates||{};n.user_name_control=l(function(d,b,e,g,a){function c(a,d){var c,f,b;c=""+('\n <div class="user-name-control-input-bg"><input id="user-name-control-input" type="text" size="12" value="'+j((f=(f=a.user,null==f||!1===f?f:f.name),typeof f===q?f.apply(a):f))+'" class="username" /></div>\n <a href="javascript:void(0)" class="user-name-control-set tpl-image" title="');b={hash:{},data:d};return c+=j((f=e.L10n,
f?f.call(a,"chat.client.changename",b):m.call(a,"L10n","chat.client.changename",b)))+'"></a>\n '}function k(a,d){var c,f,b;b={hash:{},data:d};c='\n <a href="javascript:void(0)" title="'+(j((f=e.L10n,f?f.call(a,"chat.client.changename",b):m.call(a,"L10n","chat.client.changename",b)))+'">'+j((f=(f=a.user,null==f||!1===f?f:f.name),typeof f===q?f.apply(a):f))+'</a>\n <a class="user-name-control-change tpl-image" title="');b={hash:{},data:d};return c+=j((f=e.L10n,f?f.call(a,"chat.client.changename",
b):m.call(a,"L10n","chat.client.changename",b)))+'"></a>\n '}this.compilerInfo=[2,">= 1.0.0-rc.3"];e=e||d.helpers;a=a||{};var h,q="function",j=this.escapeExpression,m=e.helperMissing,p=this;return(d=e["if"].call(b,(h=b.user,null==h||!1===h?h:h.canChangeName),{hash:{},inverse:p.program(6,function(a,d){var b,c;b={hash:{},data:d};return b="\n"+(j((c=e.L10n,c?c.call(a,"chat.client.name",b):m.call(a,"L10n","chat.client.name",b)))+"&nbsp;"+j((c=(c=a.user,null==c||!1===c?c:c.name),typeof c===q?c.apply(a):
c))+"\n")},a),fn:p.program(1,function(a,d){var b,f;b={hash:{},data:d};b='\n <span class="user-name-control-prefix">'+(j((f=e.L10n,f?f.call(a,"chat.client.name",b):m.call(a,"L10n","chat.client.name",b)))+"</span>\n ");if((f=e["if"].call(a,a.nameInput,{hash:{},inverse:p.program(4,k,d),fn:p.program(2,c,d),data:d}))||0===f)b+=f;return b+="\n"},a),data:a}))||0===d?d:""});n.status_typing=l(function(d,b,e,g,a){this.compilerInfo=[2,">= 1.0.0-rc.3"];e=e||d.helpers;a=a||{};var c;d=e.helperMissing;g=this.escapeExpression;
a={hash:{},data:a};return g((c=e.L10n,c?c.call(b,"typing.remote",a):d.call(b,"L10n","typing.remote",a)))});n.chat_layout=l(function(d,b,e,g,a){this.compilerInfo=[2,">= 1.0.0-rc.3"];e=e||d.helpers;a=a||{};var c,k;g=e.helperMissing;var h=this.escapeExpression;d='\n<div id="chat-header">\n <div class="bgc"><div class="bgl"><div class="bgr">\n \n <div id="controls-region"></div>\n </div></div></div>\n</div>\n\n\n<div id="chat">\n <div class="bgl"><div class="bgr"><div class="sdwbgc"><div class="sdwbgl"><div class="sdwbgr">\n ';
if((k=e.unless.call(b,(c=b.user,null==c||!1===c?c:c.isAgent),{hash:{},inverse:this.noop,fn:this.program(1,function(){return'\n <div id="avatar-region"></div>\n '},a),data:a}))||0===k)d+=k;a={hash:{},data:a};return d=d+'\n \n <div id="messages-region"></div>\n \n <div id="status-region"></div>\n </div></div></div></div></div>\n</div>\n\n\n<div id="message-form-region"></div>\n\n\n<div id="footer">'+(h((c=e.L10n,c?c.call(b,"chat.window.poweredby",a):g.call(b,
"L10n","chat.window.poweredby",a)))+' <a id="poweredByLink" href="http://mibew.org" title="Mibew Community" target="_blank">mibew.org</a></div>\n\n\n<div id="sound-region"></div>')});n.avatar=l(function(d,b,e,g,a){this.compilerInfo=[2,">= 1.0.0-rc.3"];e=e||d.helpers;a=a||{};var c=this.escapeExpression;return(d=e["if"].call(b,b.imageLink,{hash:{},inverse:this.program(3,function(){return'<div class="default-avatar"></div>'},a),fn:this.program(1,function(a,d){var b,j;b='<img src="';(j=e.imageLink)?j=
j.call(a,{hash:{},data:d}):(j=a.imageLink,j="function"===typeof j?j.apply(a):j);return b+=c(j)+'" border="0" alt="" />'},a),data:a}))||0===d?d:""});n.close_control=l(function(d,b,e,g,a){this.compilerInfo=[2,">= 1.0.0-rc.3"];e=e||d.helpers;a=a||{};var c;d=e.helperMissing;g=this.escapeExpression;a={hash:{},data:a};return b='<div class="tpl-image" title="'+(g((c=e.L10n,c?c.call(b,"chat.window.close_title",a):d.call(b,"L10n","chat.window.close_title",a)))+'"></div>')});n.history_control=l(function(d,
b,e,g,a){this.compilerInfo=[2,">= 1.0.0-rc.3"];e=e||d.helpers;a=a||{};var c;d=e.helperMissing;g=this.escapeExpression;a={hash:{},data:a};return b='<div class="tpl-image" title="'+(g((c=e.L10n,c?c.call(b,"page.analysis.userhistory.title",a):d.call(b,"L10n","page.analysis.userhistory.title",a)))+'"></div>')});n.status_message=l(function(d,b,e,g,a){this.compilerInfo=[2,">= 1.0.0-rc.3"];e=e||d.helpers;a=a||{};d=this.escapeExpression;(e=e.message)?e=e.call(b,{hash:{},data:a}):(e=b.message,e="function"===
typeof e?e.apply(b):e);return d(e)});n.secure_mode_control=l(function(){this.compilerInfo=[2,">= 1.0.0-rc.3"];return'<div class="tpl-image" title="SSL"></div>'});n.sound_control=l(function(d,b,e,g,a){this.compilerInfo=[2,">= 1.0.0-rc.3"];e=e||d.helpers;a=a||{};var c=e.helperMissing,k=this.escapeExpression;return(d=e["if"].call(b,b.enabled,{hash:{},inverse:this.program(3,function(a,d){var b,m;b={hash:{},data:d};return b='\n <div class="tpl-image sound-control-off" title="'+(k((m=e.L10n,m?m.call(a,
"chat.window.toolbar.turn_on_sound",b):c.call(a,"L10n","chat.window.toolbar.turn_on_sound",b)))+'"></div>\n')},a),fn:this.program(1,function(a,d){var b,m;b={hash:{},data:d};return b='\n <div class="tpl-image sound-control-on" title="'+(k((m=e.L10n,m?m.call(a,"chat.window.toolbar.turn_off_sound",b):c.call(a,"L10n","chat.window.toolbar.turn_off_sound",b)))+'"></div>\n')},a),data:a}))||0===d?d:""});n.message=l(function(d,b,e,g,a){this.compilerInfo=[2,">= 1.0.0-rc.3"];e=e||d.helpers;a=a||{};var c,
k=this.escapeExpression,h=e.helperMissing;d={hash:{},data:a};d="<span>"+(k((c=e.formatTime,c?c.call(b,b.created,d):h.call(b,"formatTime",b.created,d)))+"</span> \n");if((c=e["if"].call(b,b.name,{hash:{},inverse:this.noop,fn:this.program(1,function(a,b){var d,c;d="<span class='n";(c=e.kindName)?c=c.call(a,{hash:{},data:b}):(c=a.kindName,c="function"===typeof c?c.apply(a):c);d+=k(c)+"'>";(c=e.name)?c=c.call(a,{hash:{},data:b}):(c=a.name,c="function"===typeof c?c.apply(a):c);return d+=k(c)+"</span>: "},
a),data:a}))||0===c)d+=c;d+="\n<span class='m";(c=e.kindName)?c=c.call(b,{hash:{},data:a}):(c=b.kindName,c="function"===typeof c?c.apply(b):c);d+=k(c)+"'>";if((c=e["if"].call(b,b.allowFormatting,{hash:{},inverse:this.program(5,function(a,d){var b,c;c={hash:{},data:d};return k((b=e.apply,b?b.call(a,a.message,"urlReplace, nl2br",c):h.call(a,"apply",a.message,"urlReplace, nl2br",c)))},a),fn:this.program(3,function(a,d){var b,c;c={hash:{},data:d};return k((b=e.apply,b?b.call(a,a.message,"urlReplace, nl2br, allowTags",
c):h.call(a,"apply",a.message,"urlReplace, nl2br, allowTags",c)))},a),data:a}))||0===c)d+=c;return d+="</span><br/>"});n.message_form=l(function(d,b,e,g,a){function c(a,b){var c,d;c={hash:{},data:b};c='\n <select id="predefined" size="1" class="answer">\n <option>'+(j((d=e.L10n,d?d.call(a,"chat.window.predefined.select_answer",c):m.call(a,"L10n","chat.window.predefined.select_answer",c)))+"</option>\n ");if((d=e.each.call(a,a.predefinedAnswers,{hash:{},
inverse:p.noop,fn:p.program(5,k,b),data:b}))||0===d)c+=d;return c+="\n </select>\n "}function k(a){var c;return a=""+("\n <option>"+j((c=a["short"],typeof c===l?c.apply(a):c))+"</option>\n ")}this.compilerInfo=[2,">= 1.0.0-rc.3"];e=e||d.helpers;a=a||{};var h,l="function",j=this.escapeExpression,m=e.helperMissing,p=this;d='<div id="message">\n';if((g=e["if"].call(b,(h=b.user,null==h||!1===h?h:h.canPost),{hash:{},inverse:p.noop,fn:p.program(1,
function(){return'\n <div class="bgc"><div class="bgl"><div class="bgr">\n <textarea id="message-input" class="message" tabindex="0" rows="4" cols="10"></textarea>\n </div></div></div>\n'},a),data:a}))||0===g)d+=g;d+='\n</div>\n\n<div id="send">\n';if((g=e["if"].call(b,(h=b.user,null==h||!1===h?h:h.canPost),{hash:{},inverse:p.noop,fn:p.program(3,function(a,d){var b,f,g;b='\n <div id="postmessage">\n <div id="predefined-wrapper">\n ';if((g=e["if"].call(a,(f=a.user,
null==f||!1===f?f:f.isAgent),{hash:{},inverse:p.noop,fn:p.program(4,c,d),data:d}))||0===g)b+=g;g={hash:{},data:d};b=b+'\n </div>\n <a href="javascript:void(0)" id="send-message" title="'+(j((f=e.L10n,f?f.call(a,"chat.window.send_message",g):m.call(a,"L10n","chat.window.send_message",g)))+'">');g={hash:{},data:d};return b+=j((f=e.L10n,f?f.call(a,"chat.window.send_message_short_and_shortcut",g):m.call(a,"L10n","chat.window.send_message_short_and_shortcut",g)))+"</a>\n </div>\n"},a),
data:a}))||0===g)d+=g;return d+'\n</div>\n<div class="clear"></div>'});n.send_mail_control=l(function(d,b,e,g,a){this.compilerInfo=[2,">= 1.0.0-rc.3"];e=e||d.helpers;a=a||{};var c;d=e.helperMissing;g=this.escapeExpression;a={hash:{},data:a};return b='<div class="tpl-image" title="'+(g((c=e.L10n,c?c.call(b,"chat.window.toolbar.mail_history",a):d.call(b,"L10n","chat.window.toolbar.mail_history",a)))+'"></div>')});n.refresh_control=l(function(d,b,e,g,a){this.compilerInfo=[2,">= 1.0.0-rc.3"];e=e||d.helpers;
a=a||{};var c;d=e.helperMissing;g=this.escapeExpression;a={hash:{},data:a};return b='<div class="tpl-image" title="'+(g((c=e.L10n,c?c.call(b,"chat.window.toolbar.refresh",a):d.call(b,"L10n","chat.window.toolbar.refresh",a)))+'"></div>')});n.redirect_control=l(function(d,b,e,g,a){this.compilerInfo=[2,">= 1.0.0-rc.3"];e=e||d.helpers;a=a||{};var c,k=e.helperMissing,h=this.escapeExpression;return(d=e["if"].call(b,(c=b.user,null==c||!1===c?c:c.canPost),{hash:{},inverse:this.noop,fn:this.program(1,function(a,
c){var b,d;b={hash:{},data:c};return b='\n<div class="tpl-image" title="'+(h((d=e.L10n,d?d.call(a,"chat.window.toolbar.redirect_user",b):k.call(a,"L10n","chat.window.toolbar.redirect_user",b)))+'"></div>\n')},a),data:a}))||0===d?d:""});n.status=l(function(d,b,e,g,a){this.compilerInfo=[2,">= 1.0.0-rc.3"];e=e||d.helpers;a=a||{};d=this.escapeExpression;(e=e.title)?e=e.call(b,{hash:{},data:a}):(e=b.title,e="function"===typeof e?e.apply(b):e);return d(e)})})();
(function(){var r=Handlebars.template,s=Handlebars.templates=Handlebars.templates||{};s.user_name_control=r(function(a,e,f,b,c){function j(a,b){var d,g,c;d=""+('\n <div class="user-name-control-input-bg"><input id="user-name-control-input" type="text" size="12" value="'+h((g=(g=a.user,null==g||!1===g?g:g.name),typeof g===p?g.apply(a):g))+'" class="username" /></div>\n <a href="javascript:void(0)" class="user-name-control-set tpl-image" title="');c={hash:{},data:b};return d+=h((g=f.L10n,
g?g.call(a,"chat.client.changename",c):m.call(a,"L10n","chat.client.changename",c)))+'"></a>\n '}function k(a,b){var d,g,c;c={hash:{},data:b};d='\n <a href="javascript:void(0)" title="'+(h((g=f.L10n,g?g.call(a,"chat.client.changename",c):m.call(a,"L10n","chat.client.changename",c)))+'">'+h((g=(g=a.user,null==g||!1===g?g:g.name),typeof g===p?g.apply(a):g))+'</a>\n <a class="user-name-control-change tpl-image" title="');c={hash:{},data:b};return d+=h((g=f.L10n,g?g.call(a,"chat.client.changename",
c):m.call(a,"L10n","chat.client.changename",c)))+'"></a>\n '}this.compilerInfo=[2,">= 1.0.0-rc.3"];f=f||a.helpers;c=c||{};var l,p="function",h=this.escapeExpression,m=f.helperMissing,n=this;return(a=f["if"].call(e,(l=e.user,null==l||!1===l?l:l.canChangeName),{hash:{},inverse:n.program(6,function(a,b){var d,g;d={hash:{},data:b};return d="\n"+(h((g=f.L10n,g?g.call(a,"chat.client.name",d):m.call(a,"L10n","chat.client.name",d)))+"&nbsp;"+h((g=(g=a.user,null==g||!1===g?g:g.name),typeof g===p?g.apply(a):
g))+"\n")},c),fn:n.program(1,function(a,b){var d,g;d={hash:{},data:b};d='\n <span class="user-name-control-prefix">'+(h((g=f.L10n,g?g.call(a,"chat.client.name",d):m.call(a,"L10n","chat.client.name",d)))+"</span>\n ");if((g=f["if"].call(a,a.nameInput,{hash:{},inverse:n.program(4,k,b),fn:n.program(2,j,b),data:b}))||0===g)d+=g;return d+="\n"},c),data:c}))||0===a?a:""});s.status_typing=r(function(a,e,f,b,c){this.compilerInfo=[2,">= 1.0.0-rc.3"];f=f||a.helpers;c=c||{};var j;a=f.helperMissing;b=this.escapeExpression;
c={hash:{},data:c};return b((j=f.L10n,j?j.call(e,"typing.remote",c):a.call(e,"L10n","typing.remote",c)))});s.leave_message_form=r(function(a,e,f,b,c){function j(a,b){var c,d;c='<input type="hidden" name="group" value="';(d=f.groupId)?d=d.call(a,{hash:{},data:b}):(d=a.groupId,d=typeof d===l?d.apply(a):d);return c+=p(d)+'"/>'}this.compilerInfo=[2,">= 1.0.0-rc.3"];f=f||a.helpers;c=c||{};var k,l="function",p=this.escapeExpression,h=this,m=f.helperMissing;a=""+('<form name="leaveMessageForm" method="post" action="">\n <input type="hidden" name="style" value="'+
p((k=(k=e.page,null==k||!1===k?k:k.style),typeof k===l?k.apply(e):k))+'"/>\n <input type="hidden" name="info" value="');(b=f.info)?b=b.call(e,{hash:{},data:c}):(b=e.info,b=typeof b===l?b.apply(e):b);a+=p(b)+'"/>\n <input type="hidden" name="referrer" value="';(b=f.referrer)?b=b.call(e,{hash:{},data:c}):(b=e.referrer,b=typeof b===l?b.apply(e):b);a+=p(b)+'"/>\n ';if((b=f.unless.call(e,e.groups,{hash:{},inverse:h.noop,fn:h.program(1,function(a,b){var c;return(c=f["if"].call(a,a.groupId,{hash:{},
inverse:h.noop,fn:h.program(2,j,b),data:b}))||0===c?c:""},c),data:c}))||0===b)a+=b;b={hash:{},data:c};a=a+'\n\n <div class="errors"></div>\n\n <table cellspacing="1" cellpadding="5" border="0" class="form">\n <tr>\n <td><strong>'+(p((k=f.L10n,k?k.call(e,"form.field.email",b):m.call(e,"L10n","form.field.email",b)))+':</strong></td>\n <td><input type="text" name="email" size="50" value="');(b=f.email)?b=b.call(e,{hash:{},data:c}):(b=e.email,b=typeof b===l?b.apply(e):
b);a+=p(b)+'" class="username"/></td>\n </tr>\n <tr>\n <td><strong>';b={hash:{},data:c};a+=p((k=f.L10n,k?k.call(e,"form.field.name",b):m.call(e,"L10n","form.field.name",b)))+':</strong></td>\n <td><input type="text" name="name" size="50" value="';(b=f.name)?b=b.call(e,{hash:{},data:c}):(b=e.name,b=typeof b===l?b.apply(e):b);a+=p(b)+'" class="username"/></td>\n </tr>\n ';if((b=f["if"].call(e,e.groups,{hash:{},inverse:h.noop,fn:h.program(4,function(a,b){var c,
d,g;g={hash:{},data:b};c='\n <tr>\n <td class="text"><strong>'+(p((d=f.L10n,d?d.call(a,"form.field.department",g):m.call(a,"L10n","form.field.department",g)))+'</strong></td>\n <td><select name="group" style="min-width:200px;">');if((g=(d=(d=a.groups,null==d||!1===d?d:d.select),typeof d===l?d.apply(a):d))||0===g)c+=g;c+='</select></td>\n </tr>\n <tr>\n <td class="text"><strong>';g={hash:{},data:b};return c+=p((d=f.L10n,d?d.call(a,"form.field.department.description",
g):m.call(a,"L10n","form.field.department.description",g)))+'</strong></td>\n <td class="text" id="groupDescription">'+p((d=(d=a.groups,null==d||!1===d?d:d.defaultDescription),typeof d===l?d.apply(a):d))+"</td>\n </tr>\n "},c),data:c}))||0===b)a+=b;a+="\n <tr>\n <td><strong>";b={hash:{},data:c};a+=p((k=f.L10n,k?k.call(e,"form.field.message",b):m.call(e,"L10n","form.field.message",b)))+':</strong></td>\n <td valign="top">\n <textarea name="message" tabindex="0" cols="40" rows="5">';
(b=f.message)?b=b.call(e,{hash:{},data:c}):(b=e.message,b=typeof b===l?b.apply(e):b);a+=p(b)+"</textarea>\n </td>\n </tr>\n ";if((b=f["if"].call(e,e.showCaptcha,{hash:{},inverse:h.noop,fn:h.program(6,function(){return'\n <tr>\n <td><img id="captcha-img" src="captcha.php"/></td>\n <td><input type="text" name="captcha" size="50" maxlength="15" value="" class="username"/></td>\n </tr>\n '},c),data:c}))||0===b)a+=b;a+='\n </table>\n <a href="javascript:void(0);" class="but" id="send-message">';
b={hash:{},data:c};return a+=p((k=f.L10n,k?k.call(e,"mailthread.perform",b):m.call(e,"L10n","mailthread.perform",b)))+'</a>\n <div class="clear">&nbsp;</div>\n</form>'});s.leave_message_layout=r(function(a,e,f,b,c){function j(a){var d;return a=""+('\n <img src="'+n((d=(d=(d=a.page,null==d||!1===d?d:d.company),null==d||!1===d?d:d.chatLogoURL),typeof d===m?d.apply(a):d))+'" alt=""/>\n ')}function k(a){var d;return a=""+("\n <a onclick=\"window.open('"+n((d=
(d=a.page,null==d||!1===d?d:d.webimHost),typeof d===m?d.apply(a):d))+'\');return false;" href="'+n((d=(d=a.page,null==d||!1===d?d:d.webimHost),typeof d===m?d.apply(a):d))+'">\n <img src="'+n((d=(d=(d=a.page,null==d||!1===d?d:d.company),null==d||!1===d?d:d.chatLogoURL),typeof d===m?d.apply(a):d))+'" alt=""/>\n </a>\n ')}function l(a){var d;return a=""+("\n <a onclick=\"window.open('"+n((d=(d=a.page,null==d||!1===d?d:d.webimHost),typeof d===
m?d.apply(a):d))+'\');return false;" href="'+n((d=(d=a.page,null==d||!1===d?d:d.webimHost),typeof d===m?d.apply(a):d))+'">\n <img src="'+n((d=(d=a.page,null==d||!1===d?d:d.tplRoot),typeof d===m?d.apply(a):d))+'/images/default-logo.gif" alt=""/>\n </a>\n ')}function p(a){var d;return a=""+('\n <img src="'+n((d=(d=a.page,null==d||!1===d?d:d.tplRoot),typeof d===m?d.apply(a):d))+'/images/default-logo.gif" alt=""/>\n ')}this.compilerInfo=
[2,">= 1.0.0-rc.3"];f=f||a.helpers;c=c||{};var h,m="function",n=this.escapeExpression,q=this;a='\n<div id="top2">\n <div id="logo">\n ';if((c=f["if"].call(e,(h=(h=e.page,null==h||!1===h?h:h.company),null==h||!1===h?h:h.chatLogoURL),{hash:{},inverse:q.program(6,function(a,d){var g,b,c;g="\n ";if((c=f["if"].call(a,(b=a.page,null==b||!1===b?b:b.webimHost),{hash:{},inverse:q.program(9,p,d),fn:q.program(7,l,d),data:d}))||0===c)g+=c;return g+"\n "},c),fn:q.program(1,function(a,
d){var g,b,c;g="\n \n ";if((c=f.unless.call(a,(b=a.page,null==b||!1===b?b:b.webimHost),{hash:{},inverse:q.program(4,k,d),fn:q.program(2,j,d),data:d}))||0===c)g+=c;return g+"\n "},c),data:c}))||0===c)a+=c;return a+='\n &nbsp;\n <div id="page-title">'+n((h=(h=e.page,null==h||!1===h?h:h.title),typeof h===m?h.apply(e):h))+'</div>\n <div class="clear">&nbsp;</div>\n </div>\n</div>\n\n\n<div id="headers">\n <div class="wndb"><div class="wndl"><div class="wndr"><div class="wndt"><div class="wndtl"><div class="wndtr"><div class="wndbl"><div class="wndbr" id="description-region">\n </div></div></div></div></div></div></div></div>\n</div>\n\n\n<div id="content-wrapper"></div>'});
s.avatar=r(function(a,e,f,b,c){this.compilerInfo=[2,">= 1.0.0-rc.3"];f=f||a.helpers;c=c||{};var j=this.escapeExpression;return(a=f["if"].call(e,e.imageLink,{hash:{},inverse:this.program(3,function(){return'<div class="default-avatar"></div>'},c),fn:this.program(1,function(a,b){var c,e;c='<img src="';(e=f.imageLink)?e=e.call(a,{hash:{},data:b}):(e=a.imageLink,e="function"===typeof e?e.apply(a):e);return c+=j(e)+'" border="0" alt="" />'},c),data:c}))||0===a?a:""});s.close_control=r(function(a,e,f,b,
c){this.compilerInfo=[2,">= 1.0.0-rc.3"];f=f||a.helpers;c=c||{};var j;a=f.helperMissing;b=this.escapeExpression;c={hash:{},data:c};return e='<div class="tpl-image" title="'+(b((j=f.L10n,j?j.call(e,"chat.window.close_title",c):a.call(e,"L10n","chat.window.close_title",c)))+'"></div>')});s.history_control=r(function(a,e,f,b,c){this.compilerInfo=[2,">= 1.0.0-rc.3"];f=f||a.helpers;c=c||{};var j;a=f.helperMissing;b=this.escapeExpression;c={hash:{},data:c};return e='<div class="tpl-image" title="'+(b((j=
f.L10n,j?j.call(e,"page.analysis.userhistory.title",c):a.call(e,"L10n","page.analysis.userhistory.title",c)))+'"></div>')});s.status_message=r(function(a,e,f,b,c){this.compilerInfo=[2,">= 1.0.0-rc.3"];f=f||a.helpers;c=c||{};a=this.escapeExpression;(f=f.message)?f=f.call(e,{hash:{},data:c}):(f=e.message,f="function"===typeof f?f.apply(e):f);return a(f)});s.survey_form=r(function(a,e,f,b,c){function j(a,b){var c,d;c='<input type="hidden" name="group" value="';(d=f.groupId)?d=d.call(a,{hash:{},data:b}):
(d=a.groupId,d=typeof d===l?d.apply(a):d);return c+=p(d)+'"/>'}this.compilerInfo=[2,">= 1.0.0-rc.3"];f=f||a.helpers;c=c||{};var k,l="function",p=this.escapeExpression,h=this,m=f.helperMissing;a=""+('<form name="surveyForm" method="post" action="">\n <input type="hidden" name="style" value="'+p((k=(k=e.page,null==k||!1===k?k:k.style),typeof k===l?k.apply(e):k))+'"/>\n <input type="hidden" name="info" value="');(b=f.info)?b=b.call(e,{hash:{},data:c}):(b=e.info,b=typeof b===l?b.apply(e):b);a+=
p(b)+'"/>\n <input type="hidden" name="referrer" value="';(b=f.referrer)?b=b.call(e,{hash:{},data:c}):(b=e.referrer,b=typeof b===l?b.apply(e):b);a+=p(b)+'"/>\n <input type="hidden" name="survey" value="on"/>\n ';if((b=f.unless.call(e,e.showEmail,{hash:{},inverse:h.noop,fn:h.program(1,function(a,b){var c,d;c='<input type="hidden" name="email" value="';(d=f.email)?d=d.call(a,{hash:{},data:b}):(d=a.email,d=typeof d===l?d.apply(a):d);return c+=p(d)+'"/>'},c),data:c}))||0===b)a+=b;a+="\n ";
if((b=f.unless.call(e,e.groups,{hash:{},inverse:h.noop,fn:h.program(3,function(a,b){var c;return(c=f["if"].call(a,a.groupId,{hash:{},inverse:h.noop,fn:h.program(4,j,b),data:b}))||0===c?c:""},c),data:c}))||0===b)a+=b;a+="\n ";if((b=f.unless.call(e,e.showMessage,{hash:{},inverse:h.noop,fn:h.program(6,function(a,b){var c,d;c='<input type="hidden" name="message" value="';(d=f.message)?d=d.call(a,{hash:{},data:b}):(d=a.message,d=typeof d===l?d.apply(a):d);return c+=p(d)+'"/>'},c),data:c}))||0===b)a+=
b;a+='\n\n <div class="errors"></div>\n\n <table class="form">\n ';if((b=f["if"].call(e,e.groups,{hash:{},inverse:h.noop,fn:h.program(8,function(a,b){var c,d,g;g={hash:{},data:b};c="\n <tr>\n <td><strong>"+(p((d=f.L10n,d?d.call(a,"form.field.department",g):m.call(a,"L10n","form.field.department",g)))+'</strong></td>\n <td><select name="group">');if((g=(d=(d=a.groups,null==d||!1===d?d:d.select),typeof d===l?d.apply(a):d))||0===g)c+=g;c+="</select></td>\n </tr>\n <tr>\n <td><strong>";
g={hash:{},data:b};return c+=p((d=f.L10n,d?d.call(a,"form.field.department.description",g):m.call(a,"L10n","form.field.department.description",g)))+'</strong></td>\n <td id="groupDescription">'+p((d=(d=a.groups,null==d||!1===d?d:d.defaultDescription),typeof d===l?d.apply(a):d))+"</td>\n </tr>\n "},c),data:c}))||0===b)a+=b;b={hash:{},data:c};a=a+"\n <tr>\n <td><strong>"+(p((k=f.L10n,k?k.call(e,"presurvey.name",b):m.call(e,"L10n","presurvey.name",b)))+'</strong></td>\n <td><input type="text" name="name" size="50" value="');
(b=f.name)?b=b.call(e,{hash:{},data:c}):(b=e.name,b=typeof b===l?b.apply(e):b);a+=p(b)+'" class="username" ';if((b=f.unless.call(e,e.canChangeName,{hash:{},inverse:h.noop,fn:h.program(10,function(){return'disabled="disabled"'},c),data:c}))||0===b)a+=b;a+="/></td>\n </tr>\n ";if((b=f["if"].call(e,e.showEmail,{hash:{},inverse:h.noop,fn:h.program(12,function(a,c){var b,d;b={hash:{},data:c};b="\n <tr>\n <td><strong>"+(p((d=f.L10n,d?d.call(a,"presurvey.mail",b):m.call(a,"L10n",
"presurvey.mail",b)))+'</strong></td>\n <td><input type="text" name="email" size="50" value="');(d=f.email)?d=d.call(a,{hash:{},data:c}):(d=a.email,d=typeof d===l?d.apply(a):d);return b+=p(d)+'" class="username"/></td>\n </tr>\n '},c),data:c}))||0===b)a+=b;a+="\n ";if((b=f["if"].call(e,e.showMessage,{hash:{},inverse:h.noop,fn:h.program(14,function(a,b){var c,d;c={hash:{},data:b};c="\n <tr>\n <td><strong>"+(p((d=f.L10n,d?d.call(a,"presurvey.question",c):m.call(a,
"L10n","presurvey.question",c)))+'</strong></td>\n <td valign="top"><textarea name="message" tabindex="0" cols="45" rows="2">');(d=f.message)?d=d.call(a,{hash:{},data:b}):(d=a.message,d=typeof d===l?d.apply(a):d);return c+=p(d)+"</textarea></td>\n </tr>\n "},c),data:c}))||0===b)a+=b;a+='\n </table>\n <a href="javascript:void(0);" class="but" id="submit-survey">';b={hash:{},data:c};return a+=p((k=f.L10n,k?k.call(e,"presurvey.submit",b):m.call(e,"L10n","presurvey.submit",
b)))+'</a>\n <div class="clear">&nbsp;</div>\n</form>'});s.chat_layout=r(function(a,e,f,b,c){function j(d){var a;return d=""+('\n <img src="'+q((a=(a=(a=d.page,null==a||!1===a?a:a.company),null==a||!1===a?a:a.chatLogoURL),typeof a===n?a.apply(d):a))+'" alt=""/>\n ')}function k(a){var g;return a=""+("\n <a onclick=\"window.open('"+q((g=(g=a.page,null==g||!1===g?g:g.webimHost),typeof g===n?g.apply(a):g))+'\');return false;" href="'+q((g=(g=a.page,null==g||
!1===g?g:g.webimHost),typeof g===n?g.apply(a):g))+'">\n <img src="'+q((g=(g=(g=a.page,null==g||!1===g?g:g.company),null==g||!1===g?g:g.chatLogoURL),typeof g===n?g.apply(a):g))+'" alt=""/>\n </a>\n ')}function l(a){var g;return a=""+("\n <a onclick=\"window.open('"+q((g=(g=a.page,null==g||!1===g?g:g.webimHost),typeof g===n?g.apply(a):g))+'\');return false;" href="'+q((g=(g=a.page,null==g||!1===g?g:g.webimHost),typeof g===n?g.apply(a):g))+
'">\n <img src="'+q((g=(g=a.page,null==g||!1===g?g:g.tplRoot),typeof g===n?g.apply(a):g))+'/images/default-logo.gif" alt=""/>\n </a>\n ')}function p(a){var g;return a=""+('\n <img src="'+q((g=(g=a.page,null==g||!1===g?g:g.tplRoot),typeof g===n?g.apply(a):g))+'/images/default-logo.gif" alt=""/>\n ')}this.compilerInfo=[2,">= 1.0.0-rc.3"];f=f||a.helpers;c=c||{};var h,m,n="function",q=this.escapeExpression,t=this;b=f.helperMissing;
a='\n<div id="top">\n <div id="logo">\n ';if((m=f["if"].call(e,(h=(h=e.page,null==h||!1===h?h:h.company),null==h||!1===h?h:h.chatLogoURL),{hash:{},inverse:t.program(6,function(a,g){var c,b,e;c="\n ";if((e=f["if"].call(a,(b=a.page,null==b||!1===b?b:b.webimHost),{hash:{},inverse:t.program(9,p,g),fn:t.program(7,l,g),data:g}))||0===e)c+=e;return c+"\n "},c),fn:t.program(1,function(a,g){var c,b,e;c="\n \n ";if((e=f.unless.call(a,(b=a.page,null==b||!1===
b?b:b.webimHost),{hash:{},inverse:t.program(4,k,g),fn:t.program(2,j,g),data:g}))||0===e)c+=e;return c+"\n "},c),data:c}))||0===m)a+=m;a+='\n &nbsp;\n <div id="page-title">'+q((h=(h=e.page,null==h||!1===h?h:h.title),typeof h===n?h.apply(e):h))+'</div>\n <div class="clear">&nbsp;</div>\n </div>\n</div>\n\n\n<div id="chat-header">\n <div class="bgc"><div class="bgl"><div class="bgr">\n \n <div id="controls-region"></div>\n </div></div></div>\n</div>\n\n\n<div id="chat">\n <div class="bgl"><div class="bgr"><div class="sdwbgc"><div class="sdwbgl"><div class="sdwbgr">\n ';
if((m=f.unless.call(e,(h=e.user,null==h||!1===h?h:h.isAgent),{hash:{},inverse:t.noop,fn:t.program(11,function(){return'\n <div id="avatar-region"></div>\n '},c),data:c}))||0===m)a+=m;c={hash:{},data:c};return a=a+'\n \n <div id="messages-region"></div>\n \n <div id="status-region"></div>\n </div></div></div></div></div>\n</div>\n\n\n<div id="message-form-region"></div>\n\n\n<div id="footer">'+(q((h=f.L10n,h?h.call(e,"chat.window.poweredby",c):b.call(e,
"L10n","chat.window.poweredby",c)))+' <a id="poweredByLink" href="http://mibew.org" title="Mibew Community" target="_blank">mibew.org</a></div>\n\n\n<div id="sound-region"></div>')});s.secure_mode_control=r(function(){this.compilerInfo=[2,">= 1.0.0-rc.3"];return'<div class="tpl-image" title="SSL"></div>'});s.sound_control=r(function(a,e,f,b,c){this.compilerInfo=[2,">= 1.0.0-rc.3"];f=f||a.helpers;c=c||{};var j=f.helperMissing,k=this.escapeExpression;return(a=f["if"].call(e,e.enabled,{hash:{},inverse:this.program(3,
function(a,b){var c,e;c={hash:{},data:b};return c='\n <div class="tpl-image sound-control-off" title="'+(k((e=f.L10n,e?e.call(a,"chat.window.toolbar.turn_on_sound",c):j.call(a,"L10n","chat.window.toolbar.turn_on_sound",c)))+'"></div>\n')},c),fn:this.program(1,function(a,c){var b,e;b={hash:{},data:c};return b='\n <div class="tpl-image sound-control-on" title="'+(k((e=f.L10n,e?e.call(a,"chat.window.toolbar.turn_off_sound",b):j.call(a,"L10n","chat.window.toolbar.turn_off_sound",b)))+'"></div>\n')},
c),data:c}))||0===a?a:""});s.message=r(function(a,e,f,b,c){this.compilerInfo=[2,">= 1.0.0-rc.3"];f=f||a.helpers;c=c||{};var j,k=this.escapeExpression,l=f.helperMissing;a={hash:{},data:c};a="<span>"+(k((j=f.formatTime,j?j.call(e,e.created,a):l.call(e,"formatTime",e.created,a)))+"</span> \n");if((j=f["if"].call(e,e.name,{hash:{},inverse:this.noop,fn:this.program(1,function(a,b){var c,e;c="<span class='n";(e=f.kindName)?e=e.call(a,{hash:{},data:b}):(e=a.kindName,e="function"===typeof e?e.apply(a):e);
c+=k(e)+"'>";(e=f.name)?e=e.call(a,{hash:{},data:b}):(e=a.name,e="function"===typeof e?e.apply(a):e);return c+=k(e)+"</span>: "},c),data:c}))||0===j)a+=j;a+="\n<span class='m";(j=f.kindName)?j=j.call(e,{hash:{},data:c}):(j=e.kindName,j="function"===typeof j?j.apply(e):j);a+=k(j)+"'>";if((j=f["if"].call(e,e.allowFormatting,{hash:{},inverse:this.program(5,function(a,c){var b,e;e={hash:{},data:c};return k((b=f.apply,b?b.call(a,a.message,"urlReplace, nl2br",e):l.call(a,"apply",a.message,"urlReplace, nl2br",
e)))},c),fn:this.program(3,function(a,c){var b,e;e={hash:{},data:c};return k((b=f.apply,b?b.call(a,a.message,"urlReplace, nl2br, allowTags",e):l.call(a,"apply",a.message,"urlReplace, nl2br, allowTags",e)))},c),data:c}))||0===j)a+=j;return a+="</span><br/>"});s.message_form=r(function(a,e,f,b,c){function j(a,b){var d,g;d={hash:{},data:b};d='\n <select id="predefined" size="1" class="answer">\n <option>'+(h((g=f.L10n,g?g.call(a,"chat.window.predefined.select_answer",
d):m.call(a,"L10n","chat.window.predefined.select_answer",d)))+"</option>\n ");if((g=f.each.call(a,a.predefinedAnswers,{hash:{},inverse:n.noop,fn:n.program(5,k,b),data:b}))||0===g)d+=g;return d+="\n </select>\n "}function k(a){var b;return a=""+("\n <option>"+h((b=a["short"],typeof b===p?b.apply(a):b))+"</option>\n ")}this.compilerInfo=[2,">= 1.0.0-rc.3"];f=f||a.helpers;c=c||{};var l,p="function",h=this.escapeExpression,m=
f.helperMissing,n=this;a='<div id="message">\n';if((b=f["if"].call(e,(l=e.user,null==l||!1===l?l:l.canPost),{hash:{},inverse:n.noop,fn:n.program(1,function(){return'\n <div class="bgc"><div class="bgl"><div class="bgr">\n <textarea id="message-input" class="message" tabindex="0" rows="4" cols="10"></textarea>\n </div></div></div>\n'},c),data:c}))||0===b)a+=b;a+='\n</div>\n\n<div id="send">\n';if((b=f["if"].call(e,(l=e.user,null==l||!1===l?l:l.canPost),{hash:{},inverse:n.noop,fn:n.program(3,
function(a,b){var d,g,c;d='\n <div id="postmessage">\n <div id="predefined-wrapper">\n ';if((c=f["if"].call(a,(g=a.user,null==g||!1===g?g:g.isAgent),{hash:{},inverse:n.noop,fn:n.program(4,j,b),data:b}))||0===c)d+=c;c={hash:{},data:b};d=d+'\n </div>\n <a href="javascript:void(0)" id="send-message" title="'+(h((g=f.L10n,g?g.call(a,"chat.window.send_message",c):m.call(a,"L10n","chat.window.send_message",c)))+'">');c={hash:{},data:b};return d+=h((g=f.L10n,g?g.call(a,
"chat.window.send_message_short_and_shortcut",c):m.call(a,"L10n","chat.window.send_message_short_and_shortcut",c)))+"</a>\n </div>\n"},c),data:c}))||0===b)a+=b;return a+'\n</div>\n<div class="clear"></div>'});s.send_mail_control=r(function(a,e,f,b,c){this.compilerInfo=[2,">= 1.0.0-rc.3"];f=f||a.helpers;c=c||{};var j;a=f.helperMissing;b=this.escapeExpression;c={hash:{},data:c};return e='<div class="tpl-image" title="'+(b((j=f.L10n,j?j.call(e,"chat.window.toolbar.mail_history",c):a.call(e,"L10n",
"chat.window.toolbar.mail_history",c)))+'"></div>')});s.survey_layout=r(function(a,e,f,b,c){function j(a){var b;return a=""+('\n <img src="'+q((b=(b=(b=a.page,null==b||!1===b?b:b.company),null==b||!1===b?b:b.chatLogoURL),typeof b===n?b.apply(a):b))+'" alt=""/>\n ')}function k(a){var b;return a=""+("\n <a onclick=\"window.open('"+q((b=(b=a.page,null==b||!1===b?b:b.webimHost),typeof b===n?b.apply(a):b))+'\');return false;" href="'+q((b=(b=a.page,null==b||!1===
b?b:b.webimHost),typeof b===n?b.apply(a):b))+'">\n <img src="'+q((b=(b=(b=a.page,null==b||!1===b?b:b.company),null==b||!1===b?b:b.chatLogoURL),typeof b===n?b.apply(a):b))+'" alt=""/>\n </a>\n ')}function l(a){var b;return a=""+("\n <a onclick=\"window.open('"+q((b=(b=a.page,null==b||!1===b?b:b.webimHost),typeof b===n?b.apply(a):b))+'\');return false;" href="'+q((b=(b=a.page,null==b||!1===b?b:b.webimHost),typeof b===n?b.apply(a):b))+'">\n <img src="'+
q((b=(b=a.page,null==b||!1===b?b:b.tplRoot),typeof b===n?b.apply(a):b))+'/images/default-logo.gif" alt=""/>\n </a>\n ')}function p(a){var b;return a=""+('\n <img src="'+q((b=(b=a.page,null==b||!1===b?b:b.tplRoot),typeof b===n?b.apply(a):b))+'/images/default-logo.gif" alt=""/>\n ')}this.compilerInfo=[2,">= 1.0.0-rc.3"];f=f||a.helpers;c=c||{};var h,m,n="function",q=this.escapeExpression,r=this;b=f.helperMissing;a='\n<div id="top2">\n <div id="logo">\n ';
if((m=f["if"].call(e,(h=(h=e.page,null==h||!1===h?h:h.company),null==h||!1===h?h:h.chatLogoURL),{hash:{},inverse:r.program(6,function(a,b){var c,e,h;c="\n ";if((h=f["if"].call(a,(e=a.page,null==e||!1===e?e:e.webimHost),{hash:{},inverse:r.program(9,p,b),fn:r.program(7,l,b),data:b}))||0===h)c+=h;return c+"\n "},c),fn:r.program(1,function(a,b){var c,e,h;c="\n \n ";if((h=f.unless.call(a,(e=a.page,null==e||!1===e?e:e.webimHost),{hash:{},inverse:r.program(4,k,b),
fn:r.program(2,j,b),data:b}))||0===h)c+=h;return c+"\n "},c),data:c}))||0===m)a+=m;a+='\n &nbsp;\n <div id="page-title">'+q((h=(h=e.page,null==h||!1===h?h:h.title),typeof h===n?h.apply(e):h))+'</div>\n <div class="clear">&nbsp;</div>\n </div>\n</div>\n\n\n<div id="headers">\n <div class="wndb"><div class="wndl"><div class="wndr"><div class="wndt"><div class="wndtl"><div class="wndtr"><div class="wndbl"><div class="wndbr">\n <div class="buttons">\n <a href="javascript:window.close();" title="';
m={hash:{},data:c};a+=q((h=f.L10n,h?h.call(e,"leavemessage.close",m):b.call(e,"L10n","leavemessage.close",m)))+'"><img class="tpl-image iclosewin" src="'+q((h=(h=e.page,null==h||!1===h?h:h.webimRoot),typeof h===n?h.apply(e):h))+'/images/free.gif" alt="';m={hash:{},data:c};a+=q((h=f.L10n,h?h.call(e,"leavemessage.close",m):b.call(e,"L10n","leavemessage.close",m)))+'" /></a>\n </div>\n <div class="messagetxt">';m={hash:{},data:c};return a+=q((h=f.L10n,h?h.call(e,"presurvey.intro",m):b.call(e,
"L10n","presurvey.intro",m)))+'</div>\n </div></div></div></div></div></div></div></div>\n</div>\n\n\n<div id="content-wrapper"></div>'});s.leave_message_description=r(function(a,e,f,b,c){this.compilerInfo=[2,">= 1.0.0-rc.3"];f=f||a.helpers;c=c||{};var j,k=f.helperMissing,l=this.escapeExpression;b={hash:{},data:c};a='<div class="buttons">\n <a href="javascript:window.close();" title="'+(l((j=f.L10n,j?j.call(e,"leavemessage.close",b):k.call(e,"L10n","leavemessage.close",b)))+'">\n <img class="tpl-image iclosewin" src="'+
l((j=(j=e.page,null==j||!1===j?j:j.webimRoot),"function"===typeof j?j.apply(e):j))+'/images/free.gif" alt="');b={hash:{},data:c};a+=l((j=f.L10n,j?j.call(e,"leavemessage.close",b):k.call(e,"L10n","leavemessage.close",b)))+'" />\n </a>\n</div>\n<div class="messagetxt">';b={hash:{},data:c};return a+=l((j=f.L10n,j?j.call(e,"leavemessage.descr",b):k.call(e,"L10n","leavemessage.descr",b)))+"</div>"});s.refresh_control=r(function(a,e,f,b,c){this.compilerInfo=[2,">= 1.0.0-rc.3"];f=f||a.helpers;c=c||{};
var j;a=f.helperMissing;b=this.escapeExpression;c={hash:{},data:c};return e='<div class="tpl-image" title="'+(b((j=f.L10n,j?j.call(e,"chat.window.toolbar.refresh",c):a.call(e,"L10n","chat.window.toolbar.refresh",c)))+'"></div>')});s.redirect_control=r(function(a,e,f,b,c){this.compilerInfo=[2,">= 1.0.0-rc.3"];f=f||a.helpers;c=c||{};var j,k=f.helperMissing,l=this.escapeExpression;return(a=f["if"].call(e,(j=e.user,null==j||!1===j?j:j.canPost),{hash:{},inverse:this.noop,fn:this.program(1,function(a,b){var c,
e;c={hash:{},data:b};return c='\n<div class="tpl-image" title="'+(l((e=f.L10n,e?e.call(a,"chat.window.toolbar.redirect_user",c):k.call(a,"L10n","chat.window.toolbar.redirect_user",c)))+'"></div>\n')},c),data:c}))||0===a?a:""});s.status=r(function(a,e,f,b,c){this.compilerInfo=[2,">= 1.0.0-rc.3"];f=f||a.helpers;c=c||{};a=this.escapeExpression;(f=f.title)?f=f.call(e,{hash:{},data:c}):(f=e.title,f="function"===typeof f?f.apply(e):f);return a(f)});s.leave_message_sent_description=r(function(a,e,f,b,c){this.compilerInfo=
[2,">= 1.0.0-rc.3"];f=f||a.helpers;c=c||{};var j,k=f.helperMissing,l=this.escapeExpression;b={hash:{},data:c};a='<div class="buttons">\n <a href="javascript:window.close();" title="'+(l((j=f.L10n,j?j.call(e,"chat.mailthread.sent.close",b):k.call(e,"L10n","chat.mailthread.sent.close",b)))+'">\n <img class="tpl-image iclosewin" src="'+l((j=(j=e.page,null==j||!1===j?j:j.webimRoot),"function"===typeof j?j.apply(e):j))+'/images/free.gif" alt="');b={hash:{},data:c};a+=l((j=f.L10n,j?j.call(e,
"chat.mailthread.sent.close",b):k.call(e,"L10n","chat.mailthread.sent.close",b)))+'" />\n </a>\n</div>\n<div class="messagetxt">';b={hash:{},data:c};return a+=l((j=f.L10n,j?j.call(e,"leavemessage.sent.message",b):k.call(e,"L10n","leavemessage.sent.message",b)))+"</div>"})})();

View File

@ -46,7 +46,29 @@
'chat.client.changename': "${msg:chat.client.changename}",
'chat.window.toolbar.turn_off_sound': "${msg:chat.window.toolbar.turn_off_sound}",
'chat.window.toolbar.turn_on_sound': "${msg:chat.window.toolbar.turn_on_sound}",
'chat.window.poweredby': "${msg:chat.window.poweredby}"
'chat.window.poweredby': "${msg:chat.window.poweredby}",
'chat.mailthread.sent.close': "${msg:chat.mailthread.sent.close}",
'form.field.department': "${msg:form.field.department}",
'form.field.department.description': "${msg:form.field.department.description}",
'form.field.email': "${msg:form.field.email}",
'form.field.name': "${msg:form.field.name}",
'form.field.message': "${msg:form.field.message}",
'leavemessage.close': "${msg:leavemessage.close}",
'leavemessage.descr': "${msg:leavemessage.descr}",
'leavemessage.sent.message': "${msg:leavemessage.sent.message}",
'leavemessage.error.email.required': '${page:localized.email.required}',
'leavemessage.error.name.required': '${page:localized.name.required}',
'leavemessage.error.message.required': '${page:localized.message.required}',
'leavemessage.error.wrong.email': '${page:localized.wrong.email}',
'errors.captcha': '${msg:errors.captcha}',
'mailthread.perform': "${msg:mailthread.perform}",
'presurvey.name': "${msg:presurvey.name}",
'presurvey.mail': "${msg:presurvey.mail}",
'presurvey.question': "${msg:presurvey.question}",
'presurvey.submit': "${msg:presurvey.submit}",
'presurvey.error.wrong_email': "${msg:presurvey.error.wrong_email}",
'presurvey.title': "${msg:presurvey.title}",
'presurvey.intro': '${msg:presurvey.intro}'
});
//--></script>
@ -61,9 +83,24 @@
page: {
style: '${styleid}',
webimRoot: '${webimroot}',
tplRoot: '${tplroot}'
tplRoot: '${tplroot}',
company: {
name: '${page:company.name}',
chatLogoURL: '${page:company.chatLogoURL}'
},
webimHost: '${page:webimHost}',
title: '${page:page.title}'
},
chatModule: ${page:chatModule},
${if:chatOptions}
chatOptions: ${page:chatOptions},
${endif:chatOptions}
${if:surveyOptions}
surveyOptions: ${page:surveyOptions},
${endif:surveyOptions}
${if:leaveMessageOptions}
leaveMessageOptions: ${page:leaveMessageOptions},
${endif:leaveMessageOptions}
startFrom: "${page:startFrom}",
plugins: ${page:js_plugin_options}
});
});
@ -71,33 +108,6 @@
</head>
<body>
<!-- Chat window top. Includes logo and some info about company -->
<div id="top">
<div id="logo">
${if:company.chatLogoURL}
${if:webimHost}
<a onclick="window.open('${page:webimHost}');return false;" href="${page:webimHost}">
<img src="${page:company.chatLogoURL}" alt=""/>
</a>
${else:webimHost}
<img src="${page:company.chatLogoURL}" alt=""/>
${endif:webimHost}
${else:company.chatLogoURL}
${if:webimHost}
<a onclick="window.open('${page:webimHost}');return false;" href="${page:webimHost}">
<img src="${tplroot}/images/default-logo.gif" alt=""/>
</a>
${else:webimHost}
<img src="${tplroot}/images/default-logo.gif" alt=""/>
${endif:webimHost}
${endif:company.chatLogoURL}
&nbsp;
<div id="page-title">${page:chat.title}</div>
<div class="clear">&nbsp;</div>
</div>
</div>
<div id="main-region"></div>
</body>
</html>

View File

@ -1,98 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>${msg:leavemessage.title}</title>
<link rel="shortcut icon" href="${webimroot}/images/favicon.ico" type="image/x-icon"/>
<link rel="stylesheet" type="text/css" href="${tplroot}/chat.css" />
<script type="text/javascript" language="javascript" src="${webimroot}/js/compiled/common.js"></script>
<script type="text/javascript" language="javascript" src="${webimroot}/js/compiled/leavemessage.js"></script>
<script type="text/javascript">
${if:groups}
var groupDescriptions = ${page:group.descriptions};
${endif:groups}
</script>
</head>
<body>
<form name="leaveMessageForm" method="post" action="${webimroot}/leavemessage.php">
<input type="hidden" name="style" value="${styleid}"/>
<input type="hidden" name="info" value="${form:info}"/>
<input type="hidden" name="referrer" value="${page:referrer}"/>
${ifnot:groups}${if:formgroupid}<input type="hidden" name="group" value="${form:groupid}"/>${endif:formgroupid}${endif:groups}
<div id="top2">
<div id="logo">
${if:company.chatLogoURL}
${if:webimHost}
<a onclick="window.open('${page:webimHost}');return false;" href="${page:webimHost}">
<img src="${page:company.chatLogoURL}" alt=""/>
</a>
${else:webimHost}
<img src="${page:company.chatLogoURL}" alt=""/>
${endif:webimHost}
${else:company.chatLogoURL}
${if:webimHost}
<a onclick="window.open('${page:webimHost}');return false;" href="${page:webimHost}">
<img src="${tplroot}/images/default-logo.gif" alt=""/>
</a>
${else:webimHost}
<img src="${tplroot}/images/default-logo.gif" alt=""/>
${endif:webimHost}
${endif:company.chatLogoURL}
&nbsp;
<div id="page-title">${if:formgroupname}${form:groupname}: ${endif:formgroupname}${msg:leavemessage.title}</div>
<div class="clear">&nbsp;</div>
</div>
</div>
<div id="headers">
<div class="wndb"><div class="wndl"><div class="wndr"><div class="wndt"><div class="wndtl"><div class="wndtr"><div class="wndbl"><div class="wndbr">
<div class="buttons">
<a href="javascript:window.close();" title="${msg:leavemessage.close}"><img class="tplimage iclosewin" src="${webimroot}/images/free.gif" alt="${msg:leavemessage.close}" /></a>
</div>
<div class="messagetxt">${msg:leavemessage.descr}</div>
</div></div></div></div></div></div></div></div>
</div>
<div id="content-wrapper">
${if:errors}
${errors}
${endif:errors}
<table cellspacing="1" cellpadding="5" border="0" class="form">
<tr>
<td><strong>${msg:form.field.email}:</strong></td>
<td><input type="text" name="email" size="50" value="${form:email}" class="username"/></td>
</tr>
<tr>
<td><strong>${msg:form.field.name}:</strong></td>
<td><input type="text" name="name" size="50" value="${form:name}" class="username"/></td>
</tr>
${if:groups}
<tr>
<td class="text">${msg:form.field.department}</td>
<td>
<select name="group" style="min-width:200px;" onchange="MessageForm.changeGroup(this, 'departmentDescription', groupDescriptions)">${page:groups}</select>
</td>
</tr>
<tr>
<td class="text">${msg:form.field.department.description}</td>
<td class="text" id="departmentDescription">${page:default.department.description}</td>
</tr>
${endif:groups}
<tr>
<td><strong>${msg:form.field.message}:</strong></td>
<td valign="top">
<textarea name="message" tabindex="0" cols="40" rows="5">${form:message}</textarea>
</td>
</tr>
${if:showcaptcha}
<tr>
<td><img src="captcha.php"/></td>
<td><input type="text" name="captcha" size="50" maxlength="15" value="" class="username"/></td>
</tr>
${endif:showcaptcha}
</table>
<a href="javascript:document.leaveMessageForm.submit();" class="but" id="sndmessagelnk">${msg:mailthread.perform}</a>
<div class="clear">&nbsp;</div>
</div>
</form>
</body>
</html>

View File

@ -1,45 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>${msg:leavemessage.sent.title}</title>
<link rel="shortcut icon" href="${webimroot}/images/favicon.ico" type="image/x-icon"/>
<link rel="stylesheet" type="text/css" href="${tplroot}/chat.css" />
</head>
<body>
<div id="top2">
<div id="logo">
${if:company.chatLogoURL}
${if:webimHost}
<a onclick="window.open('${page:webimHost}');return false;" href="${page:webimHost}">
<img src="${page:company.chatLogoURL}" alt=""/>
</a>
${else:webimHost}
<img src="${page:company.chatLogoURL}" alt=""/>
${endif:webimHost}
${else:company.chatLogoURL}
${if:webimHost}
<a onclick="window.open('${page:webimHost}');return false;" href="${page:webimHost}">
<img src="${tplroot}/images/default-logo.gif" alt=""/>
</a>
${else:webimHost}
<img src="${tplroot}/images/default-logo.gif" alt=""/>
${endif:webimHost}
${endif:company.chatLogoURL}
&nbsp;
<div id="page-title">${msg:leavemessage.sent.title}</div>
<div class="clear">&nbsp;</div>
</div>
</div>
<div id="headers">
<div class="wndb"><div class="wndl"><div class="wndr"><div class="wndt"><div class="wndtl"><div class="wndtr"><div class="wndbl"><div class="wndbr">
<div class="buttons">
<a href="javascript:window.close();" title="${msg:chat.mailthread.sent.close}"><img class="tplimage iclosewin" src="${webimroot}/images/free.gif" alt="${msg:chat.mailthread.sent.close}" /></a>
</div>
<div class="messagetxt">${msg:leavemessage.sent.message}</div>
</div></div></div></div></div></div></div></div>
</div>
<div id="content-wrapper">
&nbsp;
</div>
</body>
</html>

View File

@ -1,96 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>${msg:presurvey.title}</title>
<link rel="shortcut icon" href="${webimroot}/images/favicon.ico" type="image/x-icon"/>
<link rel="stylesheet" type="text/css" href="${tplroot}/chat.css" />
<script type="text/javascript" language="javascript" src="${webimroot}/js/compiled/common.js"></script>
<script type="text/javascript" language="javascript" src="${webimroot}/js/compiled/survey.js"></script>
<script type="text/javascript">
${if:groups}
var groupDescriptions = ${page:group.descriptions};
${endif:groups}
var localizedStrings = {
${if:showemail}
wrongEmail: '${msg:presurvey.error.wrong_email}',
${endif:showemail}
}
</script>
</head>
<body>
<div id="top2">
<div id="logo">
${if:company.chatLogoURL}
${if:webimHost}
<a onclick="window.open('${page:webimHost}');return false;" href="${page:webimHost}">
<img src="${page:company.chatLogoURL}" alt=""/>
</a>
${else:webimHost}
<img src="${page:company.chatLogoURL}" alt=""/>
${endif:webimHost}
${else:company.chatLogoURL}
${if:webimHost}
<a onclick="window.open('${page:webimHost}');return false;" href="${page:webimHost}">
<img src="${tplroot}/images/default-logo.gif" alt=""/>
</a>
${else:webimHost}
<img src="${tplroot}/images/default-logo.gif" alt=""/>
${endif:webimHost}
${endif:company.chatLogoURL}
&nbsp;
<div id="page-title">${msg:presurvey.title}</div>
<div class="clear">&nbsp;</div>
</div>
</div>
<div id="headers">
<div class="wndb"><div class="wndl"><div class="wndr"><div class="wndt"><div class="wndtl"><div class="wndtr"><div class="wndbl"><div class="wndbr">
<div class="buttons">
<a href="javascript:window.close();" title="${msg:leavemessage.close}"><img class="tplimage iclosewin" src="${webimroot}/images/free.gif" alt="${msg:leavemessage.close}" /></a>
</div>
<div class="messagetxt">${msg:presurvey.intro}</div>
</div></div></div></div></div></div></div></div>
</div>
<div id="content-wrapper">
<form name="surveyForm" method="post" action="${webimroot}/client.php" />
<input type="hidden" name="style" value="${styleid}"/>
<input type="hidden" name="info" value="${form:info}"/>
<input type="hidden" name="referrer" value="${page:referrer}"/>
<input type="hidden" name="survey" value="on"/>
${ifnot:showemail}<input type="hidden" name="email" value="${form:email}"/>${endif:showemail}
${ifnot:groups}${if:formgroupid}<input type="hidden" name="group" value="${form:groupid}"/>${endif:formgroupid}${endif:groups}
${ifnot:showmessage}<input type="hidden" name="message" value="${form:message}"/>${endif:showmessage}
<table class="form">
${if:groups}
<tr>
<td><strong>${msg:form.field.department}</strong></td>
<td><select name="group" onchange="Survey.changeGroup(this, 'departmentDescription', groupDescriptions)">${page:groups}</select></td>
</tr>
<tr>
<td><strong>${msg:form.field.department.description}</strong></td>
<td id="departmentDescription">${page:default.department.description}</td>
</tr>
${endif:groups}
<tr>
<td><strong>${msg:presurvey.name}</strong></td>
<td><input type="text" name="name" size="50" value="${form:name}" class="username" ${ifnot:showname}disabled="disabled"${endif:showname}/></td>
</tr>
${if:showemail}
<tr>
<td><strong>${msg:presurvey.mail}</strong></td>
<td><input type="text" name="email" size="50" value="${form:email}" class="username"/></td>
</tr>
${endif:showemail}
${if:showmessage}
<tr>
<td><strong>${msg:presurvey.question}:</strong></td>
<td valign="top"><textarea name="message" tabindex="0" cols="45" rows="2">${form:message}</textarea></td>
</tr>
${endif:showmessage}
</table>
<a href="javascript:Survey.submit();" class="but" id="sndmessagelnk">${msg:presurvey.submit}</a>
<div class="clear">&nbsp;</div>
</div>
</body>
</html>

View File

@ -18,6 +18,10 @@
require_once('libs/init.php');
require_once('libs/chat.php');
require_once('libs/operator.php');
require_once('libs/invitation.php');
require_once('libs/groups.php');
require_once('libs/captcha.php');
require_once('libs/notify.php');
require_once('libs/classes/thread.php');
require_once('libs/classes/mibew_api.php');
require_once('libs/classes/mibew_api_interaction.php');