2015-11-11 20:44:54 +00:00
var bind = function ( fn , me ) { return function ( ) { return fn . apply ( me , arguments ) ; } ; } ,
2015-12-05 19:41:14 +00:00
slice = [ ] . slice ,
extend = function ( child , parent ) { for ( var key in parent ) { if ( hasProp . call ( parent , key ) ) child [ key ] = parent [ key ] ; } function ctor ( ) { this . constructor = child ; } ctor . prototype = parent . prototype ; child . prototype = new ctor ( ) ; child . _ _super _ _ = parent . prototype ; return child ; } ,
hasProp = { } . hasOwnProperty ;
2015-10-15 09:26:56 +00:00
( function ( $ , window ) {
2015-12-05 19:41:14 +00:00
var Base , Io , Log , Timeout , ZammadChat , myScript , scriptHost , scripts ;
2015-11-13 12:59:15 +00:00
scripts = document . getElementsByTagName ( 'script' ) ;
myScript = scripts [ scripts . length - 1 ] ;
2015-11-25 10:06:26 +00:00
scriptHost = myScript . src . match ( '.*://([^:/]*).*' ) [ 1 ] ;
2015-12-05 19:41:14 +00:00
Base = ( function ( ) {
Base . prototype . defaults = {
debug : false
} ;
function Base ( options ) {
this . options = $ . extend ( { } , this . defaults , options ) ;
this . log = new Log ( {
debug : this . options . debug ,
logPrefix : this . options . logPrefix || this . logPrefix
} ) ;
}
return Base ;
} ) ( ) ;
Log = ( function ( ) {
Log . prototype . defaults = {
debug : false
} ;
function Log ( options ) {
this . log = bind ( this . log , this ) ;
this . error = bind ( this . error , this ) ;
this . notice = bind ( this . notice , this ) ;
this . debug = bind ( this . debug , this ) ;
this . options = $ . extend ( { } , this . defaults , options ) ;
}
Log . prototype . debug = function ( ) {
var items ;
items = 1 <= arguments . length ? slice . call ( arguments , 0 ) : [ ] ;
2015-12-06 15:40:47 +00:00
if ( ! this . options . debug ) {
2015-12-05 19:41:14 +00:00
return ;
}
return this . log ( 'debug' , items ) ;
} ;
Log . prototype . notice = function ( ) {
var items ;
items = 1 <= arguments . length ? slice . call ( arguments , 0 ) : [ ] ;
return this . log ( 'notice' , items ) ;
} ;
Log . prototype . error = function ( ) {
var items ;
items = 1 <= arguments . length ? slice . call ( arguments , 0 ) : [ ] ;
2015-12-06 15:40:47 +00:00
return this . log ( 'error' , items ) ;
2015-12-05 19:41:14 +00:00
} ;
Log . prototype . log = function ( level , items ) {
var i , item , len , logString ;
items . unshift ( '||' ) ;
items . unshift ( level ) ;
items . unshift ( this . options . logPrefix ) ;
console . log . apply ( console , items ) ;
if ( ! this . options . debug ) {
return ;
}
logString = '' ;
for ( i = 0 , len = items . length ; i < len ; i ++ ) {
item = items [ i ] ;
logString += ' ' ;
if ( typeof item === 'object' ) {
logString += JSON . stringify ( item ) ;
} else if ( item && item . toString ) {
logString += item . toString ( ) ;
} else {
logString += item ;
}
}
return $ ( '.js-chatLogDisplay' ) . prepend ( '<div>' + logString + '</div>' ) ;
} ;
return Log ;
} ) ( ) ;
Timeout = ( function ( superClass ) {
extend ( Timeout , superClass ) ;
Timeout . prototype . timeoutStartedAt = null ;
Timeout . prototype . logPrefix = 'timeout' ;
Timeout . prototype . defaults = {
debug : false ,
timeout : 4 ,
timeoutIntervallCheck : 0.5
} ;
function Timeout ( options ) {
this . stop = bind ( this . stop , this ) ;
this . start = bind ( this . start , this ) ;
Timeout . _ _super _ _ . constructor . call ( this , options ) ;
}
Timeout . prototype . start = function ( ) {
var check , timeoutStartedAt ;
this . stop ( ) ;
timeoutStartedAt = new Date ;
check = ( function ( _this ) {
return function ( ) {
var timeLeft ;
timeLeft = new Date - new Date ( timeoutStartedAt . getTime ( ) + _this . options . timeout * 1000 * 60 ) ;
_this . log . debug ( "Timeout check for " + _this . options . timeout + " minutes (left " + ( timeLeft / 1000 ) + " sec.)" ) ;
if ( timeLeft < 0 ) {
return ;
}
_this . stop ( ) ;
return _this . options . callback ( ) ;
} ;
} ) ( this ) ;
this . log . debug ( "Start timeout in " + this . options . timeout + " minutes" ) ;
return this . intervallId = setInterval ( check , this . options . timeoutIntervallCheck * 1000 * 60 ) ;
} ;
Timeout . prototype . stop = function ( ) {
if ( ! this . intervallId ) {
return ;
}
2015-12-08 11:32:19 +00:00
this . log . debug ( "Stop timeout of " + this . options . timeout + " minutes" ) ;
2015-12-05 19:41:14 +00:00
return clearInterval ( this . intervallId ) ;
} ;
return Timeout ;
} ) ( Base ) ;
Io = ( function ( superClass ) {
extend ( Io , superClass ) ;
Io . prototype . logPrefix = 'io' ;
function Io ( options ) {
2015-12-09 14:11:29 +00:00
this . ping = bind ( this . ping , this ) ;
2015-12-05 19:41:14 +00:00
this . send = bind ( this . send , this ) ;
this . reconnect = bind ( this . reconnect , this ) ;
this . close = bind ( this . close , this ) ;
this . connect = bind ( this . connect , this ) ;
this . set = bind ( this . set , this ) ;
Io . _ _super _ _ . constructor . call ( this , options ) ;
}
Io . prototype . set = function ( params ) {
var key , results , value ;
results = [ ] ;
for ( key in params ) {
value = params [ key ] ;
results . push ( this . options [ key ] = value ) ;
}
return results ;
} ;
Io . prototype . connect = function ( ) {
this . log . debug ( "Connecting to " + this . options . host ) ;
this . ws = new window . WebSocket ( "" + this . options . host ) ;
this . ws . onopen = ( function ( _this ) {
return function ( e ) {
2015-12-08 11:32:19 +00:00
_this . log . debug ( 'onOpen' , e ) ;
2015-12-09 14:11:29 +00:00
_this . options . onOpen ( e ) ;
return _this . ping ( ) ;
2015-12-05 19:41:14 +00:00
} ;
} ) ( this ) ;
this . ws . onmessage = ( function ( _this ) {
return function ( e ) {
2015-12-09 14:11:29 +00:00
var i , len , pipe , pipes ;
2015-12-05 19:41:14 +00:00
pipes = JSON . parse ( e . data ) ;
2015-12-08 11:32:19 +00:00
_this . log . debug ( 'onMessage' , e . data ) ;
2015-12-09 14:11:29 +00:00
for ( i = 0 , len = pipes . length ; i < len ; i ++ ) {
pipe = pipes [ i ] ;
if ( pipe . event === 'pong' ) {
_this . ping ( ) ;
}
}
2015-12-05 19:41:14 +00:00
if ( _this . options . onMessage ) {
return _this . options . onMessage ( pipes ) ;
}
} ;
} ) ( this ) ;
this . ws . onclose = ( function ( _this ) {
return function ( e ) {
2015-12-08 11:32:19 +00:00
_this . log . debug ( 'close websocket connection' , e ) ;
2015-12-09 14:11:29 +00:00
if ( _this . pingDelayId ) {
clearTimeout ( _this . pingDelayId ) ;
}
2015-12-08 11:32:19 +00:00
if ( _this . manualClose ) {
_this . log . debug ( 'manual close, onClose callback' ) ;
_this . manualClose = false ;
if ( _this . options . onClose ) {
return _this . options . onClose ( e ) ;
}
} else {
_this . log . debug ( 'error close, onError callback' ) ;
if ( _this . options . onError ) {
return _this . options . onError ( 'Connection lost...' ) ;
}
2015-12-05 19:41:14 +00:00
}
} ;
} ) ( this ) ;
return this . ws . onerror = ( function ( _this ) {
return function ( e ) {
2015-12-08 11:32:19 +00:00
_this . log . debug ( 'onError' , e ) ;
2015-12-05 19:41:14 +00:00
if ( _this . options . onError ) {
return _this . options . onError ( e ) ;
}
} ;
} ) ( this ) ;
} ;
Io . prototype . close = function ( ) {
2015-12-08 11:32:19 +00:00
this . log . debug ( 'close websocket manually' ) ;
this . manualClose = true ;
2015-12-05 19:41:14 +00:00
return this . ws . close ( ) ;
} ;
Io . prototype . reconnect = function ( ) {
2015-12-08 11:32:19 +00:00
this . log . debug ( 'reconnect' ) ;
this . close ( ) ;
2015-12-05 19:41:14 +00:00
return this . connect ( ) ;
} ;
Io . prototype . send = function ( event , data ) {
var msg ;
if ( data == null ) {
data = { } ;
}
this . log . debug ( 'send' , event , data ) ;
msg = JSON . stringify ( {
event : event ,
data : data
} ) ;
return this . ws . send ( msg ) ;
} ;
2015-12-09 14:11:29 +00:00
Io . prototype . ping = function ( ) {
var localPing ;
localPing = ( function ( _this ) {
return function ( ) {
return _this . send ( 'ping' ) ;
} ;
} ) ( this ) ;
return this . pingDelayId = setTimeout ( localPing , 29000 ) ;
} ;
2015-12-05 19:41:14 +00:00
return Io ;
} ) ( Base ) ;
ZammadChat = ( function ( superClass ) {
extend ( ZammadChat , superClass ) ;
2015-10-15 09:26:56 +00:00
ZammadChat . prototype . defaults = {
2015-11-25 11:44:26 +00:00
chatId : void 0 ,
2015-11-13 14:58:44 +00:00
show : true ,
2015-11-13 09:45:40 +00:00
target : $ ( 'body' ) ,
2015-11-13 12:59:15 +00:00
host : '' ,
2015-11-13 14:58:44 +00:00
debug : false ,
2015-11-24 14:20:38 +00:00
flat : false ,
2015-11-25 16:36:06 +00:00
lang : void 0 ,
cssAutoload : true ,
cssUrl : void 0 ,
2015-11-16 10:46:42 +00:00
fontSize : void 0 ,
2015-11-24 14:20:38 +00:00
buttonClass : 'open-zammad-chat' ,
inactiveClass : 'is-inactive' ,
2015-11-25 23:40:52 +00:00
title : '<strong>Chat</strong> with us!' ,
2015-12-08 11:32:19 +00:00
idleTimeout : 6 ,
2015-12-05 19:41:14 +00:00
idleTimeoutIntervallCheck : 0.5 ,
inactiveTimeout : 8 ,
inactiveTimeoutIntervallCheck : 0.5 ,
waitingListTimeout : 4 ,
waitingListTimeoutIntervallCheck : 0.5
2015-10-15 09:26:56 +00:00
} ;
2015-12-05 19:41:14 +00:00
ZammadChat . prototype . logPrefix = 'chat' ;
2015-11-02 15:48:16 +00:00
ZammadChat . prototype . _messageCount = 0 ;
2015-12-08 11:32:19 +00:00
ZammadChat . prototype . isOpen = false ;
2015-10-15 09:26:56 +00:00
ZammadChat . prototype . blinkOnlineInterval = null ;
ZammadChat . prototype . stopBlinOnlineStateTimeout = null ;
2016-01-05 12:46:43 +00:00
ZammadChat . prototype . showTimeEveryXMinutes = 2 ;
2015-10-15 09:26:56 +00:00
ZammadChat . prototype . lastTimestamp = null ;
ZammadChat . prototype . lastAddedType = null ;
ZammadChat . prototype . inputTimeout = null ;
ZammadChat . prototype . isTyping = false ;
2015-11-13 14:58:44 +00:00
ZammadChat . prototype . state = 'offline' ;
2015-10-15 09:26:56 +00:00
2015-11-12 14:05:43 +00:00
ZammadChat . prototype . initialQueueDelay = 10000 ;
2015-11-25 16:36:06 +00:00
ZammadChat . prototype . translations = {
de : {
2016-01-20 18:09:53 +00:00
'<strong>Chat</strong> with us!' : '<strong>Chatte</strong> mit uns!' ,
2015-11-25 16:36:06 +00:00
'Online' : 'Online' ,
'Online' : 'Online' ,
'Offline' : 'Offline' ,
'Connecting' : 'Verbinden' ,
'Connection re-established' : 'Verbindung wiederhergestellt' ,
'Today' : 'Heute' ,
'Send' : 'Senden' ,
'Compose your message...' : 'Ihre Nachricht...' ,
2016-01-05 12:46:43 +00:00
'All colleagues are busy.' : 'Alle Kollegen sind belegt.' ,
2015-11-25 16:36:06 +00:00
'You are on waiting list position <strong>%s</strong>.' : 'Sie sind in der Warteliste an der Position <strong>%s</strong>.' ,
'Start new conversation' : 'Neue Konversation starten' ,
2015-11-25 23:40:52 +00:00
'Since you didn\'t respond in the last %s minutes your conversation with <strong>%s</strong> got closed.' : 'Da Sie in den letzten %s Minuten nichts geschrieben haben wurde Ihre Konversation mit <strong>%s</strong> geschlossen.' ,
'Since you didn\'t respond in the last %s minutes your conversation got closed.' : 'Da Sie in den letzten %s Minuten nichts geschrieben haben wurde Ihre Konversation geschlossen.'
2015-11-25 16:36:06 +00:00
}
2015-11-11 20:44:54 +00:00
} ;
2015-11-12 10:44:37 +00:00
ZammadChat . prototype . sessionId = void 0 ;
2015-11-11 20:44:54 +00:00
ZammadChat . prototype . T = function ( ) {
2015-11-25 16:36:06 +00:00
var i , item , items , len , string , translations ;
2015-11-11 20:44:54 +00:00
string = arguments [ 0 ] , items = 2 <= arguments . length ? slice . call ( arguments , 1 ) : [ ] ;
2015-11-25 16:36:06 +00:00
if ( this . options . lang && this . options . lang !== 'en' ) {
if ( ! this . translations [ this . options . lang ] ) {
2015-12-05 19:41:14 +00:00
this . log . notice ( "Translation '" + this . options . lang + "' needed!" ) ;
2015-11-25 16:36:06 +00:00
} else {
translations = this . translations [ this . options . lang ] ;
if ( ! translations [ string ] ) {
2015-12-05 19:41:14 +00:00
this . log . notice ( "Translation needed for '" + string + "'" ) ;
2015-11-25 16:36:06 +00:00
}
string = translations [ string ] || string ;
}
2015-11-11 20:44:54 +00:00
}
if ( items ) {
for ( i = 0 , len = items . length ; i < len ; i ++ ) {
item = items [ i ] ;
2015-11-25 16:36:06 +00:00
string = string . replace ( /%s/ , item ) ;
2015-11-11 20:44:54 +00:00
}
}
2015-11-25 16:36:06 +00:00
return string ;
2015-10-15 09:26:56 +00:00
} ;
ZammadChat . prototype . view = function ( name ) {
2015-11-02 15:48:16 +00:00
return ( function ( _this ) {
return function ( options ) {
if ( ! options ) {
options = { } ;
}
options . T = _this . T ;
2015-11-13 14:58:44 +00:00
options . background = _this . options . background ;
options . flat = _this . options . flat ;
2015-11-16 10:46:42 +00:00
options . fontSize = _this . options . fontSize ;
2015-11-02 15:48:16 +00:00
return window . zammadChatTemplates [ name ] ( options ) ;
} ;
} ) ( this ) ;
2015-10-15 09:26:56 +00:00
} ;
2015-11-13 12:59:15 +00:00
function ZammadChat ( options ) {
2015-12-05 19:41:14 +00:00
this . startTimeoutObservers = bind ( this . startTimeoutObservers , this ) ;
2016-03-03 14:12:53 +00:00
this . onCssLoaded = bind ( this . onCssLoaded , this ) ;
2015-10-15 09:26:56 +00:00
this . setAgentOnlineState = bind ( this . setAgentOnlineState , this ) ;
this . onConnectionEstablished = bind ( this . onConnectionEstablished , this ) ;
2015-11-12 14:05:43 +00:00
this . setSessionId = bind ( this . setSessionId , this ) ;
2015-10-15 09:26:56 +00:00
this . onConnectionReestablished = bind ( this . onConnectionReestablished , this ) ;
this . reconnect = bind ( this . reconnect , this ) ;
2015-12-05 19:41:14 +00:00
this . destroy = bind ( this . destroy , this ) ;
this . onLeaveTemporary = bind ( this . onLeaveTemporary , this ) ;
2015-10-15 09:26:56 +00:00
this . onAgentTypingEnd = bind ( this . onAgentTypingEnd , this ) ;
this . onAgentTypingStart = bind ( this . onAgentTypingStart , this ) ;
2015-11-02 15:48:16 +00:00
this . onQueue = bind ( this . onQueue , this ) ;
2015-11-12 14:05:43 +00:00
this . onQueueScreen = bind ( this . onQueueScreen , this ) ;
2015-12-08 11:32:19 +00:00
this . onWebSocketClose = bind ( this . onWebSocketClose , this ) ;
2015-10-15 09:26:56 +00:00
this . onCloseAnimationEnd = bind ( this . onCloseAnimationEnd , this ) ;
2015-11-11 10:44:10 +00:00
this . close = bind ( this . close , this ) ;
2016-02-08 15:06:56 +00:00
this . toggle = bind ( this . toggle , this ) ;
2015-12-08 11:32:19 +00:00
this . sessionClose = bind ( this . sessionClose , this ) ;
2015-11-25 23:40:52 +00:00
this . onOpenAnimationEnd = bind ( this . onOpenAnimationEnd , this ) ;
2015-11-11 10:44:10 +00:00
this . open = bind ( this . open , this ) ;
2015-11-12 14:05:43 +00:00
this . renderMessage = bind ( this . renderMessage , this ) ;
2015-10-15 09:26:56 +00:00
this . receiveMessage = bind ( this . receiveMessage , this ) ;
this . onSubmit = bind ( this . onSubmit , this ) ;
2016-02-08 15:06:56 +00:00
this . onFocus = bind ( this . onFocus , this ) ;
2015-10-15 09:26:56 +00:00
this . onInput = bind ( this . onInput , this ) ;
2015-12-08 11:32:19 +00:00
this . onReopenSession = bind ( this . onReopenSession , this ) ;
2015-11-13 14:58:44 +00:00
this . onError = bind ( this . onError , this ) ;
2015-11-02 15:48:16 +00:00
this . onWebSocketMessage = bind ( this . onWebSocketMessage , this ) ;
this . send = bind ( this . send , this ) ;
2015-10-15 09:26:56 +00:00
this . checkForEnter = bind ( this . checkForEnter , this ) ;
2015-12-05 19:41:14 +00:00
this . render = bind ( this . render , this ) ;
2015-11-02 15:48:16 +00:00
this . view = bind ( this . view , this ) ;
this . T = bind ( this . T , this ) ;
2015-11-25 11:55:02 +00:00
this . options = $ . extend ( { } , this . defaults , options ) ;
2015-12-05 19:41:14 +00:00
ZammadChat . _ _super _ _ . constructor . call ( this , this . options ) ;
2016-02-08 15:06:56 +00:00
this . isFullscreen = window . matchMedia && window . matchMedia ( '(max-width: 768px)' ) . matches ;
this . scrollRoot = $ ( this . getScrollRoot ( ) ) ;
2015-11-25 23:40:52 +00:00
if ( ! $ ) {
this . state = 'unsupported' ;
2015-12-05 19:41:14 +00:00
this . log . notice ( 'Chat: no jquery found!' ) ;
2015-11-25 23:40:52 +00:00
return ;
}
2015-11-13 14:58:44 +00:00
if ( ! window . WebSocket || ! sessionStorage ) {
2015-11-16 12:08:32 +00:00
this . state = 'unsupported' ;
2015-12-05 19:41:14 +00:00
this . log . notice ( 'Chat: Browser not supported!' ) ;
2015-11-13 14:58:44 +00:00
return ;
}
2015-11-25 11:55:02 +00:00
if ( ! this . options . chatId ) {
2015-11-25 10:06:26 +00:00
this . state = 'unsupported' ;
2015-12-05 19:41:14 +00:00
this . log . error ( 'Chat: need chatId as option!' ) ;
2015-11-25 10:06:26 +00:00
return ;
}
2015-11-25 16:36:06 +00:00
if ( ! this . options . lang ) {
this . options . lang = $ ( 'html' ) . attr ( 'lang' ) ;
}
if ( this . options . lang ) {
this . options . lang = this . options . lang . replace ( /-.+?$/ , '' ) ;
2015-12-05 19:41:14 +00:00
this . log . debug ( "lang: " + this . options . lang ) ;
2015-11-25 16:36:06 +00:00
}
2015-12-07 10:41:12 +00:00
if ( ! this . options . host ) {
this . detectHost ( ) ;
}
2015-12-05 19:41:14 +00:00
this . loadCss ( ) ;
this . io = new Io ( this . options ) ;
this . io . set ( {
onOpen : this . render ,
2015-12-08 11:32:19 +00:00
onClose : this . onWebSocketClose ,
onMessage : this . onWebSocketMessage ,
onError : this . onError
2015-12-05 19:41:14 +00:00
} ) ;
this . io . connect ( ) ;
}
2016-02-08 15:06:56 +00:00
ZammadChat . prototype . getScrollRoot = function ( ) {
var end , html , start ;
2016-02-08 20:49:00 +00:00
if ( 'scrollingElement' in document ) {
2016-02-08 15:06:56 +00:00
return document . scrollingElement ;
}
html = document . documentElement ;
start = html . scrollTop ;
html . scrollTop = start + 1 ;
end = html . scrollTop ;
html . scrollTop = start ;
if ( end > start ) {
return html ;
} else {
return document . body ;
}
} ;
2015-12-05 19:41:14 +00:00
ZammadChat . prototype . render = function ( ) {
2015-12-08 11:32:19 +00:00
if ( ! this . el || ! $ ( '.zammad-chat' ) . get ( 0 ) ) {
2016-02-08 15:06:56 +00:00
this . renderBase ( ) ;
2015-12-08 11:32:19 +00:00
}
2015-11-24 14:20:38 +00:00
$ ( "." + this . options . buttonClass ) . addClass ( this . inactiveClass ) ;
2015-12-05 19:41:14 +00:00
this . setAgentOnlineState ( 'online' ) ;
this . log . debug ( 'widget rendered' ) ;
this . startTimeoutObservers ( ) ;
this . idleTimeout . start ( ) ;
this . sessionId = sessionStorage . getItem ( 'sessionId' ) ;
return this . send ( 'chat_status_customer' , {
2016-03-25 07:45:21 +00:00
session _id : this . sessionId ,
url : window . location . href
2015-12-05 19:41:14 +00:00
} ) ;
} ;
2015-10-15 09:26:56 +00:00
2016-02-08 15:06:56 +00:00
ZammadChat . prototype . renderBase = function ( ) {
this . el = $ ( this . view ( 'chat' ) ( {
title : this . options . title
} ) ) ;
this . options . target . append ( this . el ) ;
this . input = this . el . find ( '.zammad-chat-input' ) ;
this . el . find ( '.js-chat-open' ) . click ( this . open ) ;
this . el . find ( '.js-chat-toggle' ) . click ( this . toggle ) ;
this . el . find ( '.zammad-chat-controls' ) . on ( 'submit' , this . onSubmit ) ;
this . input . on ( {
keydown : this . checkForEnter ,
input : this . onInput
} ) ;
$ ( window ) . on ( 'beforeunload' , ( function ( _this ) {
return function ( ) {
return _this . onLeaveTemporary ( ) ;
} ;
} ) ( this ) ) ;
$ ( window ) . bind ( 'hashchange' , ( function ( _this ) {
return function ( ) {
if ( _this . isOpen ) {
2016-03-25 07:45:21 +00:00
if ( _this . sessionId ) {
_this . send ( 'chat_session_notice' , {
session _id : _this . sessionId ,
message : window . location . href
} ) ;
}
2016-02-08 15:06:56 +00:00
return ;
}
return _this . idleTimeout . start ( ) ;
} ;
} ) ( this ) ) ;
if ( this . isFullscreen ) {
return this . input . on ( {
focus : this . onFocus ,
focusout : this . onFocusOut
} ) ;
}
} ;
2015-10-15 09:26:56 +00:00
ZammadChat . prototype . checkForEnter = function ( event ) {
if ( ! event . shiftKey && event . keyCode === 13 ) {
event . preventDefault ( ) ;
return this . sendMessage ( ) ;
}
} ;
2015-11-10 14:01:04 +00:00
ZammadChat . prototype . send = function ( event , data ) {
2015-11-25 10:06:26 +00:00
if ( data == null ) {
data = { } ;
}
2015-11-25 11:44:26 +00:00
data . chat _id = this . options . chatId ;
2015-12-05 19:41:14 +00:00
return this . io . send ( event , data ) ;
2015-11-02 15:48:16 +00:00
} ;
2015-12-05 19:41:14 +00:00
ZammadChat . prototype . onWebSocketMessage = function ( pipes ) {
var i , len , pipe ;
2015-11-10 14:01:04 +00:00
for ( i = 0 , len = pipes . length ; i < len ; i ++ ) {
pipe = pipes [ i ] ;
2015-12-05 19:41:14 +00:00
this . log . debug ( 'ws:onmessage' , pipe ) ;
2015-11-10 14:01:04 +00:00
switch ( pipe . event ) {
2015-11-25 10:06:26 +00:00
case 'chat_error' :
2015-12-05 19:41:14 +00:00
this . log . notice ( pipe . data ) ;
2015-11-25 23:40:52 +00:00
if ( pipe . data && pipe . data . state === 'chat_disabled' ) {
2015-12-05 19:41:14 +00:00
this . destroy ( {
2015-12-08 11:32:19 +00:00
remove : true
2015-12-05 19:41:14 +00:00
} ) ;
2015-11-25 23:40:52 +00:00
}
2015-11-25 10:06:26 +00:00
break ;
2015-11-10 14:01:04 +00:00
case 'chat_session_message' :
if ( pipe . data . self _written ) {
return ;
}
this . receiveMessage ( pipe . data ) ;
break ;
case 'chat_session_typing' :
if ( pipe . data . self _written ) {
return ;
}
this . onAgentTypingStart ( ) ;
break ;
case 'chat_session_start' :
2015-11-12 14:05:43 +00:00
this . onConnectionEstablished ( pipe . data ) ;
2015-11-10 14:01:04 +00:00
break ;
2015-11-12 10:44:37 +00:00
case 'chat_session_queue' :
2015-11-12 16:32:11 +00:00
this . onQueueScreen ( pipe . data ) ;
2015-11-10 14:01:04 +00:00
break ;
2015-11-11 20:44:54 +00:00
case 'chat_session_closed' :
this . onSessionClosed ( pipe . data ) ;
break ;
case 'chat_session_left' :
this . onSessionClosed ( pipe . data ) ;
break ;
2015-11-11 13:10:26 +00:00
case 'chat_status_customer' :
2015-11-10 14:01:04 +00:00
switch ( pipe . data . state ) {
case 'online' :
2015-11-13 09:45:40 +00:00
this . sessionId = void 0 ;
2016-03-03 14:12:53 +00:00
if ( ! this . options . cssAutoload || this . cssLoaded ) {
this . onReady ( ) ;
} else {
this . socketReady = true ;
}
2015-11-10 14:01:04 +00:00
break ;
case 'offline' :
2015-11-13 14:58:44 +00:00
this . onError ( 'Zammad Chat: No agent online' ) ;
2015-11-10 14:01:04 +00:00
break ;
case 'chat_disabled' :
2015-11-13 14:58:44 +00:00
this . onError ( 'Zammad Chat: Chat is disabled' ) ;
2015-11-10 14:01:04 +00:00
break ;
case 'no_seats_available' :
2015-11-25 10:06:26 +00:00
this . onError ( "Zammad Chat: Too many clients in queue. Clients in queue: " + pipe . data . queue ) ;
2015-11-12 09:39:14 +00:00
break ;
case 'reconnect' :
2015-12-08 11:32:19 +00:00
this . onReopenSession ( pipe . data ) ;
2015-11-10 14:01:04 +00:00
}
}
2015-11-02 15:48:16 +00:00
}
} ;
ZammadChat . prototype . onReady = function ( ) {
2015-12-05 19:41:14 +00:00
this . log . debug ( 'widget ready for use' ) ;
2015-11-24 14:20:38 +00:00
$ ( "." + this . options . buttonClass ) . click ( this . open ) . removeClass ( this . inactiveClass ) ;
2015-11-02 15:48:16 +00:00
if ( this . options . show ) {
2015-11-12 14:05:43 +00:00
return this . show ( ) ;
}
} ;
2015-11-13 14:58:44 +00:00
ZammadChat . prototype . onError = function ( message ) {
2015-12-05 19:41:14 +00:00
this . log . debug ( message ) ;
2015-12-08 11:32:19 +00:00
this . addStatus ( message ) ;
$ ( "." + this . options . buttonClass ) . hide ( ) ;
if ( this . isOpen ) {
this . disableInput ( ) ;
return this . destroy ( {
remove : false
} ) ;
} else {
return this . destroy ( {
remove : true
} ) ;
}
2015-11-13 14:58:44 +00:00
} ;
2015-12-08 11:32:19 +00:00
ZammadChat . prototype . onReopenSession = function ( data ) {
2015-11-12 16:32:11 +00:00
var i , len , message , ref , unfinishedMessage ;
2015-12-08 11:32:19 +00:00
this . log . debug ( 'old messages' , data . session ) ;
2015-12-05 19:41:14 +00:00
this . inactiveTimeout . start ( ) ;
2015-11-12 14:05:43 +00:00
unfinishedMessage = sessionStorage . getItem ( 'unfinished_message' ) ;
2015-11-13 14:58:44 +00:00
if ( data . agent ) {
this . onConnectionEstablished ( data ) ;
ref = data . session ;
for ( i = 0 , len = ref . length ; i < len ; i ++ ) {
message = ref [ i ] ;
this . renderMessage ( {
message : message . content ,
id : message . id ,
from : message . created _by _id ? 'agent' : 'customer'
} ) ;
}
if ( unfinishedMessage ) {
this . input . val ( unfinishedMessage ) ;
}
2015-11-02 15:48:16 +00:00
}
2015-11-13 14:58:44 +00:00
if ( data . position ) {
this . onQueue ( data ) ;
2015-11-12 14:05:43 +00:00
}
this . show ( ) ;
2015-11-12 15:19:47 +00:00
this . open ( ) ;
2015-11-12 16:32:11 +00:00
this . scrollToBottom ( ) ;
2015-11-12 14:05:43 +00:00
if ( unfinishedMessage ) {
return this . input . focus ( ) ;
}
2015-11-02 15:48:16 +00:00
} ;
2015-10-15 09:26:56 +00:00
ZammadChat . prototype . onInput = function ( ) {
this . el . find ( '.zammad-chat-message--unread' ) . removeClass ( 'zammad-chat-message--unread' ) ;
2015-11-12 14:05:43 +00:00
sessionStorage . setItem ( 'unfinished_message' , this . input . val ( ) ) ;
2015-11-25 15:15:59 +00:00
return this . onTyping ( ) ;
2015-10-15 09:26:56 +00:00
} ;
2016-02-08 15:06:56 +00:00
ZammadChat . prototype . onFocus = function ( ) {
var keyboardShown ;
$ ( window ) . scrollTop ( 10 ) ;
keyboardShown = $ ( window ) . scrollTop ( ) > 0 ;
$ ( window ) . scrollTop ( 0 ) ;
if ( keyboardShown ) {
2016-02-08 20:49:00 +00:00
return this . log . notice ( 'virtual keyboard shown' ) ;
2016-02-08 15:06:56 +00:00
}
} ;
ZammadChat . prototype . onFocusOut = function ( ) { } ;
2015-11-25 15:15:59 +00:00
ZammadChat . prototype . onTyping = function ( ) {
if ( this . isTyping && this . isTyping > new Date ( new Date ( ) . getTime ( ) - 1500 ) ) {
return ;
2015-11-10 14:01:04 +00:00
}
2015-11-25 15:15:59 +00:00
this . isTyping = new Date ( ) ;
2015-11-25 23:40:52 +00:00
this . send ( 'chat_session_typing' , {
2015-11-25 15:15:59 +00:00
session _id : this . sessionId
} ) ;
2015-12-05 19:41:14 +00:00
return this . inactiveTimeout . start ( ) ;
2015-10-15 09:26:56 +00:00
} ;
ZammadChat . prototype . onSubmit = function ( event ) {
event . preventDefault ( ) ;
return this . sendMessage ( ) ;
} ;
ZammadChat . prototype . sendMessage = function ( ) {
var message , messageElement ;
2015-11-12 14:05:43 +00:00
message = this . input . val ( ) ;
2015-11-02 15:48:16 +00:00
if ( ! message ) {
return ;
}
2015-12-05 19:41:14 +00:00
this . inactiveTimeout . start ( ) ;
2015-11-12 14:05:43 +00:00
sessionStorage . removeItem ( 'unfinished_message' ) ;
2015-11-02 15:48:16 +00:00
messageElement = this . view ( 'message' ) ( {
message : message ,
from : 'customer' ,
2015-11-26 09:52:10 +00:00
id : this . _messageCount ++ ,
unreadClass : ''
2015-11-02 15:48:16 +00:00
} ) ;
this . maybeAddTimestamp ( ) ;
if ( this . el . find ( '.zammad-chat-message--typing' ) . size ( ) ) {
this . lastAddedType = 'typing-placeholder' ;
this . el . find ( '.zammad-chat-message--typing' ) . before ( messageElement ) ;
} else {
this . lastAddedType = 'message--customer' ;
this . el . find ( '.zammad-chat-body' ) . append ( messageElement ) ;
2015-10-15 09:26:56 +00:00
}
2015-11-12 14:05:43 +00:00
this . input . val ( '' ) ;
2015-11-02 15:48:16 +00:00
this . scrollToBottom ( ) ;
2015-11-10 14:01:04 +00:00
return this . send ( 'chat_session_message' , {
content : message ,
id : this . _messageCount ,
2015-11-12 10:44:37 +00:00
session _id : this . sessionId
2015-11-02 15:48:16 +00:00
} ) ;
2015-10-15 09:26:56 +00:00
} ;
2015-11-02 15:48:16 +00:00
ZammadChat . prototype . receiveMessage = function ( data ) {
2015-12-05 19:41:14 +00:00
this . inactiveTimeout . start ( ) ;
2015-10-15 09:26:56 +00:00
this . onAgentTypingEnd ( ) ;
this . maybeAddTimestamp ( ) ;
2015-11-12 14:05:43 +00:00
return this . renderMessage ( {
2015-11-10 14:01:04 +00:00
message : data . message . content ,
2015-11-02 15:48:16 +00:00
id : data . id ,
2015-10-15 09:26:56 +00:00
from : 'agent'
2015-11-12 14:05:43 +00:00
} ) ;
} ;
ZammadChat . prototype . renderMessage = function ( data ) {
this . lastAddedType = "message--" + data . from ;
2015-11-26 09:52:10 +00:00
data . unreadClass = document . hidden ? ' zammad-chat-message--unread' : '' ;
2015-11-12 14:05:43 +00:00
this . el . find ( '.zammad-chat-body' ) . append ( this . view ( 'message' ) ( data ) ) ;
2015-10-15 09:26:56 +00:00
return this . scrollToBottom ( ) ;
} ;
2015-11-12 15:19:47 +00:00
ZammadChat . prototype . open = function ( ) {
2016-03-24 10:03:20 +00:00
var remainerHeight ;
2015-10-15 09:26:56 +00:00
if ( this . isOpen ) {
2015-12-08 11:32:19 +00:00
this . log . debug ( 'widget already open, block' ) ;
return ;
2015-10-15 09:26:56 +00:00
}
2015-12-08 11:32:19 +00:00
this . isOpen = true ;
this . log . debug ( 'open widget' ) ;
2015-11-12 15:19:47 +00:00
if ( ! this . sessionId ) {
2015-11-12 14:05:43 +00:00
this . showLoader ( ) ;
}
2015-11-25 13:47:02 +00:00
this . el . addClass ( 'zammad-chat-is-open' ) ;
2016-03-24 11:33:23 +00:00
if ( ! this . inputInitialized ) {
this . inputInitialized = true ;
this . input . autoGrow ( {
extraLine : false
} ) ;
}
2016-03-24 10:03:20 +00:00
remainerHeight = this . el . height ( ) - this . el . find ( '.zammad-chat-header' ) . outerHeight ( ) ;
this . el . css ( 'bottom' , - remainerHeight ) ;
2015-11-12 15:19:47 +00:00
if ( ! this . sessionId ) {
2015-11-12 14:05:43 +00:00
this . el . animate ( {
bottom : 0
} , 500 , this . onOpenAnimationEnd ) ;
2016-03-25 07:45:21 +00:00
return this . send ( 'chat_session_init' , {
url : window . location . href
} ) ;
2015-11-12 14:05:43 +00:00
} else {
this . el . css ( 'bottom' , 0 ) ;
2015-12-08 11:32:19 +00:00
return this . onOpenAnimationEnd ( ) ;
2015-11-12 15:19:47 +00:00
}
2015-10-15 09:26:56 +00:00
} ;
2015-11-25 23:40:52 +00:00
ZammadChat . prototype . onOpenAnimationEnd = function ( ) {
2016-02-08 15:06:56 +00:00
this . idleTimeout . stop ( ) ;
if ( this . isFullscreen ) {
return this . disableScrollOnRoot ( ) ;
}
2015-11-25 23:40:52 +00:00
} ;
2015-11-13 09:45:40 +00:00
2015-12-08 11:32:19 +00:00
ZammadChat . prototype . sessionClose = function ( ) {
2015-11-25 23:40:52 +00:00
this . send ( 'chat_session_close' , {
session _id : this . sessionId
} ) ;
2015-12-05 19:41:14 +00:00
this . inactiveTimeout . stop ( ) ;
this . waitingListTimeout . stop ( ) ;
2015-11-25 23:40:52 +00:00
sessionStorage . removeItem ( 'unfinished_message' ) ;
2015-11-13 09:45:40 +00:00
if ( this . onInitialQueueDelayId ) {
clearTimeout ( this . onInitialQueueDelayId ) ;
}
2015-11-25 23:40:52 +00:00
return this . setSessionId ( void 0 ) ;
2015-11-12 14:05:43 +00:00
} ;
2016-02-08 15:06:56 +00:00
ZammadChat . prototype . toggle = function ( event ) {
if ( this . isOpen ) {
return this . close ( event ) ;
} else {
return this . open ( event ) ;
}
} ;
2015-12-08 11:32:19 +00:00
ZammadChat . prototype . close = function ( event ) {
2015-11-12 14:05:43 +00:00
var remainerHeight ;
2015-12-08 11:32:19 +00:00
if ( ! this . isOpen ) {
this . log . debug ( 'can\'t close widget, it\'s not open' ) ;
return ;
}
2016-02-08 20:49:00 +00:00
if ( this . initDelayId ) {
clearTimeout ( this . initDelayId ) ;
}
2015-12-08 11:32:19 +00:00
if ( ! this . sessionId ) {
this . log . debug ( 'can\'t close widget without sessionId' ) ;
return ;
}
this . log . debug ( 'close widget' ) ;
if ( event ) {
event . stopPropagation ( ) ;
}
this . sessionClose ( ) ;
2016-02-08 15:06:56 +00:00
if ( this . isFullscreen ) {
this . enableScrollOnRoot ( ) ;
}
2015-10-15 09:26:56 +00:00
remainerHeight = this . el . height ( ) - this . el . find ( '.zammad-chat-header' ) . outerHeight ( ) ;
return this . el . animate ( {
bottom : - remainerHeight
2015-10-15 13:28:30 +00:00
} , 500 , this . onCloseAnimationEnd ) ;
2015-10-15 09:26:56 +00:00
} ;
ZammadChat . prototype . onCloseAnimationEnd = function ( ) {
2016-03-24 10:03:20 +00:00
this . el . css ( 'bottom' , '' ) ;
this . el . removeClass ( 'zammad-chat-is-open' ) ;
2015-12-05 19:41:14 +00:00
this . showLoader ( ) ;
this . el . find ( '.zammad-chat-welcome' ) . removeClass ( 'zammad-chat-is-hidden' ) ;
this . el . find ( '.zammad-chat-agent' ) . addClass ( 'zammad-chat-is-hidden' ) ;
this . el . find ( '.zammad-chat-agent-status' ) . addClass ( 'zammad-chat-is-hidden' ) ;
2015-11-11 20:44:54 +00:00
this . isOpen = false ;
2015-12-05 19:41:14 +00:00
return this . io . reconnect ( ) ;
2015-10-15 09:26:56 +00:00
} ;
2015-12-08 11:32:19 +00:00
ZammadChat . prototype . onWebSocketClose = function ( ) {
if ( this . isOpen ) {
return ;
}
2015-12-05 19:41:14 +00:00
if ( this . el ) {
2016-03-03 14:12:53 +00:00
this . el . removeClass ( 'zammad-chat-is-shown' ) ;
return this . el . removeClass ( 'zammad-chat-is-loaded' ) ;
2015-12-05 19:41:14 +00:00
}
2015-10-15 09:26:56 +00:00
} ;
ZammadChat . prototype . show = function ( ) {
2015-12-08 11:32:19 +00:00
if ( this . state === 'offline' ) {
return ;
2015-11-16 12:08:32 +00:00
}
2016-03-03 14:12:53 +00:00
this . el . addClass ( 'zammad-chat-is-loaded' ) ;
return this . el . addClass ( 'zammad-chat-is-shown' ) ;
2015-10-15 09:26:56 +00:00
} ;
2015-11-11 20:44:54 +00:00
ZammadChat . prototype . disableInput = function ( ) {
2015-11-12 14:05:43 +00:00
this . input . prop ( 'disabled' , true ) ;
2015-11-11 20:44:54 +00:00
return this . el . find ( '.zammad-chat-send' ) . prop ( 'disabled' , true ) ;
} ;
ZammadChat . prototype . enableInput = function ( ) {
2015-11-12 14:05:43 +00:00
this . input . prop ( 'disabled' , false ) ;
2015-11-11 20:44:54 +00:00
return this . el . find ( '.zammad-chat-send' ) . prop ( 'disabled' , false ) ;
} ;
2016-02-08 15:06:56 +00:00
ZammadChat . prototype . hideModal = function ( ) {
return this . el . find ( '.zammad-chat-modal' ) . html ( '' ) ;
} ;
2015-11-12 14:05:43 +00:00
ZammadChat . prototype . onQueueScreen = function ( data ) {
var show ;
2015-11-13 09:45:40 +00:00
this . setSessionId ( data . session _id ) ;
2015-11-12 14:05:43 +00:00
show = ( function ( _this ) {
return function ( ) {
2015-12-05 19:41:14 +00:00
_this . onQueue ( data ) ;
return _this . waitingListTimeout . start ( ) ;
2015-11-12 14:05:43 +00:00
} ;
} ) ( this ) ;
if ( this . initialQueueDelay && ! this . onInitialQueueDelayId ) {
this . onInitialQueueDelayId = setTimeout ( show , this . initialQueueDelay ) ;
return ;
}
if ( this . onInitialQueueDelayId ) {
clearTimeout ( this . onInitialQueueDelayId ) ;
}
return show ( ) ;
} ;
2015-11-12 15:19:47 +00:00
ZammadChat . prototype . onQueue = function ( data ) {
2015-12-05 19:41:14 +00:00
this . log . notice ( 'onQueue' , data . position ) ;
2015-11-02 15:48:16 +00:00
this . inQueue = true ;
2016-02-08 15:06:56 +00:00
return this . el . find ( '.zammad-chat-modal' ) . html ( this . view ( 'waiting' ) ( {
2015-11-12 14:05:43 +00:00
position : data . position
2015-11-02 15:48:16 +00:00
} ) ) ;
} ;
2015-10-15 09:26:56 +00:00
ZammadChat . prototype . onAgentTypingStart = function ( ) {
2015-11-11 13:10:26 +00:00
if ( this . stopTypingId ) {
clearTimeout ( this . stopTypingId ) ;
}
this . stopTypingId = setTimeout ( this . onAgentTypingEnd , 3000 ) ;
2015-10-15 09:26:56 +00:00
if ( this . el . find ( '.zammad-chat-message--typing' ) . size ( ) ) {
return ;
}
this . maybeAddTimestamp ( ) ;
this . el . find ( '.zammad-chat-body' ) . append ( this . view ( 'typingIndicator' ) ( ) ) ;
return this . scrollToBottom ( ) ;
} ;
ZammadChat . prototype . onAgentTypingEnd = function ( ) {
return this . el . find ( '.zammad-chat-message--typing' ) . remove ( ) ;
} ;
2015-12-05 19:41:14 +00:00
ZammadChat . prototype . onLeaveTemporary = function ( ) {
if ( ! this . sessionId ) {
return ;
}
return this . send ( 'chat_session_leave_temporary' , {
session _id : this . sessionId
} ) ;
} ;
2015-10-15 09:26:56 +00:00
ZammadChat . prototype . maybeAddTimestamp = function ( ) {
var label , time , timestamp ;
timestamp = Date . now ( ) ;
if ( ! this . lastTimestamp || ( timestamp - this . lastTimestamp ) > this . showTimeEveryXMinutes * 60000 ) {
label = this . T ( 'Today' ) ;
time = new Date ( ) . toTimeString ( ) . substr ( 0 , 5 ) ;
if ( this . lastAddedType === 'timestamp' ) {
this . updateLastTimestamp ( label , time ) ;
return this . lastTimestamp = timestamp ;
} else {
2015-11-12 15:19:47 +00:00
this . el . find ( '.zammad-chat-body' ) . append ( this . view ( 'timestamp' ) ( {
label : label ,
time : time
} ) ) ;
2015-10-15 09:26:56 +00:00
this . lastTimestamp = timestamp ;
2015-11-12 15:19:47 +00:00
this . lastAddedType = 'timestamp' ;
return this . scrollToBottom ( ) ;
2015-10-15 09:26:56 +00:00
}
}
} ;
ZammadChat . prototype . updateLastTimestamp = function ( label , time ) {
2015-12-08 11:32:19 +00:00
if ( ! this . el ) {
return ;
}
2015-11-12 15:19:47 +00:00
return this . el . find ( '.zammad-chat-body' ) . find ( '.zammad-chat-timestamp' ) . last ( ) . replaceWith ( this . view ( 'timestamp' ) ( {
2015-10-15 09:26:56 +00:00
label : label ,
time : time
} ) ) ;
} ;
2015-11-12 15:19:47 +00:00
ZammadChat . prototype . addStatus = function ( status ) {
2015-12-08 11:32:19 +00:00
if ( ! this . el ) {
return ;
}
2015-11-12 16:32:11 +00:00
this . maybeAddTimestamp ( ) ;
2015-11-12 15:19:47 +00:00
this . el . find ( '.zammad-chat-body' ) . append ( this . view ( 'status' ) ( {
status : status
2015-10-15 09:26:56 +00:00
} ) ) ;
2015-11-12 15:19:47 +00:00
return this . scrollToBottom ( ) ;
2015-10-15 09:26:56 +00:00
} ;
ZammadChat . prototype . scrollToBottom = function ( ) {
return this . el . find ( '.zammad-chat-body' ) . scrollTop ( $ ( '.zammad-chat-body' ) . prop ( 'scrollHeight' ) ) ;
} ;
2015-12-05 19:41:14 +00:00
ZammadChat . prototype . destroy = function ( params ) {
if ( params == null ) {
params = { } ;
2015-11-13 12:59:15 +00:00
}
2015-12-08 11:32:19 +00:00
this . log . debug ( 'destroy widget' , params ) ;
this . setAgentOnlineState ( 'offline' ) ;
if ( params . remove && this . el ) {
this . el . remove ( ) ;
2015-12-05 19:41:14 +00:00
}
2015-12-08 11:32:19 +00:00
if ( this . waitingListTimeout ) {
this . waitingListTimeout . stop ( ) ;
2015-11-13 09:45:40 +00:00
}
2015-12-08 11:32:19 +00:00
if ( this . inactiveTimeout ) {
this . inactiveTimeout . stop ( ) ;
2015-12-05 19:41:14 +00:00
}
2015-12-08 11:32:19 +00:00
if ( this . idleTimeout ) {
this . idleTimeout . stop ( ) ;
}
return this . io . close ( ) ;
2015-11-12 14:05:43 +00:00
} ;
2015-10-15 09:26:56 +00:00
ZammadChat . prototype . reconnect = function ( ) {
2015-12-05 19:41:14 +00:00
this . log . notice ( 'reconnecting' ) ;
2015-11-11 20:44:54 +00:00
this . disableInput ( ) ;
2015-10-15 09:26:56 +00:00
this . lastAddedType = 'status' ;
2015-11-13 14:58:44 +00:00
this . setAgentOnlineState ( 'connecting' ) ;
2015-12-05 19:41:14 +00:00
return this . addStatus ( this . T ( 'Connection lost' ) ) ;
2015-10-15 09:26:56 +00:00
} ;
ZammadChat . prototype . onConnectionReestablished = function ( ) {
this . lastAddedType = 'status' ;
2015-11-13 14:58:44 +00:00
this . setAgentOnlineState ( 'online' ) ;
2015-10-15 09:26:56 +00:00
return this . addStatus ( this . T ( 'Connection re-established' ) ) ;
} ;
2015-11-11 20:44:54 +00:00
ZammadChat . prototype . onSessionClosed = function ( data ) {
this . addStatus ( this . T ( 'Chat closed by %s' , data . realname ) ) ;
2015-11-25 10:06:26 +00:00
this . disableInput ( ) ;
2015-11-25 23:40:52 +00:00
this . setAgentOnlineState ( 'offline' ) ;
2015-12-05 19:41:14 +00:00
return this . inactiveTimeout . stop ( ) ;
2015-10-15 09:26:56 +00:00
} ;
2015-11-12 14:05:43 +00:00
ZammadChat . prototype . setSessionId = function ( id ) {
this . sessionId = id ;
2015-11-12 16:32:11 +00:00
if ( id === void 0 ) {
return sessionStorage . removeItem ( 'sessionId' ) ;
} else {
return sessionStorage . setItem ( 'sessionId' , id ) ;
}
2015-11-12 14:05:43 +00:00
} ;
ZammadChat . prototype . onConnectionEstablished = function ( data ) {
if ( this . onInitialQueueDelayId ) {
clearTimeout ( this . onInitialQueueDelayId ) ;
}
2015-11-02 15:48:16 +00:00
this . inQueue = false ;
2015-11-12 16:32:11 +00:00
if ( data . agent ) {
this . agent = data . agent ;
}
if ( data . session _id ) {
this . setSessionId ( data . session _id ) ;
}
2015-11-02 15:48:16 +00:00
this . el . find ( '.zammad-chat-agent' ) . html ( this . view ( 'agent' ) ( {
2015-11-12 14:05:43 +00:00
agent : this . agent
2015-11-02 15:48:16 +00:00
} ) ) ;
2015-11-11 20:44:54 +00:00
this . enableInput ( ) ;
2016-02-08 15:06:56 +00:00
this . hideModal ( ) ;
2015-10-15 09:26:56 +00:00
this . el . find ( '.zammad-chat-welcome' ) . addClass ( 'zammad-chat-is-hidden' ) ;
this . el . find ( '.zammad-chat-agent' ) . removeClass ( 'zammad-chat-is-hidden' ) ;
this . el . find ( '.zammad-chat-agent-status' ) . removeClass ( 'zammad-chat-is-hidden' ) ;
2016-02-08 15:06:56 +00:00
if ( ! this . isFullscreen ) {
this . input . focus ( ) ;
}
2015-12-05 19:41:14 +00:00
this . setAgentOnlineState ( 'online' ) ;
this . waitingListTimeout . stop ( ) ;
this . idleTimeout . stop ( ) ;
return this . inactiveTimeout . start ( ) ;
2015-10-15 09:26:56 +00:00
} ;
2015-12-05 19:41:14 +00:00
ZammadChat . prototype . showCustomerTimeout = function ( ) {
2015-11-25 23:40:52 +00:00
var reload ;
2016-02-08 15:06:56 +00:00
this . el . find ( '.zammad-chat-modal' ) . html ( this . view ( 'customer_timeout' ) ( {
2015-11-12 16:32:11 +00:00
agent : this . agent . name ,
2015-11-25 23:40:52 +00:00
delay : this . options . inactiveTimeout
2015-11-12 16:32:11 +00:00
} ) ) ;
2015-11-25 23:40:52 +00:00
reload = function ( ) {
return location . reload ( ) ;
} ;
2015-12-08 11:32:19 +00:00
this . el . find ( '.js-restart' ) . click ( reload ) ;
return this . sessionClose ( ) ;
2015-11-12 16:32:11 +00:00
} ;
2015-12-05 19:41:14 +00:00
ZammadChat . prototype . showWaitingListTimeout = function ( ) {
var reload ;
2016-02-08 15:06:56 +00:00
this . el . find ( '.zammad-chat-modal' ) . html ( this . view ( 'waiting_list_timeout' ) ( {
2015-12-05 19:41:14 +00:00
delay : this . options . watingListTimeout
} ) ) ;
reload = function ( ) {
return location . reload ( ) ;
} ;
2015-12-08 11:32:19 +00:00
this . el . find ( '.js-restart' ) . click ( reload ) ;
return this . sessionClose ( ) ;
2015-12-05 19:41:14 +00:00
} ;
2015-11-02 15:48:16 +00:00
ZammadChat . prototype . showLoader = function ( ) {
2016-02-08 15:06:56 +00:00
return this . el . find ( '.zammad-chat-modal' ) . html ( this . view ( 'loader' ) ( ) ) ;
2015-11-02 15:48:16 +00:00
} ;
2015-10-15 09:26:56 +00:00
ZammadChat . prototype . setAgentOnlineState = function ( state ) {
2015-11-13 14:58:44 +00:00
var capitalizedState ;
this . state = state ;
2015-12-08 11:32:19 +00:00
if ( ! this . el ) {
return ;
}
2015-11-13 14:58:44 +00:00
capitalizedState = state . charAt ( 0 ) . toUpperCase ( ) + state . slice ( 1 ) ;
return this . el . find ( '.zammad-chat-agent-status' ) . attr ( 'data-status' , state ) . text ( this . T ( capitalizedState ) ) ;
2015-10-15 09:26:56 +00:00
} ;
2015-12-07 10:41:12 +00:00
ZammadChat . prototype . detectHost = function ( ) {
var protocol ;
protocol = 'ws://' ;
if ( window . location . protocol === 'https:' ) {
protocol = 'wss://' ;
}
return this . options . host = "" + protocol + scriptHost + "/ws" ;
} ;
2015-11-25 16:36:06 +00:00
ZammadChat . prototype . loadCss = function ( ) {
var newSS , styles , url ;
if ( ! this . options . cssAutoload ) {
return ;
}
url = this . options . cssUrl ;
if ( ! url ) {
url = this . options . host . replace ( /^wss/i , 'https' ) . replace ( /^ws/i , 'http' ) . replace ( /\/ws/i , '' ) ;
url += '/assets/chat/chat.css' ;
}
2015-12-05 19:41:14 +00:00
this . log . debug ( "load css from '" + url + "'" ) ;
2015-11-25 16:36:06 +00:00
styles = "@import url('" + url + "');" ;
newSS = document . createElement ( 'link' ) ;
2016-03-03 14:12:53 +00:00
newSS . onload = this . onCssLoaded ;
2015-11-25 16:36:06 +00:00
newSS . rel = 'stylesheet' ;
newSS . href = 'data:text/css,' + escape ( styles ) ;
return document . getElementsByTagName ( 'head' ) [ 0 ] . appendChild ( newSS ) ;
} ;
2016-03-03 14:12:53 +00:00
ZammadChat . prototype . onCssLoaded = function ( ) {
if ( this . socketReady ) {
return this . onReady ( ) ;
} else {
return this . cssLoaded = true ;
}
} ;
2015-12-05 19:41:14 +00:00
ZammadChat . prototype . startTimeoutObservers = function ( ) {
this . idleTimeout = new Timeout ( {
logPrefix : 'idleTimeout' ,
debug : this . options . debug ,
timeout : this . options . idleTimeout ,
timeoutIntervallCheck : this . options . idleTimeoutIntervallCheck ,
callback : ( function ( _this ) {
return function ( ) {
_this . log . debug ( 'Idle timeout reached, hide widget' , new Date ) ;
return _this . destroy ( {
2015-12-08 11:32:19 +00:00
remove : true
2015-12-05 19:41:14 +00:00
} ) ;
} ;
} ) ( this )
} ) ;
this . inactiveTimeout = new Timeout ( {
logPrefix : 'inactiveTimeout' ,
debug : this . options . debug ,
timeout : this . options . inactiveTimeout ,
timeoutIntervallCheck : this . options . inactiveTimeoutIntervallCheck ,
callback : ( function ( _this ) {
return function ( ) {
_this . log . debug ( 'Inactive timeout reached, show timeout screen.' , new Date ) ;
_this . showCustomerTimeout ( ) ;
return _this . destroy ( {
2015-12-08 11:32:19 +00:00
remove : false
2015-12-05 19:41:14 +00:00
} ) ;
} ;
} ) ( this )
} ) ;
return this . waitingListTimeout = new Timeout ( {
logPrefix : 'waitingListTimeout' ,
debug : this . options . debug ,
timeout : this . options . waitingListTimeout ,
timeoutIntervallCheck : this . options . waitingListTimeoutIntervallCheck ,
callback : ( function ( _this ) {
return function ( ) {
_this . log . debug ( 'Waiting list timeout reached, show timeout screen.' , new Date ) ;
_this . showWaitingListTimeout ( ) ;
return _this . destroy ( {
2015-12-08 11:32:19 +00:00
remove : false
2015-12-05 19:41:14 +00:00
} ) ;
} ;
} ) ( this )
} ) ;
2015-11-25 23:40:52 +00:00
} ;
2016-02-08 15:06:56 +00:00
ZammadChat . prototype . disableScrollOnRoot = function ( ) {
this . rootScrollOffset = this . scrollRoot . scrollTop ( ) ;
return this . scrollRoot . css ( {
overflow : 'hidden' ,
position : 'fixed'
} ) ;
} ;
ZammadChat . prototype . enableScrollOnRoot = function ( ) {
this . scrollRoot . scrollTop ( this . rootScrollOffset ) ;
return this . scrollRoot . css ( {
overflow : '' ,
position : ''
} ) ;
} ;
2015-10-15 09:26:56 +00:00
return ZammadChat ;
2015-12-05 19:41:14 +00:00
} ) ( Base ) ;
2015-11-13 12:59:15 +00:00
return window . ZammadChat = ZammadChat ;
2015-10-15 09:26:56 +00:00
} ) ( window . jQuery , window ) ;
2016-03-24 11:33:23 +00:00
if ( ! window . zammadChatTemplates ) {
window . zammadChatTemplates = { } ;
}
window . zammadChatTemplates [ "agent" ] = function ( _ _obj ) {
if ( ! _ _obj ) _ _obj = { } ;
var _ _out = [ ] , _ _capture = function ( callback ) {
var out = _ _out , result ;
_ _out = [ ] ;
callback . call ( this ) ;
result = _ _out . join ( '' ) ;
_ _out = out ;
return _ _safe ( result ) ;
} , _ _sanitize = function ( value ) {
if ( value && value . ecoSafe ) {
return value ;
} else if ( typeof value !== 'undefined' && value != null ) {
return _ _escape ( value ) ;
} else {
return '' ;
}
} , _ _safe , _ _objSafe = _ _obj . safe , _ _escape = _ _obj . escape ;
_ _safe = _ _obj . safe = function ( value ) {
if ( value && value . ecoSafe ) {
return value ;
} else {
if ( ! ( typeof value !== 'undefined' && value != null ) ) value = '' ;
var result = new String ( value ) ;
result . ecoSafe = true ;
return result ;
}
} ;
if ( ! _ _escape ) {
_ _escape = _ _obj . escape = function ( value ) {
return ( '' + value )
. replace ( /&/g , '&' )
. replace ( /</g , '<' )
. replace ( />/g , '>' )
. replace ( /"/g , '"' ) ;
} ;
}
( function ( ) {
( function ( ) {
if ( this . agent . avatar ) {
_ _out . push ( '\n<img class="zammad-chat-agent-avatar" src="' ) ;
_ _out . push ( _ _sanitize ( this . agent . avatar ) ) ;
_ _out . push ( '">\n' ) ;
}
_ _out . push ( '\n<span class="zammad-chat-agent-sentence">\n <span class="zammad-chat-agent-name">' ) ;
_ _out . push ( _ _sanitize ( this . agent . name ) ) ;
_ _out . push ( '</span>\n</span>' ) ;
} ) . call ( this ) ;
} ) . call ( _ _obj ) ;
_ _obj . safe = _ _objSafe , _ _obj . escape = _ _escape ;
return _ _out . join ( '' ) ;
} ;
2016-01-20 19:38:38 +00:00
/ * !
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* "THE BEER-WARE LICENSE" ( Revision 42 ) :
* < jevin9 @ gmail . com > wrote this file . As long as you retain this notice you
* can do whatever you want with this stuff . If we meet some day , and you think
* this stuff is worth it , you can buy me a beer in return . Jevin O . Sewaruth
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
*
* Autogrow Textarea Plugin Version v3 . 0
* http : //www.technoreply.com/autogrow-textarea-plugin-3-0
*
* THIS PLUGIN IS DELIVERD ON A PAY WHAT YOU WHANT BASIS . IF THE PLUGIN WAS USEFUL TO YOU , PLEASE CONSIDER BUYING THE PLUGIN HERE :
* https : //sites.fastspring.com/technoreply/instant/autogrowtextareaplugin
*
* Date : October 15 , 2012
*
* Zammad modification : remove overflow : hidden when maximum height is reached
*
* /
jQuery . fn . autoGrow = function ( options ) {
return this . each ( function ( ) {
var settings = jQuery . extend ( {
extraLine : true ,
} , options ) ;
var createMirror = function ( textarea ) {
jQuery ( textarea ) . after ( '<div class="autogrow-textarea-mirror"></div>' ) ;
return jQuery ( textarea ) . next ( '.autogrow-textarea-mirror' ) [ 0 ] ;
}
var sendContentToMirror = function ( textarea ) {
mirror . innerHTML = String ( textarea . value )
. replace ( /&/g , '&' )
. replace ( /"/g , '"' )
. replace ( /'/g , ''' )
. replace ( /</g , '<' )
. replace ( />/g , '>' )
. replace ( / /g , ' ' )
. replace ( /\n/g , '<br />' ) +
( settings . extraLine ? '.<br/>.' : '' )
;
if ( jQuery ( textarea ) . height ( ) != jQuery ( mirror ) . height ( ) ) {
jQuery ( textarea ) . height ( jQuery ( mirror ) . height ( ) ) ;
var maxHeight = parseInt ( jQuery ( textarea ) . css ( 'max-height' ) , 10 ) ;
var overflow = jQuery ( mirror ) . height ( ) > maxHeight ? '' : 'hidden'
jQuery ( textarea ) . css ( 'overflow' , overflow ) ;
}
}
var growTextarea = function ( ) {
sendContentToMirror ( this ) ;
}
// Create a mirror
var mirror = createMirror ( this ) ;
// Style the mirror
mirror . style . display = 'none' ;
mirror . style . wordWrap = 'break-word' ;
mirror . style . whiteSpace = 'normal' ;
mirror . style . padding = jQuery ( this ) . css ( 'paddingTop' ) + ' ' +
jQuery ( this ) . css ( 'paddingRight' ) + ' ' +
jQuery ( this ) . css ( 'paddingBottom' ) + ' ' +
jQuery ( this ) . css ( 'paddingLeft' ) ;
mirror . style . width = jQuery ( this ) . css ( 'width' ) ;
mirror . style . fontFamily = jQuery ( this ) . css ( 'font-family' ) ;
mirror . style . fontSize = jQuery ( this ) . css ( 'font-size' ) ;
mirror . style . lineHeight = jQuery ( this ) . css ( 'line-height' ) ;
// Style the textarea
this . style . overflow = "hidden" ;
this . style . minHeight = this . rows + "em" ;
// Bind the textarea's event
this . onkeyup = growTextarea ;
// Fire the event for text already present
sendContentToMirror ( this ) ;
} ) ;
} ;
2015-11-12 15:19:47 +00:00
if ( ! window . zammadChatTemplates ) {
window . zammadChatTemplates = { } ;
}
2015-11-12 16:32:11 +00:00
window . zammadChatTemplates [ "chat" ] = function ( _ _obj ) {
2015-11-12 15:19:47 +00:00
if ( ! _ _obj ) _ _obj = { } ;
var _ _out = [ ] , _ _capture = function ( callback ) {
var out = _ _out , result ;
_ _out = [ ] ;
callback . call ( this ) ;
result = _ _out . join ( '' ) ;
_ _out = out ;
return _ _safe ( result ) ;
} , _ _sanitize = function ( value ) {
if ( value && value . ecoSafe ) {
return value ;
} else if ( typeof value !== 'undefined' && value != null ) {
return _ _escape ( value ) ;
} else {
return '' ;
}
} , _ _safe , _ _objSafe = _ _obj . safe , _ _escape = _ _obj . escape ;
_ _safe = _ _obj . safe = function ( value ) {
if ( value && value . ecoSafe ) {
return value ;
} else {
if ( ! ( typeof value !== 'undefined' && value != null ) ) value = '' ;
var result = new String ( value ) ;
result . ecoSafe = true ;
return result ;
}
} ;
if ( ! _ _escape ) {
_ _escape = _ _obj . escape = function ( value ) {
return ( '' + value )
. replace ( /&/g , '&' )
. replace ( /</g , '<' )
. replace ( />/g , '>' )
. replace ( /"/g , '"' ) ;
} ;
}
( function ( ) {
( function ( ) {
2015-11-13 14:58:44 +00:00
_ _out . push ( '<div class="zammad-chat' ) ;
2016-01-20 19:38:38 +00:00
2015-11-13 14:58:44 +00:00
if ( this . flat ) {
_ _out . push ( _ _sanitize ( ' zammad-chat--flat' ) ) ;
}
2016-01-20 19:38:38 +00:00
2015-11-16 10:46:42 +00:00
_ _out . push ( '"' ) ;
2016-01-20 19:38:38 +00:00
2015-11-16 10:46:42 +00:00
if ( this . fontSize ) {
2015-11-16 13:39:39 +00:00
_ _out . push ( _ _sanitize ( " style='font-size: " + this . fontSize + "'" ) ) ;
2015-11-16 10:46:42 +00:00
}
2016-01-20 19:38:38 +00:00
2015-11-16 10:46:42 +00:00
_ _out . push ( '>\n <div class="zammad-chat-header js-chat-open"' ) ;
2016-01-20 19:38:38 +00:00
2015-11-13 14:58:44 +00:00
if ( this . background ) {
_ _out . push ( _ _sanitize ( " style='background: " + this . background + "'" ) ) ;
}
2016-01-20 19:38:38 +00:00
2016-03-03 14:12:53 +00:00
_ _out . push ( '>\n <div class="zammad-chat-header-controls js-chat-toggle">\n <span class="zammad-chat-agent-status zammad-chat-is-hidden" data-status="online"></span>\n <span class="zammad-chat-header-icon">\n <svg class="zammad-chat-header-icon-open" width="13" height="7" viewBox="0 0 13 7"><path d="M10.807 7l1.4-1.428-5-4.9L6.5-.02l-.7.7-4.9 4.9 1.414 1.413L6.5 2.886 10.807 7z" fill-rule="evenodd"/></svg>\n <svg class="zammad-chat-header-icon-close" width="13" height="13" viewBox="0 0 13 13"><path d="m2.241.12l-2.121 2.121 4.243 4.243-4.243 4.243 2.121 2.121 4.243-4.243 4.243 4.243 2.121-2.121-4.243-4.243 4.243-4.243-2.121-2.121-4.243 4.243-4.243-4.243" fill-rule="evenodd"/></svg>\n </span>\n </div>\n <div class="zammad-chat-agent zammad-chat-is-hidden">\n </div>\n <div class="zammad-chat-welcome">\n <svg class="zammad-chat-icon" viewBox="0 0 24 24" width="24" height="24"><path d="M2 5C2 4 3 3 4 3h16c1 0 2 1 2 2v10C22 16 21 17 20 17H4C3 17 2 16 2 15V5zM12 17l6 4v-4h-6z"/></svg>\n <span class="zammad-chat-welcome-text">' ) ;
2016-01-20 19:38:38 +00:00
2015-11-25 16:36:06 +00:00
_ _out . push ( this . T ( this . title ) ) ;
2016-01-20 19:38:38 +00:00
2016-02-08 15:06:56 +00:00
_ _out . push ( '</span>\n </div>\n </div>\n <div class="zammad-chat-modal"></div>\n <div class="zammad-chat-body"></div>\n <form class="zammad-chat-controls">\n <textarea class="zammad-chat-input" rows="1" placeholder="' ) ;
2016-01-20 19:38:38 +00:00
2015-11-12 16:32:11 +00:00
_ _out . push ( this . T ( 'Compose your message...' ) ) ;
2016-01-20 19:38:38 +00:00
2015-11-13 14:58:44 +00:00
_ _out . push ( '"></textarea>\n <button type="submit" class="zammad-chat-button zammad-chat-send"' ) ;
2016-01-20 19:38:38 +00:00
2015-11-13 14:58:44 +00:00
if ( this . background ) {
_ _out . push ( _ _sanitize ( " style='background: " + this . background + "'" ) ) ;
}
2016-01-20 19:38:38 +00:00
2015-11-13 14:58:44 +00:00
_ _out . push ( '>' ) ;
2016-01-20 19:38:38 +00:00
2015-11-12 16:32:11 +00:00
_ _out . push ( this . T ( 'Send' ) ) ;
2016-01-20 19:38:38 +00:00
2015-11-12 16:32:11 +00:00
_ _out . push ( '</button>\n </form>\n</div>' ) ;
2016-01-20 19:38:38 +00:00
2015-11-12 15:19:47 +00:00
} ) . call ( this ) ;
2016-01-20 19:38:38 +00:00
2015-11-12 15:19:47 +00:00
} ) . call ( _ _obj ) ;
_ _obj . safe = _ _objSafe , _ _obj . escape = _ _escape ;
return _ _out . join ( '' ) ;
} ;
2015-12-05 19:41:14 +00:00
if ( ! window . zammadChatTemplates ) {
window . zammadChatTemplates = { } ;
}
window . zammadChatTemplates [ "customer_timeout" ] = function ( _ _obj ) {
if ( ! _ _obj ) _ _obj = { } ;
var _ _out = [ ] , _ _capture = function ( callback ) {
var out = _ _out , result ;
_ _out = [ ] ;
callback . call ( this ) ;
result = _ _out . join ( '' ) ;
_ _out = out ;
return _ _safe ( result ) ;
} , _ _sanitize = function ( value ) {
if ( value && value . ecoSafe ) {
return value ;
} else if ( typeof value !== 'undefined' && value != null ) {
return _ _escape ( value ) ;
} else {
return '' ;
}
} , _ _safe , _ _objSafe = _ _obj . safe , _ _escape = _ _obj . escape ;
_ _safe = _ _obj . safe = function ( value ) {
if ( value && value . ecoSafe ) {
return value ;
} else {
if ( ! ( typeof value !== 'undefined' && value != null ) ) value = '' ;
var result = new String ( value ) ;
result . ecoSafe = true ;
return result ;
}
} ;
if ( ! _ _escape ) {
_ _escape = _ _obj . escape = function ( value ) {
return ( '' + value )
. replace ( /&/g , '&' )
. replace ( /</g , '<' )
. replace ( />/g , '>' )
. replace ( /"/g , '"' ) ;
} ;
}
( function ( ) {
( function ( ) {
2016-02-08 15:06:56 +00:00
_ _out . push ( '<div class="zammad-chat-modal-text">\n ' ) ;
2016-01-20 19:38:38 +00:00
2015-12-05 19:41:14 +00:00
if ( this . agent ) {
_ _out . push ( '\n ' ) ;
2016-02-08 15:06:56 +00:00
_ _out . push ( this . T ( 'Since you didn\'t respond in the last %s minutes your conversation with <strong>%s</strong> got closed.' , this . delay , this . agent ) ) ;
_ _out . push ( '\n ' ) ;
2015-12-05 19:41:14 +00:00
} else {
_ _out . push ( '\n ' ) ;
2016-02-08 15:06:56 +00:00
_ _out . push ( this . T ( 'Since you didn\'t respond in the last %s minutes your conversation got closed.' , this . delay ) ) ;
_ _out . push ( '\n ' ) ;
2015-12-05 19:41:14 +00:00
}
2016-01-20 19:38:38 +00:00
2016-02-08 15:06:56 +00:00
_ _out . push ( '\n <br>\n <div class="zammad-chat-button js-restart"' ) ;
2016-01-20 19:38:38 +00:00
2015-12-05 19:41:14 +00:00
if ( this . background ) {
_ _out . push ( _ _sanitize ( " style='background: " + this . background + "'" ) ) ;
}
2016-01-20 19:38:38 +00:00
2015-12-05 19:41:14 +00:00
_ _out . push ( '>' ) ;
2016-01-20 19:38:38 +00:00
2015-12-05 19:41:14 +00:00
_ _out . push ( this . T ( 'Start new conversation' ) ) ;
2016-01-20 19:38:38 +00:00
2016-02-08 15:06:56 +00:00
_ _out . push ( '</div>\n</div>' ) ;
2016-01-20 19:38:38 +00:00
2015-12-05 19:41:14 +00:00
} ) . call ( this ) ;
2016-01-20 19:38:38 +00:00
2015-12-05 19:41:14 +00:00
} ) . call ( _ _obj ) ;
_ _obj . safe = _ _objSafe , _ _obj . escape = _ _escape ;
return _ _out . join ( '' ) ;
} ;
2015-11-11 10:44:10 +00:00
if ( ! window . zammadChatTemplates ) {
window . zammadChatTemplates = { } ;
}
2015-11-12 16:32:11 +00:00
window . zammadChatTemplates [ "loader" ] = function ( _ _obj ) {
2015-11-11 10:44:10 +00:00
if ( ! _ _obj ) _ _obj = { } ;
var _ _out = [ ] , _ _capture = function ( callback ) {
var out = _ _out , result ;
_ _out = [ ] ;
callback . call ( this ) ;
result = _ _out . join ( '' ) ;
_ _out = out ;
return _ _safe ( result ) ;
} , _ _sanitize = function ( value ) {
if ( value && value . ecoSafe ) {
return value ;
} else if ( typeof value !== 'undefined' && value != null ) {
return _ _escape ( value ) ;
} else {
return '' ;
}
} , _ _safe , _ _objSafe = _ _obj . safe , _ _escape = _ _obj . escape ;
_ _safe = _ _obj . safe = function ( value ) {
if ( value && value . ecoSafe ) {
return value ;
} else {
if ( ! ( typeof value !== 'undefined' && value != null ) ) value = '' ;
var result = new String ( value ) ;
result . ecoSafe = true ;
return result ;
}
} ;
if ( ! _ _escape ) {
_ _escape = _ _obj . escape = function ( value ) {
return ( '' + value )
. replace ( /&/g , '&' )
. replace ( /</g , '<' )
. replace ( />/g , '>' )
. replace ( /"/g , '"' ) ;
} ;
}
( function ( ) {
( function ( ) {
2016-02-08 15:06:56 +00:00
_ _out . push ( '<span class="zammad-chat-loading-animation">\n <span class="zammad-chat-loading-circle"></span>\n <span class="zammad-chat-loading-circle"></span>\n <span class="zammad-chat-loading-circle"></span>\n</span>\n<span class="zammad-chat-modal-text">' ) ;
2016-01-20 19:38:38 +00:00
2015-11-24 14:20:38 +00:00
_ _out . push ( this . T ( 'Connecting' ) ) ;
2016-01-20 19:38:38 +00:00
2016-02-08 15:06:56 +00:00
_ _out . push ( '</span>' ) ;
2016-01-20 19:38:38 +00:00
2015-11-02 15:48:16 +00:00
} ) . call ( this ) ;
2016-01-20 19:38:38 +00:00
2015-11-02 15:48:16 +00:00
} ) . call ( _ _obj ) ;
_ _obj . safe = _ _objSafe , _ _obj . escape = _ _escape ;
return _ _out . join ( '' ) ;
} ;
if ( ! window . zammadChatTemplates ) {
window . zammadChatTemplates = { } ;
}
2015-11-12 16:32:11 +00:00
window . zammadChatTemplates [ "message" ] = function ( _ _obj ) {
2015-11-02 15:48:16 +00:00
if ( ! _ _obj ) _ _obj = { } ;
var _ _out = [ ] , _ _capture = function ( callback ) {
var out = _ _out , result ;
_ _out = [ ] ;
callback . call ( this ) ;
result = _ _out . join ( '' ) ;
_ _out = out ;
return _ _safe ( result ) ;
} , _ _sanitize = function ( value ) {
if ( value && value . ecoSafe ) {
return value ;
} else if ( typeof value !== 'undefined' && value != null ) {
return _ _escape ( value ) ;
} else {
return '' ;
}
} , _ _safe , _ _objSafe = _ _obj . safe , _ _escape = _ _obj . escape ;
_ _safe = _ _obj . safe = function ( value ) {
if ( value && value . ecoSafe ) {
return value ;
} else {
if ( ! ( typeof value !== 'undefined' && value != null ) ) value = '' ;
var result = new String ( value ) ;
result . ecoSafe = true ;
return result ;
}
} ;
if ( ! _ _escape ) {
_ _escape = _ _obj . escape = function ( value ) {
return ( '' + value )
. replace ( /&/g , '&' )
. replace ( /</g , '<' )
. replace ( />/g , '>' )
. replace ( /"/g , '"' ) ;
} ;
}
( function ( ) {
( function ( ) {
2015-11-12 16:32:11 +00:00
_ _out . push ( '<div class="zammad-chat-message zammad-chat-message--' ) ;
2016-01-20 19:38:38 +00:00
2015-11-12 16:32:11 +00:00
_ _out . push ( _ _sanitize ( this . from ) ) ;
2016-01-20 19:38:38 +00:00
2015-11-26 09:52:10 +00:00
_ _out . push ( _ _sanitize ( this . unreadClass ) ) ;
2016-01-20 19:38:38 +00:00
2015-11-13 14:58:44 +00:00
_ _out . push ( '">\n <span class="zammad-chat-message-body"' ) ;
2016-01-20 19:38:38 +00:00
2015-11-13 14:58:44 +00:00
if ( this . background && this . from === 'customer' ) {
_ _out . push ( _ _sanitize ( " style='background: " + this . background + "'" ) ) ;
}
2016-01-20 19:38:38 +00:00
2015-11-13 14:58:44 +00:00
_ _out . push ( '>' ) ;
2016-01-20 19:38:38 +00:00
2015-11-12 16:32:11 +00:00
_ _out . push ( this . message ) ;
2016-01-20 19:38:38 +00:00
2015-11-02 15:48:16 +00:00
_ _out . push ( '</span>\n</div>' ) ;
2016-01-20 19:38:38 +00:00
2015-11-02 15:48:16 +00:00
} ) . call ( this ) ;
2016-01-20 19:38:38 +00:00
2015-11-02 15:48:16 +00:00
} ) . call ( _ _obj ) ;
_ _obj . safe = _ _objSafe , _ _obj . escape = _ _escape ;
return _ _out . join ( '' ) ;
} ;
2015-10-15 09:14:19 +00:00
if ( ! window . zammadChatTemplates ) {
window . zammadChatTemplates = { } ;
}
2015-11-12 16:32:11 +00:00
window . zammadChatTemplates [ "status" ] = function ( _ _obj ) {
2015-10-15 09:14:19 +00:00
if ( ! _ _obj ) _ _obj = { } ;
var _ _out = [ ] , _ _capture = function ( callback ) {
var out = _ _out , result ;
_ _out = [ ] ;
callback . call ( this ) ;
result = _ _out . join ( '' ) ;
_ _out = out ;
return _ _safe ( result ) ;
} , _ _sanitize = function ( value ) {
if ( value && value . ecoSafe ) {
return value ;
} else if ( typeof value !== 'undefined' && value != null ) {
return _ _escape ( value ) ;
} else {
return '' ;
}
} , _ _safe , _ _objSafe = _ _obj . safe , _ _escape = _ _obj . escape ;
_ _safe = _ _obj . safe = function ( value ) {
if ( value && value . ecoSafe ) {
return value ;
} else {
if ( ! ( typeof value !== 'undefined' && value != null ) ) value = '' ;
var result = new String ( value ) ;
result . ecoSafe = true ;
return result ;
}
} ;
if ( ! _ _escape ) {
_ _escape = _ _obj . escape = function ( value ) {
return ( '' + value )
. replace ( /&/g , '&' )
. replace ( /</g , '<' )
. replace ( />/g , '>' )
. replace ( /"/g , '"' ) ;
} ;
}
( function ( ) {
( function ( ) {
2016-01-12 10:57:38 +00:00
_ _out . push ( '<div class="zammad-chat-status">\n <div class="zammad-chat-status-inner">\n ' ) ;
2016-01-20 19:38:38 +00:00
2015-11-12 16:32:11 +00:00
_ _out . push ( this . status ) ;
2016-01-20 19:38:38 +00:00
2016-01-12 10:57:38 +00:00
_ _out . push ( '\n </div>\n</div>' ) ;
2016-01-20 19:38:38 +00:00
2015-10-15 09:14:19 +00:00
} ) . call ( this ) ;
2016-01-20 19:38:38 +00:00
2015-10-15 09:14:19 +00:00
} ) . call ( _ _obj ) ;
_ _obj . safe = _ _objSafe , _ _obj . escape = _ _escape ;
return _ _out . join ( '' ) ;
} ;
if ( ! window . zammadChatTemplates ) {
window . zammadChatTemplates = { } ;
}
2015-12-05 19:41:14 +00:00
window . zammadChatTemplates [ "timestamp" ] = function ( _ _obj ) {
2015-10-15 09:14:19 +00:00
if ( ! _ _obj ) _ _obj = { } ;
var _ _out = [ ] , _ _capture = function ( callback ) {
var out = _ _out , result ;
_ _out = [ ] ;
callback . call ( this ) ;
result = _ _out . join ( '' ) ;
_ _out = out ;
return _ _safe ( result ) ;
} , _ _sanitize = function ( value ) {
if ( value && value . ecoSafe ) {
return value ;
} else if ( typeof value !== 'undefined' && value != null ) {
return _ _escape ( value ) ;
} else {
return '' ;
}
} , _ _safe , _ _objSafe = _ _obj . safe , _ _escape = _ _obj . escape ;
_ _safe = _ _obj . safe = function ( value ) {
if ( value && value . ecoSafe ) {
return value ;
} else {
if ( ! ( typeof value !== 'undefined' && value != null ) ) value = '' ;
var result = new String ( value ) ;
result . ecoSafe = true ;
return result ;
}
} ;
if ( ! _ _escape ) {
_ _escape = _ _obj . escape = function ( value ) {
return ( '' + value )
. replace ( /&/g , '&' )
. replace ( /</g , '<' )
. replace ( />/g , '>' )
. replace ( /"/g , '"' ) ;
} ;
}
( function ( ) {
( function ( ) {
2015-12-05 19:41:14 +00:00
_ _out . push ( '<div class="zammad-chat-timestamp"><strong>' ) ;
2016-01-20 19:38:38 +00:00
2015-12-05 19:41:14 +00:00
_ _out . push ( _ _sanitize ( this . label ) ) ;
2016-01-20 19:38:38 +00:00
2015-12-05 19:41:14 +00:00
_ _out . push ( '</strong> ' ) ;
2016-01-20 19:38:38 +00:00
2015-12-05 19:41:14 +00:00
_ _out . push ( _ _sanitize ( this . time ) ) ;
2016-01-20 19:38:38 +00:00
2015-12-05 19:41:14 +00:00
_ _out . push ( '</div>' ) ;
2016-01-20 19:38:38 +00:00
2015-11-12 15:19:47 +00:00
} ) . call ( this ) ;
2016-01-20 19:38:38 +00:00
2015-11-12 15:19:47 +00:00
} ) . call ( _ _obj ) ;
_ _obj . safe = _ _objSafe , _ _obj . escape = _ _escape ;
return _ _out . join ( '' ) ;
} ;
if ( ! window . zammadChatTemplates ) {
window . zammadChatTemplates = { } ;
}
2015-12-05 19:41:14 +00:00
window . zammadChatTemplates [ "typingIndicator" ] = function ( _ _obj ) {
2015-11-12 15:19:47 +00:00
if ( ! _ _obj ) _ _obj = { } ;
var _ _out = [ ] , _ _capture = function ( callback ) {
var out = _ _out , result ;
_ _out = [ ] ;
callback . call ( this ) ;
result = _ _out . join ( '' ) ;
_ _out = out ;
return _ _safe ( result ) ;
} , _ _sanitize = function ( value ) {
if ( value && value . ecoSafe ) {
return value ;
} else if ( typeof value !== 'undefined' && value != null ) {
return _ _escape ( value ) ;
} else {
return '' ;
}
} , _ _safe , _ _objSafe = _ _obj . safe , _ _escape = _ _obj . escape ;
_ _safe = _ _obj . safe = function ( value ) {
if ( value && value . ecoSafe ) {
return value ;
} else {
if ( ! ( typeof value !== 'undefined' && value != null ) ) value = '' ;
var result = new String ( value ) ;
result . ecoSafe = true ;
return result ;
}
} ;
if ( ! _ _escape ) {
_ _escape = _ _obj . escape = function ( value ) {
return ( '' + value )
. replace ( /&/g , '&' )
. replace ( /</g , '<' )
. replace ( />/g , '>' )
. replace ( /"/g , '"' ) ;
} ;
}
( function ( ) {
( function ( ) {
2015-12-05 19:41:14 +00:00
_ _out . push ( '<div class="zammad-chat-message zammad-chat-message--typing zammad-chat-message--agent">\n <span class="zammad-chat-message-body">\n <span class="zammad-chat-loading-animation">\n <span class="zammad-chat-loading-circle"></span>\n <span class="zammad-chat-loading-circle"></span>\n <span class="zammad-chat-loading-circle"></span>\n </span>\n </span>\n</div>' ) ;
2016-01-20 19:38:38 +00:00
2015-10-15 09:14:19 +00:00
} ) . call ( this ) ;
2016-01-20 19:38:38 +00:00
2015-10-15 09:14:19 +00:00
} ) . call ( _ _obj ) ;
_ _obj . safe = _ _objSafe , _ _obj . escape = _ _escape ;
return _ _out . join ( '' ) ;
} ;
if ( ! window . zammadChatTemplates ) {
window . zammadChatTemplates = { } ;
}
2015-12-05 19:41:14 +00:00
window . zammadChatTemplates [ "waiting" ] = function ( _ _obj ) {
2015-10-15 09:14:19 +00:00
if ( ! _ _obj ) _ _obj = { } ;
var _ _out = [ ] , _ _capture = function ( callback ) {
var out = _ _out , result ;
_ _out = [ ] ;
callback . call ( this ) ;
result = _ _out . join ( '' ) ;
_ _out = out ;
return _ _safe ( result ) ;
} , _ _sanitize = function ( value ) {
if ( value && value . ecoSafe ) {
return value ;
} else if ( typeof value !== 'undefined' && value != null ) {
return _ _escape ( value ) ;
} else {
return '' ;
}
} , _ _safe , _ _objSafe = _ _obj . safe , _ _escape = _ _obj . escape ;
_ _safe = _ _obj . safe = function ( value ) {
if ( value && value . ecoSafe ) {
return value ;
} else {
if ( ! ( typeof value !== 'undefined' && value != null ) ) value = '' ;
var result = new String ( value ) ;
result . ecoSafe = true ;
return result ;
}
} ;
if ( ! _ _escape ) {
_ _escape = _ _obj . escape = function ( value ) {
return ( '' + value )
. replace ( /&/g , '&' )
. replace ( /</g , '<' )
. replace ( />/g , '>' )
. replace ( /"/g , '"' ) ;
} ;
}
( function ( ) {
( function ( ) {
2016-02-08 15:06:56 +00:00
_ _out . push ( '<div class="zammad-chat-modal-text">\n <span class="zammad-chat-loading-animation">\n <span class="zammad-chat-loading-circle"></span>\n <span class="zammad-chat-loading-circle"></span>\n <span class="zammad-chat-loading-circle"></span>\n </span>\n ' ) ;
2016-01-20 19:38:38 +00:00
2016-01-05 12:46:43 +00:00
_ _out . push ( this . T ( 'All colleagues are busy.' ) ) ;
2016-01-20 19:38:38 +00:00
2016-02-08 15:06:56 +00:00
_ _out . push ( '<br>\n ' ) ;
2016-01-20 19:38:38 +00:00
2015-12-05 19:41:14 +00:00
_ _out . push ( this . T ( 'You are on waiting list position <strong>%s</strong>.' , this . position ) ) ;
2016-01-20 19:38:38 +00:00
2016-02-08 15:06:56 +00:00
_ _out . push ( '\n</div>' ) ;
2016-01-20 19:38:38 +00:00
2015-10-15 09:14:19 +00:00
} ) . call ( this ) ;
2016-01-20 19:38:38 +00:00
2015-10-15 09:14:19 +00:00
} ) . call ( _ _obj ) ;
_ _obj . safe = _ _objSafe , _ _obj . escape = _ _escape ;
return _ _out . join ( '' ) ;
} ;
2015-11-02 15:48:16 +00:00
if ( ! window . zammadChatTemplates ) {
window . zammadChatTemplates = { } ;
}
2015-12-05 19:41:14 +00:00
window . zammadChatTemplates [ "waiting_list_timeout" ] = function ( _ _obj ) {
2015-11-02 15:48:16 +00:00
if ( ! _ _obj ) _ _obj = { } ;
var _ _out = [ ] , _ _capture = function ( callback ) {
var out = _ _out , result ;
_ _out = [ ] ;
callback . call ( this ) ;
result = _ _out . join ( '' ) ;
_ _out = out ;
return _ _safe ( result ) ;
} , _ _sanitize = function ( value ) {
if ( value && value . ecoSafe ) {
return value ;
} else if ( typeof value !== 'undefined' && value != null ) {
return _ _escape ( value ) ;
} else {
return '' ;
}
} , _ _safe , _ _objSafe = _ _obj . safe , _ _escape = _ _obj . escape ;
_ _safe = _ _obj . safe = function ( value ) {
if ( value && value . ecoSafe ) {
return value ;
} else {
if ( ! ( typeof value !== 'undefined' && value != null ) ) value = '' ;
var result = new String ( value ) ;
result . ecoSafe = true ;
return result ;
}
} ;
if ( ! _ _escape ) {
_ _escape = _ _obj . escape = function ( value ) {
return ( '' + value )
. replace ( /&/g , '&' )
. replace ( /</g , '<' )
. replace ( />/g , '>' )
. replace ( /"/g , '"' ) ;
} ;
}
( function ( ) {
( function ( ) {
2016-02-08 15:06:56 +00:00
_ _out . push ( '<div class="zammad-chat-modal-text">\n ' ) ;
2016-01-20 19:38:38 +00:00
2015-12-05 19:41:14 +00:00
_ _out . push ( this . T ( 'We are sorry, it takes longer as expected to get an empty slot. Please try again later or send us an email. Thank you!' ) ) ;
2016-01-20 19:38:38 +00:00
2016-02-08 15:06:56 +00:00
_ _out . push ( '\n <br>\n <div class="zammad-chat-button js-restart"' ) ;
2016-01-20 19:38:38 +00:00
2015-12-05 19:41:14 +00:00
if ( this . background ) {
_ _out . push ( _ _sanitize ( " style='background: " + this . background + "'" ) ) ;
}
2016-01-20 19:38:38 +00:00
2015-12-05 19:41:14 +00:00
_ _out . push ( '>' ) ;
2016-01-20 19:38:38 +00:00
2015-12-05 19:41:14 +00:00
_ _out . push ( this . T ( 'Start new conversation' ) ) ;
2016-01-20 19:38:38 +00:00
2016-02-08 15:06:56 +00:00
_ _out . push ( '</div>\n</div>' ) ;
2016-01-20 19:38:38 +00:00
2015-11-02 15:48:16 +00:00
} ) . call ( this ) ;
2016-01-20 19:38:38 +00:00
2015-11-02 15:48:16 +00:00
} ) . call ( _ _obj ) ;
_ _obj . safe = _ _objSafe , _ _obj . escape = _ _escape ;
return _ _out . join ( '' ) ;
} ;