main.js 3.0 KB

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