blob: a49596edee9a4f183a6e129bb97626581ef40ac1 [file] [log] [blame]
Adrià Vilanova Martínez849f9dd2021-06-25 20:40:10 +02001// @Author: avm99963 (https://www.avm99963.com)
2/* @License: The MIT License (MIT)
3
4Copyright (c) 2021 Adrià Vilanova Martínez
5
6Permission is hereby granted, free of charge, to any person obtaining a copy
7of this software and associated documentation files (the "Software"), to deal
8in the Software without restriction, including without limitation the rights
9to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10copies of the Software, and to permit persons to whom the Software is
11furnished to do so, subject to the following conditions:
12
13The above copyright notice and this permission notice shall be included in all
14copies or substantial portions of the Software.
15
16THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22SOFTWARE. */
23
24var actualversion;
25
26var app = {
27 init: function() {
28 fetch('https://omahaproxy.appspot.com/all.json')
29 .then(res => res.json())
30 .then(chromeversions => {
31 var browser = BrowserDetect.browser, version = BrowserDetect.version,
32 version2, os3, os2 = System.OS(), os = BrowserDetect.OS;
33 if (navigator.appVersion.indexOf('OPR') != -1) browser = 'Opera';
34 if (browser == 'Chrome') {
35 version2 = window.navigator.appVersion.match(/Chrome\/(.*?) /)[1];
36 if (navigator.appVersion.indexOf('CrOS') != -1)
37 var os = 'Chrome OS', os2 = 'cros', os3 = 'Chrome OS';
38 else
39 var os3 = os2,
40 os2 = str_replace(
41 ['Windows', 'Mac', 'iPhone/iPod', 'Chrome OS', 'Linux'],
42 ['win64', 'mac', 'ios', 'cros', 'linux'], os);
43 var matches = chromeversions.filter(function(val, index, array) {
44 return val.os === os2;
45 });
46 var actualchrome =
47 matches[0].versions.filter(function(val, index, array) {
48 return val.channel === 'stable';
49 });
50 actualversion = actualchrome[0].version.split('.')[0];
51 if (version < actualversion) {
52 document.getElementById('updated').innerHTML = '¡Oh, no!' +
53 'Google Chrome <a href=\'https://support.google.com/chrome/answer/95414\'>no está actualizado</a>.';
54 } else if (version > actualversion) {
55 document.getElementById('updated').innerHTML =
56 'No estás usando el canal estable de Chrome. Ve con cuidado ;-)';
57 } else if (version2 != actualchrome[0].version) {
58 document.getElementById('updated').innerHTML =
59 'Oops, Google Chrome <a href=\'https://support.google.com/chrome/answer/95414\'>no está actualizado</a>.';
60 } else {
61 document.getElementById('updated').innerHTML =
62 'Chrome está actualizado';
63 }
64 } else {
65 os3 = os2;
66 version2 = version;
67 }
68 document.getElementById('version').textContent =
69 'Usas la versión ' + version2 + ' de ' + browser + ' en ' + os3;
70 });
71 }
72}
73
74// Function to detect navigator (informally browser)
75// Source:
76
77var BrowserDetect = {
78 init: function() {
79 this.browser = this.searchString(this.dataBrowser) || '?';
80 this.version = this.searchVersion(navigator.userAgent) ||
81 this.searchVersion(navigator.appVersion) || '?';
82 this.OS = this.searchString(this.dataOS) || '?';
83 },
84 searchString: function(data) {
85 for (var i = 0; i < data.length; i++) {
86 var dataString = data[i].string;
87 var dataProp = data[i].prop;
88 this.versionSearchString = data[i].versionSearch || data[i].identity;
89 if (dataString) {
90 if (dataString.indexOf(data[i].subString) != -1)
91 return data[i].identity;
92 } else if (dataProp)
93 return data[i].identity;
94 }
95 },
96 searchVersion: function(dataString) {
97 var index = dataString.indexOf(this.versionSearchString);
98 if (index == -1) return;
99 return parseFloat(
100 dataString.substring(index + this.versionSearchString.length + 1));
101 },
102 dataBrowser: [
103 {string: navigator.userAgent, subString: 'Chrome', identity: 'Chrome'}, {
104 string: navigator.userAgent,
105 subString: 'OmniWeb',
106 versionSearch: 'OmniWeb/',
107 identity: 'OmniWeb'
108 },
109 {
110 string: navigator.vendor,
111 subString: 'Apple',
112 identity: 'Safari',
113 versionSearch: 'Version'
114 },
115 {prop: window.opera, identity: 'Opera', versionSearch: 'Version'},
116 {string: navigator.vendor, subString: 'iCab', identity: 'iCab'},
117 {string: navigator.vendor, subString: 'KDE', identity: 'Konqueror'},
118 {string: navigator.userAgent, subString: 'Firefox', identity: 'Firefox'},
119 {string: navigator.vendor, subString: 'Camino', identity: 'Camino'}, {
120 // for newer Netscapes (6+)
121 string: navigator.userAgent,
122 subString: 'Netscape',
123 identity: 'Netscape'
124 },
125 {
126 string: navigator.userAgent,
127 subString: 'MSIE',
128 identity: 'Explorer',
129 versionSearch: 'MSIE'
130 },
131 {
132 string: navigator.userAgent,
133 subString: 'Gecko',
134 identity: 'Mozilla',
135 versionSearch: 'rv'
136 },
137 {
138 // for older Netscapes (4-)
139 string: navigator.userAgent,
140 subString: 'Mozilla',
141 identity: 'Netscape',
142 versionSearch: 'Mozilla'
143 }
144 ],
145 dataOS: [
146 {string: navigator.platform, subString: 'Win', identity: 'Windows'},
147 {string: navigator.platform, subString: 'Mac', identity: 'Mac'},
148 {string: navigator.userAgent, subString: 'iPhone', identity: 'iPhone/iPod'},
149 {string: navigator.platform, subString: 'Linux', identity: 'Linux'}
150 ]
151};
152
153function str_replace(search, replace, subject, count) {
154 // http://kevin.vanzonneveld.net
155 // + original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
156 // + improved by: Gabriel Paderni
157 // + improved by: Philip Peterson
158 // + improved by: Simon Willison (http://simonwillison.net)
159 // + revised by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
160 // + bugfixed by: Anton Ongson
161 // + input by: Onno Marsman
162 // + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
163 // + tweaked by: Onno Marsman
164 // + input by: Brett Zamir (http://brett-zamir.me)
165 // + bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
166 // + input by: Oleg Eremeev
167 // + improved by: Brett Zamir (http://brett-zamir.me)
168 // + bugfixed by: Oleg Eremeev
169 // % note 1: The count parameter must be passed as a string in order
170 // % note 1: to find a global variable in which the result will be
171 // given
172 // * example 1: str_replace(' ', '.', 'Kevin van Zonneveld');
173 // * returns 1: 'Kevin.van.Zonneveld'
174 // * example 2: str_replace(['{name}', 'l'], ['hello', 'm'], '{name},
175 // lars');
176 // * returns 2: 'hemmo, mars'
177 var i = 0, j = 0, temp = '', repl = '', sl = 0, fl = 0, f = [].concat(search),
178 r = [].concat(replace), s = subject,
179 ra = Object.prototype.toString.call(r) === '[object Array]',
180 sa = Object.prototype.toString.call(s) === '[object Array]';
181 s = [].concat(s);
182 if (count) {
183 this.window[count] = 0;
184 }
185
186 for (i = 0, sl = s.length; i < sl; i++) {
187 if (s[i] === '') {
188 continue;
189 }
190 for (j = 0, fl = f.length; j < fl; j++) {
191 temp = s[i] + '';
192 repl = ra ? (r[j] !== undefined ? r[j] : '') : r[0];
193 s[i] = (temp).split(f[j]).join(repl);
194 if (count && s[i] !== temp) {
195 this.window[count] += (temp.length - s[i].length) / f[j].length;
196 }
197 }
198 }
199 return sa ? s : s[0];
200}
201
202/**
203 * JavaScript Client Detection
204 * (C) viazenetti GmbH (Christian Ludwig)
205 */
206
207var System = {
208 OS: function() {
209 var unknown = '?';
210
211 // browser
212 var nVer = navigator.appVersion;
213 var nAgt = navigator.userAgent;
214 var browser = navigator.appName;
215 var version = '' + parseFloat(navigator.appVersion);
216 var majorVersion = parseInt(navigator.appVersion, 10);
217 var nameOffset, verOffset, ix;
218
219 // system
220 var os = unknown;
221 var clientStrings = [
222 {s: 'Windows 3.11', r: /Win16/},
223 {s: 'Windows 95', r: /(Windows 95|Win95|Windows_95)/},
224 {s: 'Windows ME', r: /(Win 9x 4.90|Windows ME)/},
225 {s: 'Windows 98', r: /(Windows 98|Win98)/},
226 {s: 'Windows CE', r: /Windows CE/},
227 {s: 'Windows 2000', r: /(Windows NT 5.0|Windows 2000)/},
228 {s: 'Windows XP', r: /(Windows NT 5.1|Windows XP)/},
229 {s: 'Windows Server 2003', r: /Windows NT 5.2/},
230 {s: 'Windows Vista', r: /Windows NT 6.0/},
231 {s: 'Windows 7', r: /(Windows 7|Windows NT 6.1)/},
232 {s: 'Windows 8.1', r: /(Windows 8.1|Windows NT 6.3)/},
233 {s: 'Windows 8', r: /(Windows 8|Windows NT 6.2)/},
234 {s: 'Windows NT 4.0', r: /(Windows NT 4.0|WinNT4.0|WinNT|Windows NT)/},
235 {s: 'Windows ME', r: /Windows ME/},
236 {s: 'Android', r: /Android/},
237 {s: 'Open BSD', r: /OpenBSD/},
238 {s: 'Sun OS', r: /SunOS/},
239 {s: 'Linux', r: /(Linux|X11)/},
240 {s: 'iOS', r: /(iPhone|iPad|iPod)/},
241 {s: 'Mac OS X', r: /Mac OS X/},
242 {s: 'Mac OS', r: /(MacPPC|MacIntel|Mac_PowerPC|Macintosh)/},
243 {s: 'QNX', r: /QNX/},
244 {s: 'UNIX', r: /UNIX/},
245 {s: 'BeOS', r: /BeOS/},
246 {s: 'OS/2', r: /OS\/2/},
247 {
248 s: 'Search Bot',
249 r: /(nuhk|Googlebot|Yammybot|Openbot|Slurp|MSNBot|Ask Jeeves\/Teoma|ia_archiver)/
250 }
251 ];
252 for (var id in clientStrings) {
253 var cs = clientStrings[id];
254 if (cs.r.test(nAgt)) {
255 os = cs.s;
256 break;
257 }
258 }
259
260 var osVersion = 'unknown';
261
262 if (/Windows/.test(os)) {
263 osVersion = /Windows (.*)/.exec(os)[1];
264 os = 'Windows';
265 }
266
267 switch (os) {
268 case 'Mac OS X':
269 osVersion = /Mac OS X (10[\.\_\d]+)/.exec(nAgt)[1];
270 break;
271
272 case 'Android':
273 osVersion = /Android ([\.\_\d]+)/.exec(nAgt)[1];
274 break;
275
276 case 'iOS':
277 osVersion = /OS (\d+)_(\d+)_?(\d+)?/.exec(nVer);
278 osVersion =
279 osVersion[1] + '.' + osVersion[2] + '.' + (osVersion[3] | 0);
280 break;
281 }
282
283 var jscd = {os: os, osVersion: osVersion};
284
285 return (jscd.os + ' ' + jscd.osVersion);
286 }
287};
288
289window.addEventListener('load', _ => {
290 BrowserDetect.init();
291 app.init();
292});