| // @Author: avm99963 (https://www.avm99963.com) |
| /* @License: The MIT License (MIT) |
| |
| Copyright (c) 2021 Adrià Vilanova Martínez |
| |
| Permission is hereby granted, free of charge, to any person obtaining a copy |
| of this software and associated documentation files (the "Software"), to deal |
| in the Software without restriction, including without limitation the rights |
| to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
| copies of the Software, and to permit persons to whom the Software is |
| furnished to do so, subject to the following conditions: |
| |
| The above copyright notice and this permission notice shall be included in all |
| copies or substantial portions of the Software. |
| |
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
| AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
| OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
| SOFTWARE. */ |
| |
| var actualversion; |
| |
| var app = { |
| init: function() { |
| fetch('https://omahaproxy.appspot.com/all.json') |
| .then(res => res.json()) |
| .then(chromeversions => { |
| var browser = BrowserDetect.browser, version = BrowserDetect.version, |
| version2, os3, os2 = System.OS(), os = BrowserDetect.OS; |
| if (navigator.appVersion.indexOf('OPR') != -1) browser = 'Opera'; |
| if (browser == 'Chrome') { |
| version2 = window.navigator.appVersion.match(/Chrome\/(.*?) /)[1]; |
| if (navigator.appVersion.indexOf('CrOS') != -1) |
| var os = 'Chrome OS', os2 = 'cros', os3 = 'Chrome OS'; |
| else |
| var os3 = os2, |
| os2 = str_replace( |
| ['Windows', 'Mac', 'iPhone/iPod', 'Chrome OS', 'Linux'], |
| ['win64', 'mac', 'ios', 'cros', 'linux'], os); |
| var matches = chromeversions.filter(function(val, index, array) { |
| return val.os === os2; |
| }); |
| var actualchrome = |
| matches[0].versions.filter(function(val, index, array) { |
| return val.channel === 'stable'; |
| }); |
| actualversion = actualchrome[0].version.split('.')[0]; |
| if (version < actualversion) { |
| document.getElementById('updated').innerHTML = |
| '¡Oh, no! Google Chrome ' + |
| '<a href=\'https://support.google.com/chrome/answer/95414\'>no está actualizado</a>.'; |
| } else if (version > actualversion) { |
| document.getElementById('updated').innerHTML = |
| 'No estás usando el canal estable de Chrome. Ve con cuidado ;-)'; |
| } else if (version2 != actualchrome[0].version) { |
| document.getElementById('updated').innerHTML = |
| 'Oops, Google Chrome ' + |
| '<a href=\'https://support.google.com/chrome/answer/95414\'>no está actualizado</a>.'; |
| } else { |
| document.getElementById('updated').innerHTML = |
| 'Chrome está actualizado'; |
| } |
| } else { |
| os3 = os2; |
| version2 = version; |
| } |
| document.getElementById('version').textContent = |
| 'Usas la versión ' + version2 + ' de ' + browser + ' en ' + os3; |
| }); |
| } |
| } |
| |
| // Function to detect navigator (informally browser) |
| // Source: |
| |
| var BrowserDetect = { |
| init: function() { |
| this.browser = this.searchString(this.dataBrowser) || '?'; |
| this.version = this.searchVersion(navigator.userAgent) || |
| this.searchVersion(navigator.appVersion) || '?'; |
| this.OS = this.searchString(this.dataOS) || '?'; |
| }, |
| searchString: function(data) { |
| for (var i = 0; i < data.length; i++) { |
| var dataString = data[i].string; |
| var dataProp = data[i].prop; |
| this.versionSearchString = data[i].versionSearch || data[i].identity; |
| if (dataString) { |
| if (dataString.indexOf(data[i].subString) != -1) |
| return data[i].identity; |
| } else if (dataProp) |
| return data[i].identity; |
| } |
| }, |
| searchVersion: function(dataString) { |
| var index = dataString.indexOf(this.versionSearchString); |
| if (index == -1) return; |
| return parseFloat( |
| dataString.substring(index + this.versionSearchString.length + 1)); |
| }, |
| dataBrowser: [ |
| {string: navigator.userAgent, subString: 'Chrome', identity: 'Chrome'}, { |
| string: navigator.userAgent, |
| subString: 'OmniWeb', |
| versionSearch: 'OmniWeb/', |
| identity: 'OmniWeb' |
| }, |
| { |
| string: navigator.vendor, |
| subString: 'Apple', |
| identity: 'Safari', |
| versionSearch: 'Version' |
| }, |
| {prop: window.opera, identity: 'Opera', versionSearch: 'Version'}, |
| {string: navigator.vendor, subString: 'iCab', identity: 'iCab'}, |
| {string: navigator.vendor, subString: 'KDE', identity: 'Konqueror'}, |
| {string: navigator.userAgent, subString: 'Firefox', identity: 'Firefox'}, |
| {string: navigator.vendor, subString: 'Camino', identity: 'Camino'}, { |
| // for newer Netscapes (6+) |
| string: navigator.userAgent, |
| subString: 'Netscape', |
| identity: 'Netscape' |
| }, |
| { |
| string: navigator.userAgent, |
| subString: 'MSIE', |
| identity: 'Explorer', |
| versionSearch: 'MSIE' |
| }, |
| { |
| string: navigator.userAgent, |
| subString: 'Gecko', |
| identity: 'Mozilla', |
| versionSearch: 'rv' |
| }, |
| { |
| // for older Netscapes (4-) |
| string: navigator.userAgent, |
| subString: 'Mozilla', |
| identity: 'Netscape', |
| versionSearch: 'Mozilla' |
| } |
| ], |
| dataOS: [ |
| {string: navigator.platform, subString: 'Win', identity: 'Windows'}, |
| {string: navigator.platform, subString: 'Mac', identity: 'Mac'}, |
| {string: navigator.userAgent, subString: 'iPhone', identity: 'iPhone/iPod'}, |
| {string: navigator.platform, subString: 'Linux', identity: 'Linux'} |
| ] |
| }; |
| |
| function str_replace(search, replace, subject, count) { |
| // http://kevin.vanzonneveld.net |
| // + original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) |
| // + improved by: Gabriel Paderni |
| // + improved by: Philip Peterson |
| // + improved by: Simon Willison (http://simonwillison.net) |
| // + revised by: Jonas Raoni Soares Silva (http://www.jsfromhell.com) |
| // + bugfixed by: Anton Ongson |
| // + input by: Onno Marsman |
| // + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) |
| // + tweaked by: Onno Marsman |
| // + input by: Brett Zamir (http://brett-zamir.me) |
| // + bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) |
| // + input by: Oleg Eremeev |
| // + improved by: Brett Zamir (http://brett-zamir.me) |
| // + bugfixed by: Oleg Eremeev |
| // % note 1: The count parameter must be passed as a string in order |
| // % note 1: to find a global variable in which the result will be |
| // given |
| // * example 1: str_replace(' ', '.', 'Kevin van Zonneveld'); |
| // * returns 1: 'Kevin.van.Zonneveld' |
| // * example 2: str_replace(['{name}', 'l'], ['hello', 'm'], '{name}, |
| // lars'); |
| // * returns 2: 'hemmo, mars' |
| var i = 0, j = 0, temp = '', repl = '', sl = 0, fl = 0, f = [].concat(search), |
| r = [].concat(replace), s = subject, |
| ra = Object.prototype.toString.call(r) === '[object Array]', |
| sa = Object.prototype.toString.call(s) === '[object Array]'; |
| s = [].concat(s); |
| if (count) { |
| this.window[count] = 0; |
| } |
| |
| for (i = 0, sl = s.length; i < sl; i++) { |
| if (s[i] === '') { |
| continue; |
| } |
| for (j = 0, fl = f.length; j < fl; j++) { |
| temp = s[i] + ''; |
| repl = ra ? (r[j] !== undefined ? r[j] : '') : r[0]; |
| s[i] = (temp).split(f[j]).join(repl); |
| if (count && s[i] !== temp) { |
| this.window[count] += (temp.length - s[i].length) / f[j].length; |
| } |
| } |
| } |
| return sa ? s : s[0]; |
| } |
| |
| /** |
| * JavaScript Client Detection |
| * (C) viazenetti GmbH (Christian Ludwig) |
| */ |
| |
| var System = { |
| OS: function() { |
| var unknown = '?'; |
| |
| // browser |
| var nVer = navigator.appVersion; |
| var nAgt = navigator.userAgent; |
| var browser = navigator.appName; |
| var version = '' + parseFloat(navigator.appVersion); |
| var majorVersion = parseInt(navigator.appVersion, 10); |
| var nameOffset, verOffset, ix; |
| |
| // system |
| var os = unknown; |
| var clientStrings = [ |
| {s: 'Windows 3.11', r: /Win16/}, |
| {s: 'Windows 95', r: /(Windows 95|Win95|Windows_95)/}, |
| {s: 'Windows ME', r: /(Win 9x 4.90|Windows ME)/}, |
| {s: 'Windows 98', r: /(Windows 98|Win98)/}, |
| {s: 'Windows CE', r: /Windows CE/}, |
| {s: 'Windows 2000', r: /(Windows NT 5.0|Windows 2000)/}, |
| {s: 'Windows XP', r: /(Windows NT 5.1|Windows XP)/}, |
| {s: 'Windows Server 2003', r: /Windows NT 5.2/}, |
| {s: 'Windows Vista', r: /Windows NT 6.0/}, |
| {s: 'Windows 7', r: /(Windows 7|Windows NT 6.1)/}, |
| {s: 'Windows 8.1', r: /(Windows 8.1|Windows NT 6.3)/}, |
| {s: 'Windows 8', r: /(Windows 8|Windows NT 6.2)/}, |
| {s: 'Windows NT 4.0', r: /(Windows NT 4.0|WinNT4.0|WinNT|Windows NT)/}, |
| {s: 'Windows ME', r: /Windows ME/}, |
| {s: 'Android', r: /Android/}, |
| {s: 'Open BSD', r: /OpenBSD/}, |
| {s: 'Sun OS', r: /SunOS/}, |
| {s: 'Linux', r: /(Linux|X11)/}, |
| {s: 'iOS', r: /(iPhone|iPad|iPod)/}, |
| {s: 'Mac OS X', r: /Mac OS X/}, |
| {s: 'Mac OS', r: /(MacPPC|MacIntel|Mac_PowerPC|Macintosh)/}, |
| {s: 'QNX', r: /QNX/}, |
| {s: 'UNIX', r: /UNIX/}, |
| {s: 'BeOS', r: /BeOS/}, |
| {s: 'OS/2', r: /OS\/2/}, |
| { |
| s: 'Search Bot', |
| r: /(nuhk|Googlebot|Yammybot|Openbot|Slurp|MSNBot|Ask Jeeves\/Teoma|ia_archiver)/ |
| } |
| ]; |
| for (var id in clientStrings) { |
| var cs = clientStrings[id]; |
| if (cs.r.test(nAgt)) { |
| os = cs.s; |
| break; |
| } |
| } |
| |
| var osVersion = 'unknown'; |
| |
| if (/Windows/.test(os)) { |
| osVersion = /Windows (.*)/.exec(os)[1]; |
| os = 'Windows'; |
| } |
| |
| switch (os) { |
| case 'Mac OS X': |
| osVersion = /Mac OS X (10[\.\_\d]+)/.exec(nAgt)[1]; |
| break; |
| |
| case 'Android': |
| osVersion = /Android ([\.\_\d]+)/.exec(nAgt)[1]; |
| break; |
| |
| case 'iOS': |
| osVersion = /OS (\d+)_(\d+)_?(\d+)?/.exec(nVer); |
| osVersion = |
| osVersion[1] + '.' + osVersion[2] + '.' + (osVersion[3] | 0); |
| break; |
| } |
| |
| var jscd = {os: os, osVersion: osVersion}; |
| |
| return (jscd.os + ' ' + jscd.osVersion); |
| } |
| }; |
| |
| window.addEventListener('load', _ => { |
| BrowserDetect.init(); |
| app.init(); |
| }); |