Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
titaniumnetwork-dev
GitHub Repository: titaniumnetwork-dev/Incognito-old
Path: blob/main/static/src/index.js
1324 views
1
const cookies = navigator.cookieEnabled ? parseCookies(document.cookie) : new Map();
2
const appearance = cookies.get('appearance') || 'midnight';
3
const xor = {
4
encode(str){
5
if (!str) return str;
6
return encodeURIComponent(str.toString().split('').map((char, ind) => ind % 2 ? String.fromCharCode(char.charCodeAt() ^ 2) : char).join(''));
7
},
8
decode(str){
9
if (!str) return str;
10
return decodeURIComponent(str).split('').map((char, ind) => ind % 2 ? String.fromCharCode(char.charCodeAt() ^ 2) : char).join('');
11
},
12
};
13
14
Object.defineProperty(document, 'appearance', {
15
get() {
16
return document.body.getAttribute('data-appearance');
17
},
18
set(val) {
19
return document.body.setAttribute('data-appearance', val);
20
},
21
});
22
23
Object.defineProperty(document, 'engine', {
24
get() {
25
return document.body.getAttribute('data-engine');
26
},
27
set(val) {
28
return document.body.setAttribute('data-engine', val);
29
},
30
});
31
32
Object.defineProperty(document, 'page', {
33
get() {
34
return document.body.getAttribute('data-page');
35
},
36
});
37
38
if (localStorage.getItem('__tab_title')) {
39
try {
40
document.title = atob(decodeURIComponent(localStorage.getItem('__tab_title')));
41
} catch(err) {
42
console.error('Could not decode storage property "__tab_title" due to invalid codec.');
43
};
44
};
45
46
if (localStorage.getItem('__tab_icon')) {
47
try {
48
document.querySelector('#favicon').href = atob(decodeURIComponent(localStorage.getItem('__tab_icon')));;
49
} catch(err) {
50
console.error('Could not decode storage property "__tab_icon" due to invalid codec.');
51
};
52
};
53
54
switch(document.page) {
55
case 'settings':
56
settings();
57
break;
58
case 'gs':
59
gs();
60
break;
61
case 'home':
62
home();
63
};
64
65
function settings() {
66
appearance();
67
engine();
68
tab();
69
function tab() {
70
const input = document.querySelector('.tab input');
71
document.querySelector('.tab button[data-action=title]').addEventListener('click', () => {
72
if (!input.value) return false;
73
changeTitle(input.value);
74
});
75
document.querySelector('.tab button[data-action=icon]').addEventListener('click', () => {
76
if (!input.value) return false;
77
changeFavicon(input.value);
78
});
79
};
80
function appearance() {
81
let lastSelected = document.querySelector(`.appearance .options li[data-appearance=${document.appearance}]`);
82
document.querySelectorAll('.appearance .options li').forEach(node =>
83
node.addEventListener('click', () => {
84
lastSelected.removeAttribute('data-selected');
85
document.appearance = node.getAttribute('data-appearance') || 'midnight';
86
node.setAttribute('data-selected', '')
87
lastSelected = node;
88
document.cookie = `appearance=${document.appearance}`;
89
})
90
);
91
if (lastSelected) lastSelected.setAttribute('data-selected', '');
92
};
93
function engine() {
94
let lastSelected = document.querySelector(`.search-engine .options li[data-engine=${document.engine}]`);
95
document.querySelectorAll('.search-engine .options li').forEach(node => {
96
node.addEventListener('click', () => {
97
lastSelected.removeAttribute('data-selected');
98
node.setAttribute('data-selected', '')
99
lastSelected = node;
100
document.cookie = `engine=${node.getAttribute('data-engine')}`;
101
});
102
})
103
if (lastSelected) lastSelected.setAttribute('data-selected', '');
104
};
105
};
106
107
function gs() {
108
thumbnails();
109
search();
110
frameControls();
111
document.addEventListener('fullscreenchange', () => {
112
if (document.fullscreenElement) {
113
document.querySelector('.frame .controls button[data-action=fullscreen]').innerHTML = 'fullscreen_exit';
114
} else {
115
document.querySelector('.frame .controls button[data-action=fullscreen]').innerHTML = 'fullscreen';
116
};
117
});
118
function frameControls() {
119
document.querySelector('.frame .controls button[data-action=close]').addEventListener('click', () =>
120
closeFrame('gs')
121
);
122
document.querySelector('.frame .controls button[data-action=fullscreen]').addEventListener('click', () => {
123
if (document.fullscreenElement) {
124
document.exitFullscreen();
125
} else {
126
document.querySelector('.frame').requestFullscreen();
127
};
128
});
129
}
130
function search() {
131
document.querySelector('.gs-search').addEventListener('keyup', function() {
132
let matches = 0;
133
document.querySelectorAll('.thumbnail').forEach(entry => {
134
const title = entry.querySelector('.title').textContent;
135
if (!title.trim().toLowerCase().includes(this.value.trim().toLowerCase())) {
136
entry.style.display = 'none';
137
} else {
138
matches += 1;
139
entry.style.removeProperty('display');
140
};
141
});
142
if (!matches) {
143
document.querySelector('.gs-empty').style.display = 'block';
144
} else {
145
document.querySelector('.gs-empty').style.removeProperty('display');
146
};
147
});
148
};
149
function thumbnails() {
150
document.querySelectorAll('.thumbnail').forEach(node => {
151
node.addEventListener('click', e => {
152
e.preventDefault();
153
renderFrame('gs', node.href)
154
});
155
});
156
};
157
};
158
159
async function home() {
160
const form = document.querySelector('.service');
161
submit();
162
quickLinks();
163
suggestions();
164
function submit() {
165
form.addEventListener('submit', e => {
166
e.preventDefault();
167
renderFrame('web', `./gateway?url=${encodeURIComponent(btoa(form.querySelector('input').value))}`);
168
});
169
};
170
function quickLinks() {
171
document.querySelectorAll('.quick-button').forEach(node =>
172
node.addEventListener('click', e => {
173
e.preventDefault();
174
renderFrame('web', node.href);
175
})
176
)
177
};
178
function suggestions() {
179
const suggestions = document.querySelector('#suggestions');
180
form.querySelector('input').addEventListener('input', async () => {
181
suggestions.innerHTML = '';
182
const res = await fetch('./suggestions/', {
183
method: 'POST',
184
body: form.querySelector('input').value,
185
});
186
const json = await res.json();
187
if (json.length) {
188
json.forEach(entry => {
189
const option = document.createElement('option');
190
option.value = entry.phrase;
191
suggestions.appendChild(option);
192
});
193
} else {
194
suggestions.innerHTML = `
195
<option value="discord.com"></option>
196
<option value="youtube.com"></option>
197
<option value="twitch.tv"></option>
198
<option value="twitter.com/explore"></option>
199
<option value="reddit.com"></option>
200
`;
201
}
202
});
203
};
204
};
205
206
function renderFrame(id = '', url) {
207
if (!document.querySelector(`.frame[data-service=${id}]`)) return false;
208
const frame = document.querySelector(`.frame[data-service=${id}]`);
209
document.querySelector('main').style.display = "none";
210
frame.querySelector('iframe').src = url;
211
frame.style.display = 'block';
212
};
213
214
function closeFrame(id = '') {
215
if (!document.querySelector(`.frame[data-service=${id}]`)) return false;
216
const frame = document.querySelector(`.frame[data-service=${id}]`);
217
document.querySelector('main').style.removeProperty('display');
218
frame.querySelector('iframe').src = 'about:blank';
219
frame.style.removeProperty('display');
220
if (document.fullscreenElement) document.exitFullscreen();
221
};
222
223
function changeTitle(val = '') {
224
document.title = val;
225
return localStorage.setItem('__tab_title', encodeURIComponent(btoa(val)));
226
};
227
228
function changeFavicon(val) {
229
const uri = new URL(/^http(s?):\/\//.test(val) ? val : 'http://' + val);
230
document.querySelector('#favicon').href = uri.href;
231
return localStorage.setItem('__tab_icon', encodeURIComponent(btoa(uri.href)));
232
};
233
234
function parseCookies(str = '') {
235
const map = new Map();
236
str.split('; ').forEach(cookie => map.set(...cookie.split('=')));
237
return map;
238
};
239