root / templates / poller.js @ a370d3dd
History | View | Annotate | Download (5.5 kB)
1 |
|
---|---|
2 |
var xhrlp = ''; |
3 |
$(document).ready(function() { |
4 |
if (!window.console) window.console = {};
|
5 |
if (!window.console.log) window.console.log = function() {}; |
6 |
|
7 |
$("#messageform").on("submit", function() { |
8 |
newMessage($(this)); |
9 |
return false; |
10 |
}); |
11 |
$("#messageform").on("keypress", function(e) { |
12 |
if (e.keyCode == 13) { |
13 |
newMessage($(this)); |
14 |
return false; |
15 |
} |
16 |
}); |
17 |
$("#message").select(); |
18 |
{% if user.is_authenticated %}
|
19 |
updater.start(); |
20 |
updater.poll(); |
21 |
{% endif %} |
22 |
}); |
23 |
|
24 |
|
25 |
|
26 |
function newMessage(form) { |
27 |
var message = form.formToDict();
|
28 |
var disabled = form.find("input[type=submit]"); |
29 |
disabled.disable(); |
30 |
var date = new Date(); |
31 |
var timestamp = date.getTime();
|
32 |
$.postJSON("{% url fetch-new %}?="+timestamp, message, function(response) { |
33 |
updater.showMessage(response); |
34 |
if (message.id) {
|
35 |
form.parent().remove(); |
36 |
} else {
|
37 |
form.find("input[type=text]").val("").select(); |
38 |
disabled.enable(); |
39 |
} |
40 |
}); |
41 |
} |
42 |
|
43 |
function getCookie(name) { |
44 |
var r = document.cookie.match("\\b" + name + "=([^;]*)\\b"); |
45 |
return r ? r[1] : undefined; |
46 |
} |
47 |
|
48 |
jQuery.postJSON = function(url, args, callback) { |
49 |
$.ajax({url: url, dataType: "json", type: "POST", cache: false, |
50 |
success: function(response) { |
51 |
if (callback) callback(response);
|
52 |
}, error: function(response) { |
53 |
console.log("ERROR:", response);
|
54 |
}}); |
55 |
}; |
56 |
|
57 |
jQuery.fn.formToDict = function() { |
58 |
var fields = this.serializeArray(); |
59 |
var json = {}
|
60 |
for (var i = 0; i < fields.length; i++) { |
61 |
json[fields[i].name] = fields[i].value; |
62 |
} |
63 |
if (json.next) delete json.next; |
64 |
return json;
|
65 |
}; |
66 |
|
67 |
jQuery.fn.disable = function() { |
68 |
this.enable(false); |
69 |
return this; |
70 |
}; |
71 |
|
72 |
jQuery.fn.enable = function(opt_enable) { |
73 |
if (arguments.length && !opt_enable) { |
74 |
this.attr("disabled", "disabled"); |
75 |
} else {
|
76 |
this.removeAttr("disabled"); |
77 |
} |
78 |
return this; |
79 |
}; |
80 |
|
81 |
var updater = {
|
82 |
errorSleepTime: 500, |
83 |
cursor: null, |
84 |
start: function() { |
85 |
var date = new Date(); |
86 |
var timestamp = date.getTime();
|
87 |
$.ajax({url: "{% url fetch-existing %}?="+timestamp, type: "POST", dataType: "json", cache:false, |
88 |
success: updater.onFetchExisting,
|
89 |
error: updater.onError});
|
90 |
}, |
91 |
|
92 |
poll: function() { |
93 |
{% if user.is_authenticated %}
|
94 |
if (updater.errorSleepTime > 128000){ |
95 |
oTable.fnReloadAjax(refreshUrl); |
96 |
} |
97 |
timeout = {{timeout}}; |
98 |
var date = new Date(); |
99 |
var timestamp = date.getTime();
|
100 |
$.ajax({url: "{% url fetch-updates %}?="+timestamp, type: "POST", dataType: "json", cache:false, |
101 |
success: updater.onSuccess,
|
102 |
timeout: timeout,
|
103 |
error: updater.onError});
|
104 |
{% endif %} |
105 |
}, |
106 |
onSuccess: function(response) { |
107 |
try {
|
108 |
updater.newMessages(response); |
109 |
} catch (e) {
|
110 |
updater.onError(); |
111 |
return;
|
112 |
} |
113 |
updater.errorSleepTime = 500;
|
114 |
window.setTimeout(updater.poll, 0);
|
115 |
}, |
116 |
|
117 |
onFetchExisting: function(response) { |
118 |
try {
|
119 |
updater.existingMessages(response); |
120 |
|
121 |
} catch (e) {
|
122 |
updater.onError(); |
123 |
return;
|
124 |
} |
125 |
}, |
126 |
|
127 |
onError: function(response, text) { |
128 |
if (text == 'timeout'){ |
129 |
oTable.fnReloadAjax(refreshUrl); |
130 |
} |
131 |
updater.errorSleepTime *= 2;
|
132 |
console.log("Poll error; sleeping for", updater.errorSleepTime, "ms"); |
133 |
window.setTimeout(updater.poll, updater.errorSleepTime); |
134 |
|
135 |
}, |
136 |
|
137 |
newMessages: function(response) { |
138 |
if (!response.messages) return; |
139 |
if (response.messages.length == 0){ |
140 |
return true; |
141 |
} |
142 |
updater.cursor = response.cursor; |
143 |
var messages = response.messages;
|
144 |
updater.cursor = messages[messages.length - 1].id;
|
145 |
console.log(messages.length, "new messages, cursor:", updater.cursor);
|
146 |
|
147 |
for (var i = 0; i < messages.length; i++) { |
148 |
updater.showMessage(messages[i]); |
149 |
} |
150 |
$("#hid_mid").val('UPDATED'); |
151 |
oTable.fnReloadAjax(refreshUrl); |
152 |
}, |
153 |
|
154 |
existingMessages: function(response) { |
155 |
if (!response.messages) return; |
156 |
if (response.messages.length == 0){ |
157 |
return true; |
158 |
} |
159 |
updater.cursor = response.cursor; |
160 |
var messages = response.messages;
|
161 |
updater.cursor = messages[messages.length - 1].id;
|
162 |
var i = messages.length
|
163 |
for (var i = 0; i < messages.length; i++) { |
164 |
updater.showMessage(messages[i]); |
165 |
} |
166 |
}, |
167 |
|
168 |
showMessage: function(message) { |
169 |
var existing = $("#m" + message.id); |
170 |
if (existing.length > 0) return; |
171 |
var username = message.body.split("]")[0].replace("[",""); |
172 |
var mbody = message.body.replace("["+username+"] ",""); |
173 |
var htmlnode = '<li class="left clearfix">\ |
174 |
<div class="chat-body clearfix" style="margin-left: 0px;"> \
|
175 |
<div class="header"> \
|
176 |
<small class="pull-right text-muted"> \
|
177 |
<i class="fa fa-clock-o fa-fw"></i> '+ message.time +' \ |
178 |
</small>\
|
179 |
</div>\
|
180 |
<p><small><strong class="primary-font">'+username+'</strong>:\ |
181 |
'+ mbody+'\ |
182 |
</small></p>\
|
183 |
</div>\
|
184 |
</li>';
|
185 |
var node = $(htmlnode); |
186 |
node.hide(); |
187 |
// $('#inbox').val($('#inbox').val()+message.text);
|
188 |
$("#inbox").prepend(node); |
189 |
node.slideDown(); |
190 |
} |
191 |
}; |
192 |
|
193 |
function blink(selector){ |
194 |
$(selector).animate({color: "#EE5F5B"}, 500, function(){ |
195 |
$(this).animate({ color: "white" }, 500, function(){ |
196 |
blink(this);
|
197 |
}); |
198 |
}); |
199 |
} |
200 |
|