main.js 3.0 KB

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