Statistics
| Branch: | Tag: | Revision:

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