| // This file is part of Civetweb project, |
| // http://sourceforge.net/projects/civetweb/ |
| |
| var chat = { |
| // Backend URL, string. |
| // 'http://backend.address.com' or '' if backend is the same as frontend |
| backendUrl: '', |
| maxVisibleMessages: 10, |
| errorMessageFadeOutTimeoutMs: 2000, |
| errorMessageFadeOutTimer: null, |
| lastMessageId: 0, |
| getMessagesIntervalMs: 1000, |
| }; |
| |
| chat.normalizeText = function(text) { |
| return text.replace('<', '<').replace('>', '>'); |
| }; |
| |
| chat.refresh = function(data) { |
| |
| if (data === undefined) { |
| return; |
| } |
| |
| $.each(data, function(index, entry) { |
| var row = $('<div>').addClass('message-row').appendTo('#mml'); |
| var timestamp = (new Date(entry.timestamp * 1000)).toLocaleTimeString(); |
| $('<span>') |
| .addClass('message-timestamp') |
| .html('[' + timestamp + ']') |
| .prependTo(row); |
| $('<span>') |
| .addClass('message-user') |
| .addClass(entry.user ? '' : 'message-user-server') |
| .html(chat.normalizeText((entry.user || '[server]') + ':')) |
| .appendTo(row); |
| $('<span>') |
| .addClass('message-text') |
| .addClass(entry.user ? '' : 'message-text-server') |
| .html(chat.normalizeText(entry.text)) |
| .appendTo(row); |
| chat.lastMessageId = Math.max(chat.lastMessageId, entry.id) + 1; |
| }); |
| |
| // Keep only chat.maxVisibleMessages, delete older ones. |
| while ($('#mml').children().length > chat.maxVisibleMessages) { |
| $('#mml div:first-child').remove(); |
| } |
| }; |
| |
| chat.getMessages = function(enter_loop) { |
| $.ajax({ |
| dataType: 'jsonp', |
| url: chat.backendUrl + '/ajax/get_messages', |
| data: {last_id: chat.lastMessageId}, |
| success: chat.refresh, |
| error: function() { |
| }, |
| }); |
| if (enter_loop) { |
| window.setTimeout('chat.getMessages(true)', chat.getMessagesIntervalMs); |
| } |
| }; |
| |
| chat.handleMenuItemClick = function(ev) { |
| $('.menu-item').removeClass('menu-item-selected'); // Deselect menu buttons |
| $(this).addClass('menu-item-selected'); // Select clicked button |
| $('.main').addClass('hidden'); // Hide all main windows |
| $('#' + $(this).attr('name')).removeClass('hidden'); // Show main window |
| }; |
| |
| chat.showError = function(message) { |
| $('#error').html(message).fadeIn('fast'); |
| window.clearTimeout(chat.errorMessageFadeOutTimer); |
| chat.errorMessageFadeOutTimer = window.setTimeout(function() { |
| $('#error').fadeOut('slow'); |
| }, chat.errorMessageFadeOutTimeoutMs); |
| }; |
| |
| chat.handleMessageInput = function(ev) { |
| var input = ev.target; |
| if (ev.keyCode != 13 || !input.value) |
| return; |
| //input.disabled = true; |
| $.ajax({ |
| dataType: 'jsonp', |
| url: chat.backendUrl + '/ajax/send_message', |
| data: {text: input.value}, |
| success: function(ev) { |
| input.value = ''; |
| input.disabled = false; |
| chat.getMessages(false); |
| }, |
| error: function(ev) { |
| chat.showError('Error sending message'); |
| input.disabled = false; |
| }, |
| }); |
| }; |
| |
| $(document).ready(function() { |
| $('.menu-item').click(chat.handleMenuItemClick); |
| $('.message-input').keypress(chat.handleMessageInput); |
| chat.getMessages(true); |
| }); |
| |
| // vim:ts=2:sw=2:et |