var Support = (function() { /********************************/ /* private variables and methods*/ /********************************/ var nodeClient = new NodeClient(), setTypingTimeout = null, remoteSessionTimeout = null, page_translations = {}, chat_id = 0, user_id = 0, language = 'en'; function NodeConnectionHandler ( response ) { console.log('Node server is connected'); $("#translation-login").show(); $("#login_error").html(""); //console.log('chat_id:'+chat_id+' user_id:'+user_id+' language:'+language); Support.SendCommand(NodeCommands.AvailableLanguages()); } function EndSession () { // Send End Typing Indicator if ( nodeClient.isConnected() ) { Support.SendCommand(NodeCommands.IsTyping(0)); } if ( nodeClient.isConnected() ) { Support.SendCommand(NodeCommands.EndChat()); Support.Disconnect(); } window.close(); } function RemoteCloseHandler ( time_remaining ) { if ( remoteSessionTimeout !== null ) { clearTimeout(remoteSessionTimeout); remoteSessionTimeout = null; } if ( time_remaining === 0 ) { EndSession(); } else { // set the new time remaining $('#time_remaining').html(time_remaining); remoteSessionTimeout = setTimeout(function() { // call this function again RemoteCloseHandler(--time_remaining); }, 1000); } } function NodeEventHandler ( event ) { console.log('Node event'); if ( 'method' in event ) { console.log(event); switch (event.method) { case 'languages': var languages = event.data; var element = $('#available_languages'); var selected_language = 'en'; if ( localStorage.getItem('LocalStorageSelectedLanguage') ) { selected_language = localStorage.getItem('LocalStorageSelectedLanguage'); } for ( var idx in languages ) { var code = languages[idx]['code'] var name = languages[idx]['name'] var option = $('').val(code).html(name); if ( code === selected_language ) { option.prop('selected', true); } element.append(option); } if ( selected_language !== 'en' ) { Support.SendCommand(NodeCommands.PageTranslation(selected_language)); } language = selected_language; break; case 'page_translation': var translations = event.data; page_translations = translations; for ( var name in translations ) { var translation = translations[name]; var element = $('#translation-'+name); console.log(name + " == " + translation ); if ( name === 'username' || name === 'password' || name === 'name' ) { if ( $('#login_'+name).length != 0 ) { $('#login_'+name).attr('placeholder', translation); } } else if ( element.length != 0 ) { element.html(translation); } // now search for class defined translations element = $('.translation-' + name); if ( element.length != 0 ) { element.html(translation); } } break; case 'message': console.log('New Message'); var data = event.data; var type = 'right'; if ( data.user_id === 0 ) { // remote customer type = 'left'; } var username = data.username + ' from ' + data.site_name; console.log(language); if ( language !== 'en' ) { username = data.username + ' ' + page_translations['from'] + ' ' + data.site_name; } var local_language = data.translated; var remote_language = data.message; if ( data.user_id === user_id ) { local_language = data.message; remote_language = data.translated; } var p = $('

', {'class':'chat-bubble '+ type}) .append($('', {'class':'user-info'}).html(username)) .append($('', {'class':'translated'}).html(local_language)) .append($('', {'class':'original'}).html(remote_language)) .append($('', {'class':'time'}).html(data.date)) // scroll to bottom of div to see new message automatically $("#chat_container") .append(p) .animate({scrollTop: $("#chat_container")[0].scrollHeight}, 1000); break; case 'message_received': if ( event.code === 1 ) { $('#chat_input').val(''); } else { // message not received properly // TODO display error message } break; case 'typing': var data = event.data; if ( data.user_id !== user_id ) { if ( data.typing === 1 ) { $('#chat_container').addClass('typing'); } else { $('#chat_container').removeClass('typing'); } } break; case 'close_remote_session': var data = event.data; if ( data.user_id !== user_id ) { $("#remote_session_countdown_dialog").dialog("open"); } break; case 'connect': var data = event.data; if ( data.user_id != user_id && user_id === 0 ) { $("#aethon_connection_loader").hide(); } break; case 'disconnect': var data = event.data; if ( data.user_id != user_id && user_id === 0 ) { $("#aethon_connection_loader").show(); } break; } } } /********************************/ /* public variables and methods */ /********************************/ return { Disconnect : function ( ) { nodeClient.disconnect(); }, SendMessage : function ( message, name ) { socket.emit( 'message', { message: message }); }, SendCommand : function ( command ) { nodeClient.send( command ); }, InitializeNode : function( chatid, userid, lang, connection_handler, event_handler ) { var self = this; chat_id = chatid; user_id = userid; language = lang; if ( typeof connection_handler === 'undefined' ) { connection_handler = NodeConnectionHandler; } if ( typeof event_handler === 'undefined' ) { event_handler = NodeEventHandler; } if ( nodeClient.isConnected() ) { self.handleNodeConnect(); } else { nodeClient.initialize({ host: 'support.aethon.com', connected: connection_handler, callback: event_handler }); } // scroll to bottom of div to see new message automatically $("#chat_container") .animate({scrollTop: $("#chat_container").height()}, 1000); $(document).on('click', '#chat_send_container', function() { console.log('clicked send message'); var message = $('#chat_input').val(); if ( $.trim(message).length > 0 ) { Support.SendCommand(NodeCommands.SendMessage(message)); } }); if ( $( "#close_remote_session_dialog" ).length ) { $('#close_remote_session_dialog').dialog({ autoOpen: false, modal: true }); $(document).on('click', '#close_remote_session', function(e) { console.log('clicked close remote session'); e.preventDefault(); $("#close_remote_session_dialog").dialog({ buttons : { "Confirm" : function() { Support.SendCommand(NodeCommands.CloseRemoteSession()); $(this).dialog("close"); }, "Cancel" : function() { $(this).dialog("close"); } } }); $("#close_remote_session_dialog").dialog("open"); }); } if ( $( "#remote_session_countdown_dialog" ).length ) { console.log("remote_session_countdown_dialog exists"); $("#remote_session_countdown_dialog").dialog({ autoOpen: false, modal: true, minWidth: 500, height: 200, open: function( event, ui ) { RemoteCloseHandler( 30 ); }, close: function () { if ( remoteSessionTimeout !== null ) { clearTimeout(remoteSessionTimeout); remoteSessionTimeout = null; } }, buttons: [ { text: "Continue", class: 'translation-Continue', click: function() { $(this).dialog("close"); } }, { text: "End Chat", class: 'translation-EndChat', click: function () { EndSession(); $(this).dialog("close"); } } ] }); } $(document).on('click', '#chat_connection_status', function() { console.log('clicked end chat'); EndSession(); }); $(document).on('keyup', '#chat_input', function(event) { if ( setTypingTimeout !== null ) { clearTimeout(setTypingTimeout); setTypingTimeout = null; } else { Support.SendCommand(NodeCommands.IsTyping(1)); } // dampen focus events setTypingTimeout = setTimeout(function() { // send focus Support.SendCommand(NodeCommands.IsTyping(0)); setTypingTimeout = null; }, 450); }); } }; })();