Advertisement
Guest User

Untitled

a guest
Dec 9th, 2016
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.59 KB | None | 0 0
  1. 'use strict';
  2.  
  3. const chatSettings = {
  4. TIME_REQUEST : 2000, // tiempo en milisegundos entre consultas al servidor
  5. MAX_MESSAGES : 30, // número de mensajes que se muestran en el cliente
  6. EDITOR_WIDTH : 50, // anchura del editor de mensajes
  7. EDITOR_HEIGHT : 6, // altura del editor de mensajes
  8. }
  9.  
  10. const chat = (function (config) {
  11. // Si el texto especificado incluye URLs http (o https)
  12. // lo transforma en un hipervínculo.
  13. function URLtoHTMLLink(text) {
  14. // URLs que comienzan por http:// o https://
  15. const pattern1 = /(\b(https?):\/\/[0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*(:(0-9)*)*(\/?)([a-zA-Z0-9\-\.\?\,\'\/\\\+&%\$#_=]*)?)/gim;
  16. let replacedText = text.replace(pattern1,
  17. '<a href="$1" target="_blank">$1</a>');
  18.  
  19. // URLs que comienzan con www. (sin // antes)
  20. const pattern2 = /(^|[^\/])(www\.[\S]+(\b|$))/gim;
  21. replacedText = replacedText.replace(pattern2,
  22. '$1<a href="http://$2" target="_blank">$2</a>');
  23.  
  24. return replacedText;
  25. }
  26.  
  27. const chat = {
  28. // Identificador del último mensaje recibido
  29. lastId : 0,
  30. // Petición asíncrona de los últimos mensajes
  31. requestMessages : function() {
  32. const xhrObject = new window.XMLHttpRequest();
  33. xhrObject.open('GET','message.php?id=',true);
  34. xhrObject.onreadystatechange = function(){
  35. if(this.readyState == 4 && this.status == 200)
  36. chat.showMessages(this.responseXML);
  37.  
  38. };
  39. xhrObject.send(null);
  40.  
  41. },
  42. // Envío asíncrono de un mensaje del usuario
  43. sendMessage : function() {
  44. const xhrObject = new window.XMLHttpRequest();
  45. xhrObject.open('POST','insert.php',true);
  46. xhrObject.onreadystatechange = function(){
  47. if (this.readyState == 4){
  48. chat.view.cleanEditor();
  49. }
  50. };
  51. xhrObject.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
  52. xhrObject.send("message="+chat.view.getMessage());
  53. },
  54. // Muestra los mensajes del documento XML y establece la siguiente petición
  55. // de mensajes al servidor a los config.TIME_REQUEST milisegundos
  56. showMessages : function(messagesXML) {
  57. chat.view.show(messagesXML);
  58. window.setTimeout('chat.requestMessages()',config.TIME_REQUEST);
  59. },
  60. // Inicializa el chat: crea la interfaz, añade ésta al contenedor
  61. // identificado por idContainer y realiza la primera petición de
  62. // mensajes al servidor
  63. init : function(nickname) {
  64. chat.nicknames = new Array(nickname);
  65. chat.view.create(); // crea la interfaz del chat
  66. chat.requestMessages(); // petición inicial de los últimos mensajes
  67. // añade la interfaz al documento
  68. document.querySelector('section').appendChild(chat.view.root());
  69. // limpia el editor
  70. chat.view.cleanEditor();
  71. // añadir mensajes en blanco para ocupar el espacio disponible
  72. // lo que permitirá mostrár los mensajes en la parte inferior
  73. // del contenedor
  74. const containerMessages = document.querySelector('div.messages')
  75. while (containerMessages.scrollTop == 0) {
  76. chat.view.append(' ', ' ');
  77. chat.view.history--;
  78. }
  79. },
  80. view : {
  81. // Número de mensajes que contiene la vista
  82. history : 0,
  83. // Crea la interfaz del chat: un bloque genérico (div) que contendrá
  84. // un div con la vista de mensajes y un formulario para el envío de
  85. // mensajes del usuario. El formulario, constará de un fieldset con
  86. // leyenda y un área de texto.
  87. create : function() {
  88. const xmlns = 'http://www.w3.org/1999/xhtml'; // espacio de nombres XHTML
  89. this.container = document.createElementNS(xmlns, 'div'); // contenedor para la interfaz
  90. this.container.setAttribute('class', 'chat');
  91. const containerMessages = document.createElementNS(xmlns, 'div'); // vista de mensajes
  92. const containerUsers = document.createElementNS(xmlns, 'div');
  93. containerUsers.setAttribute('class', 'users');
  94. const objH2 = document.createElementNS(xmlns, 'h2');
  95. const objDiv = document.createElementNS(xmlns, 'div');
  96. containerMessages.setAttribute('class', 'messages');
  97. const editor = document.createElementNS(xmlns, 'textarea'); // área de texto del formulario
  98. const formObj = document.createElementNS(xmlns, 'form'); // formulario para el envío de mensajes
  99. const fieldsetObj = document.createElementNS(xmlns, 'fieldset');
  100. const legendObj = document.createElementNS(xmlns, 'legend');
  101. formObj.setAttribute('method', 'post');
  102. formObj.setAttribute('action', 'javascript:chat.sendMessage()');
  103. legendObj.appendChild(document.createTextNode('Editar mensaje'));
  104. fieldsetObj.appendChild(legendObj);
  105. editor.setAttribute('rows', config.EDITOR_HEIGHT);
  106. editor.setAttribute('cols', config.EDITOR_WIDTH);
  107. editor.setAttribute('onkeypress', 'chat.submitMessage(event)');
  108. fieldsetObj.appendChild(editor);
  109. formObj.appendChild(fieldsetObj);
  110. objDiv.appendChild(containerMessages);
  111. objDiv.appendChild(formObj);
  112. objH2.appendChild(document.createTextNode('Usuarios'));
  113. containerUsers.appendChild(objH2);
  114. containerUsers.appendChild(document.createElementNS(xmlns, 'ul'));
  115. this.container.appendChild(objDiv);
  116. this.container.appendChild(containerUsers);
  117. },
  118. // Retorna el contenedor de la interfaz (nodo raíz)
  119. root : function() {
  120. return this.container;
  121. },
  122. // Retorna el contenido del área de texto (mensaje a enviar)
  123. getMessage : function() {
  124. return encodeURIComponent(document.querySelector('div.chat textarea').value);
  125. },
  126. // Limpia el contenido del área de texto y pone el foco en éste
  127. cleanEditor : function() {
  128. const editor = document.querySelector('section textarea');
  129. editor.value = '';
  130. editor.focus();
  131. },
  132. // Procesa un documento (objeto) XML con los mensajes y muestra
  133. // éstos en la interfaz (en la vista de mensajes), indicando la
  134. // hora en que se recibió y el usuario que lo envío.
  135. show : function(messagesXML) {
  136. var messages = messagesXML.getElementsByTagName('message');
  137. for(let message of messages){
  138. var time =message.getAttribute('time');
  139. var user = message.getAttribute('user');
  140. var text = message.textContent;
  141. this.append('['+time+']'+user+'=>', text);
  142. }
  143. },
  144. // Añade un mensaje a la vista de mensajes de la interfaz.
  145. append : function(prompt, text) {
  146. const xmlns = 'http://www.w3.org/1999/xhtml'; // espacio de nombres XHTML
  147. const containerMessages = document.querySelector('div.messages');
  148. const msgObj = document.createElementNS(xmlns, 'div');
  149. const userTimeObj = document.createElementNS(xmlns, 'p');
  150. const messageReceivedObj = document.createElementNS(xmlns, 'pre');
  151. userTimeObj.setAttribute('class', 'user');
  152. messageReceivedObj.setAttribute('class', 'msg');
  153. userTimeObj.appendChild(document.createTextNode(prompt));
  154. messageReceivedObj.innerHTML = URLtoHTMLLink(text);
  155. msgObj.appendChild(userTimeObj);
  156. msgObj.appendChild(messageReceivedObj);
  157. containerMessages.appendChild(msgObj);
  158. // mover la barra de scroll
  159. containerMessages.scrollTop = containerMessages.scrollHeight
  160. - containerMessages.clientHeight;
  161. },
  162. // Recibe un evento de teclado. Si la tecla es <RETURN>
  163. // envía los datos del formlario
  164. submitEnter : function(event) {
  165. let isEnter = false; // cierto si la tecla pulsada es <RETURN>
  166.  
  167. if (event.key)
  168. isEnter = event.key == 'Enter';
  169.  
  170. // <Carriage Return> sin <Shift>
  171. if (isEnter && !event.shiftKey) // sólo <RETURN>
  172. document.querySelector('section form').submit();
  173. }
  174. }
  175. };
  176.  
  177. return {
  178. 'start' : chat.init,
  179. 'sendMessage' : chat.sendMessage,
  180. 'showMessages' : chat.showMessages,
  181. 'requestMessages': chat.requestMessages,
  182. 'submitMessage' : chat.view.submitEnter
  183. };
  184.  
  185. })(chatSettings);
  186.  
  187. Object.defineProperties(chat, {
  188. start: {
  189. configurable: false,
  190. enumerable: false,
  191. writable: false
  192. },
  193. sendMessage: {
  194. configurable: false,
  195. enumerable: false,
  196. writable: false
  197. },
  198. showMessages: {
  199. configurable: false,
  200. enumerable: false,
  201. writable: false
  202. },
  203. requestMessages: {
  204. configurable: false,
  205. enumerable: false,
  206. writable: false
  207. },
  208. submitMessage: {
  209. configurable: false,
  210. enumerable: false,
  211. writable: false
  212. },
  213. });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement