JavaScript Code – Detect local system features

This is a code I´ve written many years ago… but it wtill works just fine.

<!DOCTYPE html>
<html lang="en-US">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>JS systemDetect()</title>
</head>
<body>
    <div id="systemDetectResult"></div>
    <script language="JavaScript">
        function systemDetect(){
            var unknown = '-';
            // screen
            var screenSize = '';
            if (screen.width) {
                width = (screen.width) ? screen.width : '';
                height = (screen.height) ? screen.height : '';
                screenSize += '' + width + "x" + height;
            }
            // browser
            //var language = String(navigator.language).toLowerCase();
            var language = navigator.language;
            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;
            // mobile version
            var isMobile = /Mobile|mini|Fennec|Android|iP(ad|od|hone)/.test(nVer);
            // cookie
            var cookieEnabled = (navigator.cookieEnabled) ? true : false;
            if (typeof navigator.cookieEnabled == 'undefined' && !cookieEnabled) {
                document.cookie = 'testcookie';
                cookieEnabled = (document.cookie.indexOf('testcookie') != -1) ? true : false;
            }
            // system
            var os = unknown;
            var clientStrings = [
                {s:'Windows 10', r:/(Windows 10.0|Windows NT 10.0)/},
                {s:'Windows 8.1', r:/(Windows 8.1|Windows NT 6.3)/},
                {s:'Windows 8', r:/(Windows 8|Windows NT 6.2)/},
                {s:'Windows 7', r:/(Windows 7|Windows NT 6.1)/},
                {s:'Windows Vista', r:/Windows NT 6.0/},
                {s:'Windows Server 2003', r:/Windows NT 5.2/},
                {s:'Windows XP', r:/(Windows NT 5.1|Windows XP)/},
                {s:'Windows 2000', r:/(Windows NT 5.0|Windows 2000)/},
                {s:'Windows ME', r:/(Win 9x 4.90|Windows ME)/},
                {s:'Windows 98', r:/(Windows 98|Win98)/},
                {s:'Windows 95', r:/(Windows 95|Win95|Windows_95)/},
                {s:'Windows NT 4.0', r:/(Windows NT 4.0|WinNT4.0|WinNT|Windows NT)/},
                {s:'Windows CE', r:/Windows CE/},
                {s:'Windows 3.11', r:/Win16/},
                {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 = '';
            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);
                    if (osVersion) osVersion = osVersion[1] + '.' + osVersion[2] + '.' + (osVersion[3] | 0);
                    break;
            }
            // Detect Browser
            // Opera
            if ((verOffset = nAgt.indexOf('Opera')) != -1) {
                browser = 'Opera';
                version = nAgt.substring(verOffset + 6);
                if ((verOffset = nAgt.indexOf('Version')) != -1) {
                    version = nAgt.substring(verOffset + 8);
                }
            }
            // Opera Next
            if ((verOffset = nAgt.indexOf('OPR')) != -1) {
                browser = 'Opera';
                version = nAgt.substring(verOffset + 4);
            }
            // MSIE
            else if ((verOffset = nAgt.indexOf('MSIE')) != -1) {
                browser = 'Internet Explorer';
                version = nAgt.substring(verOffset + 5);
            }
            // Chrome
            else if ((verOffset = nAgt.indexOf('Chrome')) != -1) {
                browser = 'Chrome';
                version = nAgt.substring(verOffset + 7);
            }
            // Safari
            else if ((verOffset = nAgt.indexOf('Safari')) != -1) {
                browser = 'Safari';
                version = nAgt.substring(verOffset + 7);
                if ((verOffset = nAgt.indexOf('Version')) != -1) {
                    version = nAgt.substring(verOffset + 8);
                }
                if (os == 'iOS' && nAgt.indexOf('CriOS') != -1){
                    browser = 'Chrome';
                    version = '';
                }
            }
            // Firefox
            else if ((verOffset = nAgt.indexOf('Firefox')) != -1) {
                browser = 'Firefox';
                version = nAgt.substring(verOffset + 8);
            }
            // MSIE 11+
            else if (nAgt.indexOf('Trident/') != -1) {
                browser = 'Microsoft Internet Explorer';
                version = nAgt.substring(nAgt.indexOf('rv:') + 3);
            }
            // Other browsers
            else if ((nameOffset = nAgt.lastIndexOf(' ') + 1) < (verOffset = nAgt.lastIndexOf('/'))) {
                browser = nAgt.substring(nameOffset, verOffset);
                version = nAgt.substring(verOffset + 1);
                //if (browser.toLowerCase() == browser.toUpperCase()) {
                if (browser.length < 5) {
                    browser = navigator.appName;
                }
            }
            // trim the version string
            if ((ix = version.indexOf(';')) != -1) version = version.substring(0, ix);
            if ((ix = version.indexOf(' ')) != -1) version = version.substring(0, ix);
            if ((ix = version.indexOf(')')) != -1) version = version.substring(0, ix);
            majorVersion = parseInt('' + version, 10);
            if (isNaN(majorVersion)) {
                version = '' + parseFloat(navigator.appVersion);
                majorVersion = parseInt(navigator.appVersion, 10);
            }
            function toInt(str) {
                return parseInt(str, 10);
            }
            var playerVersion = [0, 0, 0], d = null;
            if (typeof navigator.plugins !== "undefined" && typeof navigator.plugins["Shockwave Flash"] === "object") {
                try {
                    d = navigator.plugins["Shockwave Flash"].description;
                    // navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin indicates whether plug-ins are enabled or disabled in Safari 3+
                    if (d && (typeof navigator.mimeTypes !== "undefined" && navigator.mimeTypes["application/x-shockwave-flash"] && navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin)) {
                        plugin = true;
                        ie = false; // cascaded feature detection for Internet Explorer
                        d = d.replace(/^.*\s+(\S+\s+\S+$)/, "$1");
                        playerVersion[0] = toInt(d.replace(/^(.*)\..*$/, "$1"));
                        playerVersion[1] = toInt(d.replace(/^.*\.(.*)\s.*$/, "$1"));
                        playerVersion[2] = /[a-zA-Z]/.test(d) ? toInt(d.replace(/^.*[a-zA-Z]+(.*)$/, "$1")) : 0;
                    }
                } catch (e) {}
            } else if (typeof win !== "undefined") {
                if (typeof win.ActiveXObject !== "undefined") {
                    try {
                        var a = new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
                        if (a) { // a will return null when ActiveX is disabled
                            d = a.GetVariable("$version");
                            if (d) {
                                ie = true; // cascaded feature detection for Internet Explorer
                                d = d.split(" ")[1].split(",");
                                playerVersion = [toInt(d[0]), toInt(d[1]), toInt(d[2])];
                            }
                        }
                    } catch (e) {}
                }
            }
            var flashVersion = playerVersion[0]+'.'+ playerVersion[1]+'.'+playerVersion[2];
            var flashMajorVersion = playerVersion[0];
            //var ua = navigator.userAgent.toLowerCase();
            var ua = navigator.userAgent;
            var is_cna = (
                (ua.indexOf('iPhone') != -1 || ua.indexOf('iPad') != -1)
                && (ua.indexOf('Mozilla/') != -1)
                && (ua.indexOf('AppleWebKit/') != -1)
                && (ua.indexOf('Mobile/') != -1)
                && (ua.indexOf('Safari/') == -1)
            );
            var is_windows_phone = (ua.indexOf('Windows Phone') != -1);
            return {
                language: language,
                screen_size: screenSize,
                browser: browser,
                browser_version: version,
                browser_major_version: majorVersion,
                flash_version: flashVersion,
                flash_major_version: flashMajorVersion,
                is_mobile: isMobile,
                is_cna: is_cna,
                is_windows_phone: is_windows_phone,
                os: os,
                os_version: osVersion,
                sup_cookies: cookieEnabled
            };
        }
        function syntaxHighlight(json) {
            if (typeof json != 'string') {
                 json = JSON.stringify(json, null, 2);
            }
            json = json.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');
            var str = json.replace(/("(\\u[a-zA-Z0-9]{4}|\\[^u]|[^\\"])*"(\s*:)?|\b(true|false|null)\b|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?)/g, function (match) {
                var cls = 'number';
                if (/^"/.test(match)) {
                    if (/:$/.test(match)) {
                        cls = 'key';
                    } else {
                        cls = 'string';
                    }
                } else if (/true|false/.test(match)) {
                    cls = 'boolean';
                } else if (/null/.test(match)) {
                    cls = 'null';
                }
                var str = '<span class="' + cls + '">' + match + '</span>';
                if (cls == 'key') str = '<br>    ' + str;
                return str;
            });
            str = str.replace('}','<br>}');
            return str;
        }
        try {
            var systemInfo = systemDetect();
            if (document.referrer.indexOf(document.location.protocol + "//" + document.location.host) === -1){
                systemInfo.referrer = document.referrer; // show referrer only if origin is from other domains
            }
            document.getElementById("systemDetectResult").innerHTML = syntaxHighlight(systemInfo);
        } catch(err){
            console.log(err);
        }
    </script>
    <style>
        .key {
            color: black;
        }
        .string {
            color: green;
        }
        .number {
            color: red;
        }
        .boolean {
            color: brown;
        }
    </style>
</body>
</html>

Browser output…