@@ -5,18 +5,81 @@
5 5 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
(function(){
6 6 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const form = document.querySelector('#chat-form');
7 7 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const F = window.fossil, D = F.dom;
8 8 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const Chat = (function(){
9 9 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const cs = {
10 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ e:{/*map of certain DOM elements.*/
11 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ messageInjectPoint: document.querySelector('#message-inject-point'),
12 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pageTitle: document.querySelector('head title'),
13 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ loadToolbar: undefined /* the load-posts toolbar (dynamically created) */
14 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ },
10 15 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
me: F.user.name,
11 16 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
mxMsg: F.config.chatInitSize ? -F.config.chatInitSize : -50,
17 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mnMsg: undefined/*lowest message ID we've seen so far (for history loading)*/,
12 18 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pageIsActive: 'visible'===document.visibilityState,
13 19 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
changesSincePageHidden: 0,
14 20 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
notificationBubbleColor: 'white',
15 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pageTitle: document.querySelector('head title')
21 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ totalMessageCount: 0, // total # of inbound messages
22 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ //! Number of messages to load for the history buttons
23 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ loadMessageCount: Math.abs(F.config.chatInitSize || 20),
24 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ajaxInflight: 0,
25 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /** Enables (if yes is truthy) or disables all elements in
26 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * this.disableDuringAjax. */
27 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ enableAjaxComponents: function(yes){
28 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ D[yes ? 'enable' : 'disable'](this.disableDuringAjax);
29 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return this;
30 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ },
31 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Must be called before any API is used which starts ajax traffic.
32 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ If this call represents the currently only in-flight ajax request,
33 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ all DOM elements in this.disableDuringAjax are disabled.
34 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ We cannot do this via a central API because (1) window.fetch()'s
35 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Promise-based API seemingly makes that impossible and (2) the polling
36 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ technique holds ajax requests open for as long as possible. A call
37 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ to this method obligates the caller to also call ajaxEnd().
38 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
39 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ This must NOT be called for the chat-polling API except, as a
40 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ special exception, the very first one which fetches the
41 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ initial message list.
42 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
43 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ajaxStart: function(){
44 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(1===++this.ajaxInflight){
45 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ this.enableAjaxComponents(false);
46 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
47 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ },
48 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Must be called after any ajax-related call for which
49 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ajaxStart() was called, regardless of success or failure. If
50 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ it was the last such call (as measured by calls to
51 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ajaxStart() and ajaxEnd()), elements disabled by a prior call
52 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ to ajaxStart() will be re-enabled. */
53 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ajaxEnd: function(){
54 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(0===--this.ajaxInflight){
55 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ this.enableAjaxComponents(true);
56 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
57 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ },
58 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ disableDuringAjax: [
59 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* List of DOM elements disable while ajax traffic is in
60 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ transit. Must be populated before ajax starts. We do this
61 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ to avoid various race conditions in the UI and long-running
62 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ network requests. */
63 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ],
64 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Injects element e as a new row in the chat, at the top of the
65 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ list if atEnd is falsy, else at the end of the list, before
66 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ the load-history widget. */
67 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ injectMessageElem: function f(e, atEnd){
68 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const mip = atEnd ? this.e.loadToolbar : this.e.messageInjectPoint;
69 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(atEnd){
70 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mip.parentNode.insertBefore(e, mip);
71 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
72 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(mip.nextSibling){
73 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mip.parentNode.insertBefore(e, mip.nextSibling);
74 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
75 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mip.parentNode.appendChild(e);
76 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
77 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
78 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
16 79 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
17 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- cs.pageTitleOrig = cs.pageTitle.innerText;
80 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cs.pageTitleOrig = cs.e.pageTitle.innerText;
18 81 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const qs = (e)=>document.querySelector(e);
19 82 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const argsToArray = function(args){
20 83 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return Array.prototype.slice.call(args,0);
21 84 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
22 85 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
cs.reportError = function(/*msg args*/){
@@ -75,21 +138,23 @@
75 138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
76 139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
e = this.getMessageElemById(id);
77 140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
78 141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(!(e instanceof HTMLElement)) return;
79 142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(this.userMayDelete(e)){
143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ this.ajaxStart();
80 144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fetch("chat-delete?name=" + id)
81 145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
.then(()=>this.deleteMessageElem(e))
82 146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
.catch(err=>this.reportError(err))
147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ .finally(()=>this.ajaxEnd());
83 148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
84 149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
this.deleteMessageElem(id);
85 150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
86 151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
87 152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
document.addEventListener('visibilitychange', function(ev){
88 153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
cs.pageIsActive = !document.hidden;
89 154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(cs.pageIsActive){
90 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- cs.pageTitle.innerText = cs.pageTitleOrig;
155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cs.e.pageTitle.innerText = cs.pageTitleOrig;
91 156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
92 157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}, true);
93 158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return cs;
94 159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
})()/*Chat initialization*/;
95 160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* State for paste and drag/drop */
@@ -195,21 +260,10 @@
195 260 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
196 261 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Object.keys(dropEvents).forEach(
197 262 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
(k)=>form.file.addEventListener(k, dropEvents[k], true)
198 263 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
);
199 264 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* Injects element e as a new row in the chat, at the top of the list */
201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const injectMessage = function f(e){
202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if(!f.injectPoint){
203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- f.injectPoint = document.querySelector('#message-inject-point');
204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if(f.injectPoint.nextSibling){
206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- f.injectPoint.parentNode.insertBefore(e, f.injectPoint.nextSibling);
207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- f.injectPoint.parentNode.appendChild(e);
209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- };
211 265 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Returns a new TEXT node with the given text content. */
212 266 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/** Returns the local time string of Date object d, defaulting
213 267 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
to the current time. */
214 268 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const localTimeString = function ff(d){
215 269 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(!ff.pad){
@@ -266,11 +320,11 @@
266 320 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
f.popup.hide = function(){
267 321 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
delete this._eMsg;
268 322 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
D.clearElement(this.e);
269 323 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return this.show(false);
270 324 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
271 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
325 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }/*end static init*/
272 326 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const rect = ev.target.getBoundingClientRect();
273 327 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const eMsg = ev.target.parentNode/*the owning fieldset element*/;
274 328 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
f.popup._eMsg = eMsg;
275 329 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
let x = rect.left, y = rect.top - 10;
276 330 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
f.popup.show(ev.target)/*so we can get its computed size*/;
@@ -279,103 +333,172 @@
279 333 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
// truncation off the right edge of the page.
280 334 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const pRect = f.popup.e.getBoundingClientRect();
281 335 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
x -= pRect.width/3*2;
282 336 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
283 337 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
f.popup.show(x, y);
284 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- };
338 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }/*handleLegendClicked()*/;
285 339 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
286 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /** Callback for poll() to inject new content into the page. */
287 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- function newcontent(jx){
288 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- var i;
340 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /** Callback for poll() to inject new content into the page. jx ==
341 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ the response from /chat-poll. If atEnd is true, the message is
342 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ appended to the end of the chat list, else the beginning (the
343 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ default). */
344 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const newcontent = function f(jx,atEnd){
345 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(!f.processPost){
346 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /** Processes chat message m, placing it either the start (if atEnd
347 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ is falsy) or end (if atEnd is truthy) of the chat history. atEnd
348 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ should only be true when loading older messages. */
349 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ f.processPost = function(m,atEnd){
350 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ++Chat.totalMessageCount;
351 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( m.msgid>Chat.mxMsg ) Chat.mxMsg = m.msgid;
352 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !Chat.mnMsg || m.msgid<Chat.mnMsg) Chat.mnMsg = m.msgid;
353 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( m.mdel ){
354 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* A record deletion notice. */
355 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Chat.deleteMessageElem(m.mdel);
356 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return;
357 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
358 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const eWho = D.create('legend'),
359 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ row = D.addClass(D.fieldset(eWho), 'message-row');
360 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ row.dataset.msgid = m.msgid;
361 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ row.dataset.xfrom = m.xfrom;
362 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ row.dataset.timestamp = m.mtime;
363 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Chat.injectMessageElem(row,atEnd);
364 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ eWho.addEventListener('click', handleLegendClicked, false);
365 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( m.xfrom==Chat.me && window.outerWidth<1000 ){
366 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ eWho.setAttribute('align', 'right');
367 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ row.style.justifyContent = "flex-end";
368 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
369 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ eWho.setAttribute('align', 'left');
370 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
371 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ eWho.style.backgroundColor = m.uclr;
372 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ eWho.classList.add('message-user');
373 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ let whoName = m.xfrom;
374 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ var d = new Date(m.mtime + "Z");
375 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( d.getMinutes().toString()!="NaN" ){
376 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Show local time when we can compute it */
377 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ eWho.append(D.text(whoName+' @ '+
378 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ d.getHours()+":"+(d.getMinutes()+100).toString().slice(1,3)
379 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ))
380 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
381 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Show UTC on systems where Date() does not work */
382 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ eWho.append(D.text(whoName+' @ '+m.mtime.slice(11,16)))
383 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
384 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ let eContent = D.addClass(D.div(),'message-content','chat-message');
385 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ eContent.style.backgroundColor = m.uclr;
386 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ row.appendChild(eContent);
387 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( m.fsize>0 ){
388 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( m.fmime && m.fmime.startsWith("image/") ){
389 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ eContent.appendChild(D.img("chat-download/" + m.msgid));
390 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
391 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ eContent.appendChild(D.a(
392 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ window.fossil.rootPath+
393 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 'chat-download/' + m.msgid+'/'+encodeURIComponent(m.fname),
394 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ // ^^^ add m.fname to URL to cause downloaded file to have that name.
395 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "(" + m.fname + " " + m.fsize + " bytes)"
396 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ));
397 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
398 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const br = D.br();
399 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ br.style.clear = "both";
400 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ eContent.appendChild(br);
401 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
402 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(m.xmsg){
403 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ // The m.xmsg text comes from the same server as this script and
404 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ // is guaranteed by that server to be "safe" HTML - safe in the
405 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ // sense that it is not possible for a malefactor to inject HTML
406 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ // or javascript or CSS. The m.xmsg content might contain
407 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ // hyperlinks, but otherwise it will be markup-free. See the
408 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ // chat_format_to_html() routine in the server for details.
409 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ //
410 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ // Hence, even though innerHTML is normally frowned upon, it is
411 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ // perfectly safe to use in this context.
412 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ eContent.innerHTML += m.xmsg
413 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
414 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }/*processPost()*/;
415 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }/*end static init*/
416 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ jx.msgs.forEach((m)=>f.processPost(m,atEnd));
289 417 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if('visible'===document.visibilityState){
290 418 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(Chat.changesSincePageHidden){
291 419 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Chat.changesSincePageHidden = 0;
292 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Chat.pageTitle.innerText = Chat.pageTitleOrig;
420 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Chat.e.pageTitle.innerText = Chat.pageTitleOrig;
293 421 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
294 422 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
295 423 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Chat.changesSincePageHidden += jx.msgs.length;
296 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Chat.pageTitle.innerText = '('+Chat.changesSincePageHidden+') '+
424 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Chat.e.pageTitle.innerText = '('+Chat.changesSincePageHidden+') '+
297 425 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Chat.pageTitleOrig;
298 426 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
299 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for(i=0; i<jx.msgs.length; ++i){
300 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const m = jx.msgs[i];
301 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( m.msgid>Chat.mxMsg ) Chat.mxMsg = m.msgid;
302 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( m.mdel ){
303 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* A record deletion notice. */
304 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Chat.deleteMessageElem(m.mdel);
305 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- continue;
306 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
307 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const eWho = D.create('legend'),
308 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- row = D.addClass(D.fieldset(eWho), 'message-row');
309 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- row.dataset.msgid = m.msgid;
310 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- row.dataset.xfrom = m.xfrom;
311 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- row.dataset.timestamp = m.mtime;
312 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- injectMessage(row);
313 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- eWho.addEventListener('click', handleLegendClicked, false);
314 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( m.xfrom==Chat.me && window.outerWidth<1000 ){
315 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- eWho.setAttribute('align', 'right');
316 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- row.style.justifyContent = "flex-end";
317 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
318 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- eWho.setAttribute('align', 'left');
319 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
320 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- eWho.style.backgroundColor = m.uclr;
321 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- eWho.classList.add('message-user');
322 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- let whoName = m.xfrom;
323 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- var d = new Date(m.mtime + "Z");
324 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( d.getMinutes().toString()!="NaN" ){
325 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* Show local time when we can compute it */
326 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- eWho.append(D.text(whoName+' @ '+
327 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- d.getHours()+":"+(d.getMinutes()+100).toString().slice(1,3)
328 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ))
329 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
330 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* Show UTC on systems where Date() does not work */
331 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- eWho.append(D.text(whoName+' @ '+m.mtime.slice(11,16)))
332 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
333 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- let eContent = D.addClass(D.div(),'message-content','chat-message');
334 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- eContent.style.backgroundColor = m.uclr;
335 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- row.appendChild(eContent);
336 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( m.fsize>0 ){
337 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( m.fmime && m.fmime.startsWith("image/") ){
338 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- eContent.appendChild(D.img("chat-download/" + m.msgid));
339 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
340 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- eContent.appendChild(D.a(
341 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- window.fossil.rootPath+
342 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- 'chat-download/' + m.msgid+'/'+encodeURIComponent(m.fname),
343 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- // ^^^ add m.fname to URL to cause downloaded file to have that name.
344 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "(" + m.fname + " " + m.fsize + " bytes)"
345 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ));
346 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
347 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const br = D.br();
348 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- br.style.clear = "both";
349 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- eContent.appendChild(br);
350 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
351 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if(m.xmsg){
352 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- // The m.xmsg text comes from the same server as this script and
353 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- // is guaranteed by that server to be "safe" HTML - safe in the
354 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- // sense that it is not possible for a malefactor to inject HTML
355 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- // or javascript or CSS. The m.xmsg content might contain
356 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- // hyperlinks, but otherwise it will be markup-free. See the
357 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- // chat_format_to_html() routine in the server for details.
358 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- //
359 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- // Hence, even though innerHTML is normally frowned upon, it is
360 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- // perfectly safe to use in this context.
361 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- eContent.innerHTML += m.xmsg
362 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
363 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- eContent.classList.add('chat-message');
364 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
365 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if(i && window.fossil.config.pingTcp){
427 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(jx.msgs.length && F.config.pingTcp){
366 428 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fetch("http:/"+"/localhost:"+window.fossil.config.pingTcp+"/chat-ping");
367 429 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
368 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
369 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- async function poll(){
430 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }/*newcontent()*/;
431 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
432 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(true){
433 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /** Add toolbar for loading older messages. We use a FIELDSET here
434 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ because a fieldset is the only parent element type which can
435 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ automatically enable/disable its children by
436 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ enabling/disabling the parent element. */
437 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const loadLegend = D.legend("Load...");
438 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const toolbar = Chat.e.loadToolbar = D.addClass(
439 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ D.fieldset(loadLegend), "load-msg-toolbar"
440 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
441 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Chat.disableDuringAjax.push(toolbar);
442 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Loads the next n oldest messages, or all previous history if n is negative. */
443 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const loadOldMessages = function(n){
444 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Chat.ajaxStart();
445 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ var gotMessages = false;
446 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fetch("chat-poll?before="+Chat.mnMsg+"&n="+n)
447 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ .then(x=>x.json())
448 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ .then(function(x){
449 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ gotMessages = x.msgs.length;
450 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ newcontent(x,true);
451 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ })
452 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ .catch(e=>Chat.reportError(e))
453 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ .finally(function(){
454 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(n<0/*we asked for all history*/
455 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ || 0===gotMessages/*we found no history*/
456 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ || (n>0 && gotMessages<n /*we got fewer history entries than requested*/)
457 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ || (false!==gotMessages && n<0 && gotMessages<Chat.loadMessageCount
458 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*we asked for default amount and got fewer than that.*/)){
459 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* We've loaded all history. Permanently disable the
460 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ history-load toolbar and keep it from being re-enabled
461 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ via the ajaxStart()/ajaxEnd() mechanism... */
462 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const div = Chat.e.loadToolbar.querySelector('div');
463 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ D.append(D.clearElement(div), "All history has been loaded.");
464 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ D.addClass(Chat.e.loadToolbar, 'all-done');
465 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const ndx = Chat.disableDuringAjax.indexOf(Chat.e.loadToolbar);
466 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(ndx>=0) Chat.disableDuringAjax.splice(ndx,1);
467 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Chat.e.loadToolbar.disabled = true;
468 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
469 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(gotMessages > 0){
470 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ F.toast.message("Loaded "+gotMessages+" older messages.");
471 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
472 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Chat.ajaxEnd();
473 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ });
474 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ };
475 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const wrapper = D.div(); /* browsers don't all properly handle >1 child in a fieldset */;
476 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ D.append(toolbar, wrapper);
477 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ var btn = D.button("Previous "+Chat.loadMessageCount+" messages");
478 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ D.append(wrapper, btn);
479 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ btn.addEventListener('click',()=>loadOldMessages(Chat.loadMessageCount));
480 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ btn = D.button("All previous messages");
481 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ D.append(wrapper, btn);
482 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ btn.addEventListener('click',()=>loadOldMessages(-1));
483 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ D.append(document.querySelector('body.chat > div.content'), toolbar);
484 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ toolbar.disabled = true /*will be enabled when msg load finishes */;
485 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }/*end history loading widget setup*/
486 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
487 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ async function poll(isFirstCall){
370 488 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(poll.running) return;
371 489 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
poll.running = true;
372 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fetch("chat-poll?name=" + Chat.mxMsg)
373 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- .then(x=>x.json())
374 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- .then(y=>newcontent(y))
375 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- .catch(e=>console.error(e))
376 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- .finally(()=>poll.running=false)
377 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
378 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- poll();
379 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- setInterval(poll, 1000);
380 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- F.page.chat = Chat;
490 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(isFirstCall) Chat.ajaxStart();
491 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ var p = fetch("chat-poll?name=" + Chat.mxMsg);
492 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p.then(x=>x.json())
493 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ .then(y=>newcontent(y))
494 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ .catch(e=>Chat.reportError(e))
495 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ .finally(function(x){
496 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(isFirstCall) Chat.ajaxEnd();
497 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ poll.running=false;
498 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ });
499 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
500 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ poll.running = false;
501 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ poll(true);
502 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ setInterval(poll, 1000);
503 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ F.page.chat = Chat/* enables testing the APIs via the dev tools */;
381 504 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
})();
382 505 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!