-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathofflineManager.js
More file actions
96 lines (89 loc) · 3.11 KB
/
offlineManager.js
File metadata and controls
96 lines (89 loc) · 3.11 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
(function($) {
$.offlineManager = function(interval, url) {
var offlineUrl = url ? url : '/';
var i = interval ? interval : 3000;
var _si = null;
var online = 1;
var first = true;
var networkConnection = true;
var onlineCallbacks = [];
var offlineCallbacks = [];
var _online = function() {
if(first || !online) {
online = true;
first = false;
for(var k in onlineCallbacks) {
(onlineCallbacks[k])();
}
}
}
var _offline = function() {
if(first || online) {
online = first = false;
for(var k in offlineCallbacks) {
(offlineCallbacks[k])();
}
}
}
var ping = function() {
if(networkConnection) {
$.ajax({url:offlineUrl,timeout: i, dataType:"text", type:"POST"})
.done(function() { _online(); })
.fail(function() { _offline(); });
}
}
var startPing = function() {
networkConnection = true;
ping();
if(!_si) _si = setInterval(ping,i);
}
var stopPing = function() {
if(_si) { clearInterval(_si); _si = null; }
_offline();
networkConnection = false;
}
if(navigator.hasOwnProperty('onLine')) {
networkConnection = navigator.onLine;
$(window).bind('offline',stopPing);
$(window).bind('online',startPing);
if(networkConnection) startPing();
else stopPing();
} else {
startPing();
}
return {
online: function(callback) {
if(callback == undefined) {
_online();
} else if(callback instanceof Function) {
onlineCallbacks.push(callback);
!first && this.isOnline() && callback();
}
return this;
},
offline: function(callback) {
if(callback == undefined) {
_offline();
} else if(callback instanceof Function) {
offlineCallbacks.push(callback);
!first && !this.isOnline() && setTimeout(callback,1); //if we are appcached and have no network connection, we need this delay in the case where the offline callback references the object that this returns
}
return this;
},
isOnline: function() { return networkConnection && !!online; },
isInitialized: function() { return !first; },
updateInterval: function(interval) {
i = interval;
if(_si) {
clearInterval(_si);
_si = setInterval(ping,i);
}
return this;
},
updateURL: function(url) {
offlineUrl = url;
return this;
}
};
}
})(jQuery);