cf94f350fed5b91908a4c41c55766aa8b79fb4a9
[flowspy] / templates / poller.js
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