main.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. // This file is part of Mongoose project, http://code.google.com/p/mongoose
  2. var chat = {
  3. // Backend URL, string.
  4. // 'http://backend.address.com' or '' if backend is the same as frontend
  5. backendUrl: '',
  6. maxVisibleMessages: 10,
  7. errorMessageFadeOutTimeoutMs: 2000,
  8. errorMessageFadeOutTimer: null,
  9. lastMessageId: 0,
  10. getMessagesIntervalMs: 1000,
  11. };
  12. chat.normalizeText = function(text) {
  13. return text.replace('<', '&lt;').replace('>', '&gt;');
  14. };
  15. chat.refresh = function(data) {
  16. $.each(data, function(index, entry) {
  17. var row = $('<div>').addClass('message-row').appendTo('#mml');
  18. var timestamp = (new Date(entry.timestamp * 1000)).toLocaleTimeString();
  19. $('<span>')
  20. .addClass('message-timestamp')
  21. .html('[' + timestamp + ']')
  22. .prependTo(row);
  23. $('<span>')
  24. .addClass('message-user')
  25. .addClass(entry.user ? '' : 'message-user-server')
  26. .html(chat.normalizeText((entry.user || '[server]') + ':'))
  27. .appendTo(row);
  28. $('<span>')
  29. .addClass('message-text')
  30. .addClass(entry.user ? '' : 'message-text-server')
  31. .html(chat.normalizeText(entry.text))
  32. .appendTo(row);
  33. chat.lastMessageId = Math.max(chat.lastMessageId, entry.id) + 1;
  34. });
  35. // Keep only chat.maxVisibleMessages, delete older ones.
  36. while ($('#mml').children().length > chat.maxVisibleMessages) {
  37. $('#mml div:first-child').remove();
  38. }
  39. };
  40. chat.getMessages = function() {
  41. $.ajax({
  42. dataType: 'jsonp',
  43. url: chat.backendUrl + '/ajax/get_messages',
  44. data: {last_id: chat.lastMessageId},
  45. success: chat.refresh,
  46. error: function() {
  47. },
  48. });
  49. window.setTimeout(chat.getMessages, chat.getMessagesIntervalMs);
  50. };
  51. chat.handleMenuItemClick = function(ev) {
  52. $('.menu-item').removeClass('menu-item-selected'); // Deselect menu buttons
  53. $(this).addClass('menu-item-selected'); // Select clicked button
  54. $('.main').addClass('hidden'); // Hide all main windows
  55. $('#' + $(this).attr('name')).removeClass('hidden'); // Show main window
  56. };
  57. chat.showError = function(message) {
  58. $('#error').html(message).fadeIn('fast');
  59. window.clearTimeout(chat.errorMessageFadeOutTimer);
  60. chat.errorMessageFadeOutTimer = window.setTimeout(function() {
  61. $('#error').fadeOut('slow');
  62. }, chat.errorMessageFadeOutTimeoutMs);
  63. };
  64. chat.handleMessageInput = function(ev) {
  65. var input = ev.target;
  66. if (ev.keyCode != 13 || !input.value)
  67. return;
  68. //input.disabled = true;
  69. $.ajax({
  70. dataType: 'jsonp',
  71. url: chat.backendUrl + '/ajax/send_message',
  72. data: {text: input.value},
  73. success: function(ev) {
  74. input.value = '';
  75. input.disabled = false;
  76. chat.getMessages();
  77. },
  78. error: function(ev) {
  79. chat.showError('Error sending message');
  80. input.disabled = false;
  81. },
  82. });
  83. };
  84. $(document).ready(function() {
  85. $('.menu-item').click(chat.handleMenuItemClick);
  86. $('.message-input').keypress(chat.handleMessageInput);
  87. chat.getMessages();
  88. });
  89. // vim:ts=2:sw=2:et