-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathduplicate.js
110 lines (101 loc) · 4.04 KB
/
duplicate.js
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
(function ($) {
$.fn.DuplicateWindow = function () {
var localStorageTimeout = (5) * 1000; // 15,000 milliseconds = 15 seconds.
var localStorageResetInterval = (1/2) * 1000; // 10,000 milliseconds = 10 seconds.
var localStorageTabKey = 'my-application-browser-tab';
var sessionStorageGuidKey = 'browser-tab-guid';
var ItemType = {
Session: 1,
Local: 2
};
function setCookie(name, value, days) {
var expires = "";
if (days) {
var date = new Date();
date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
expires = "; expires=" + date.toUTCString();
}
document.cookie = name + "=" + (value || "") + expires + "; path=/";
}
function getCookie(name) {
var nameEQ = name + "=";
var ca = document.cookie.split(';');
for (var i = 0; i < ca.length; i++) {
var c = ca[i];
while (c.charAt(0) == ' ') c = c.substring(1, c.length);
if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);
}
return null;
}
function GetItem(itemtype) {
var val = "";
switch (itemtype) {
case ItemType.Session:
val = window.name;
break;
case ItemType.Local:
val = decodeURIComponent(getCookie(localStorageTabKey));
if (val == undefined)
val = "";
break;
}
return val;
}
function SetItem(itemtype, val) {
switch (itemtype) {
case ItemType.Session:
window.name = val;
break;
case ItemType.Local:
setCookie(localStorageTabKey, val);
break;
}
}
function createGUID() {
this.s4 = function () {
return Math.floor((1 + Math.random()) * 0x10000)
.toString(16)
.substring(1);
};
return this.s4() + this.s4() + '-' + this.s4() + '-' + this.s4() + '-' + this.s4() + '-' + this.s4() + this.s4() + this.s4();
}
function TestIfDuplicate() {
//console.log("In testTab");
var sessionGuid = GetItem(ItemType.Session) || createGUID();
SetItem(ItemType.Session, sessionGuid);
var val = GetItem(ItemType.Local);
var tabObj = (val == "" ? null : JSON.parse(val)) || null;
console.log(val);
console.log(sessionGuid);
console.log(tabObj);
// If no or stale tab object, our session is the winner. If the guid matches, ours is still the winner
if (tabObj === null || (tabObj.timestamp < (new Date().getTime() - localStorageTimeout)) || tabObj.guid === sessionGuid) {
function setTabObj() {
//console.log("In setTabObj");
var newTabObj = {
guid: sessionGuid,
timestamp: new Date().getTime()
};
SetItem(ItemType.Local, JSON.stringify(newTabObj));
}
setTabObj();
setInterval(setTabObj, localStorageResetInterval);//every x interval refresh timestamp in cookie
return false;
} else {
// An active tab is already open that does not match our session guid.
return true;
}
}
window.IsDuplicate = function () {
var duplicate = TestIfDuplicate();
//console.log("Is Duplicate: "+ duplicate);
return duplicate;
};
$(window).on("beforeunload", function () {
if (TestIfDuplicate() == false) {
SetItem(ItemType.Local, "");
}
})
}
$(window).DuplicateWindow();
}(jQuery));