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