// JavaScript Browser Sniffer // Eric Krok, Andy King, Michel Plungjan 010329 // see // http://www.webreference.com/ for more information // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // please send any improvements to aking@internet.com and we'll // roll the best ones in // // adapted from Netscape's Ultimate client-side JavaScript client sniff. // and andy's sniffer // Revised May 7 99 to add is.nav5up and is.ie5up (see below). (see below). // Revised June 11 99 to add addit props, checks // Revised June 23 99 added screen props - gecko m6 doesn't support yet - abk // converted to var is_ from is object to work everywhere // 990624 - added cookie forms links frames checks - abk // 001031 - ie4 mod 5.0 -> 5. (ie5.5 mididentified - abk) // is_ie4 mod tp work with ie6+ - abk // 001120 - ns6 released, document.layers false, put back in // - is_nav6 test added - abk // 001121 - ns6+ added, used document.getElementById, better test, dom-compl // 010117 - actual version for ie3-5.5 by Michel Plungjan // 010118 - actual version for ns6 by Michel Plungjan // 010217 - netscape 6/mz 6 ie5.5 onload defer bug docs - abk // // // Everything you always wanted to know about your JavaScript client // but were afraid to ask. Creates "is_" variables indicating: // (1) browser vendor: // is_nav, is_ie, is_opera // (2) browser version number: // is_major (integer indicating major version number: 2, 3, 4 ...) // is_minor (float indicating full version number: 2.02, 3.01, 4.04 ...) // (3) browser vendor AND major version number // is_nav2, is_nav3, is_nav4, is_nav4up, is_nav5, is_nav5up, is_ie3, is_ie4, is_ie4up // (4) JavaScript version number: // is_js (float indicating full JavaScript version number: 1, 1.1, 1.2 ...) // (5) OS platform and version: // is_win, is_win16, is_win32, is_win31, is_win95, is_winnt, is_win98 // is_os2 // is_mac, is_mac68k, is_macppc // is_unix // is_sun, is_sun4, is_sun5, is_suni86 // is_irix, is_irix5, is_irix6 // is_hpux, is_hpux9, is_hpux10 // is_aix, is_aix1, is_aix2, is_aix3, is_aix4 // is_linux, is_sco, is_unixware, is_mpras, is_reliant // is_dec, is_sinix, is_freebsd, is_bsd // is_vms // // See http://www.it97.de/JavaScript/JS_tutorial/bstat/navobj.html and // http://www.it97.de/JavaScript/JS_tutorial/bstat/Browseraol.html // for detailed lists of userAgent strings. // // Note: you don't want your Nav4 or IE4 code to "turn off" or // stop working when Nav5 and IE5 (or later) are released, so // in conditional code forks, use is_nav4up ("Nav4 or greater") // and is_ie4up ("IE4 or greater") instead of is_nav4 or is_ie4 // to check version in code which you want to work on future // versions. // // convert all characters to lowercase to simplify testing var agt=navigator.userAgent.toLowerCase(); var appVer = navigator.appVersion.toLowerCase(); // *** BROWSER VERSION *** var is_minor = parseFloat(appVer); var is_major = parseInt(is_minor); // Note: On IE, start of appVersion return 3 or 4 // which supposedly is the version of Netscape it is compatible with. // So we look for the real version further on in the string var iePos = appVer.indexOf('msie'); if (iePos !=-1) { is_minor = parseFloat(appVer.substring(iePos+5,appVer.indexOf(';',iePos))) is_major = parseInt(is_minor); } // Netscape6 is mozilla/5 + Netscape6/6.0!!! // Mozilla/5.0 (Windows; U; Win98; en-US; m18) Gecko/20001108 Netscape6/6.0 var nav6Pos = agt.indexOf('netscape6'); if (nav6Pos !=-1) { is_minor = parseFloat(agt.substring(nav6Pos+10)) is_major = parseInt(is_minor) } var is_getElementById = (document.getElementById) ? "true" : "false"; // 001121-abk var is_getElementsByTagName = (document.getElementsByTagName) ? "true" : "false"; // 001127-abk var is_documentElement = (document.documentElement) ? "true" : "false"; // 001121-abk var is_nav = ((agt.indexOf('mozilla')!=-1) && (agt.indexOf('spoofer')==-1) && (agt.indexOf('compatible') == -1) && (agt.indexOf('opera')==-1) && (agt.indexOf('webtv')==-1)); var is_nav2 = (is_nav && (is_major == 2)); var is_nav3 = (is_nav && (is_major == 3)); var is_nav4 = (is_nav && (is_major == 4)); var is_nav4up = (is_nav && (is_major >= 4)); var is_navonly = (is_nav && ((agt.indexOf(";nav") != -1) || (agt.indexOf("; nav") != -1)) ); /* var is_nav6 = (is_nav && (agt.indexOf('netscape6') != -1)); // new 001120 - abk var is_nav6up = (is_nav && is_getElementById); // new 001121 - abk */ var is_nav6 = (is_nav && is_major==6); // new 010118 mhp var is_nav6up = (is_nav && is_minor >= 6) // new 010118 mhp var is_nav5 = (is_nav && is_major == 5 && !is_nav6); // checked for ns6 var is_nav5up = (is_nav && is_minor >= 5); var is_ie = (iePos!=-1); var is_ie3 = (is_ie && (is_major < 4)); var is_ie4 = (is_ie && is_major == 4); var is_ie4up = (is_ie && is_minor >= 4); var is_ie5 = (is_ie && is_major == 5); var is_ie5up = (is_ie && is_minor >= 5); // KNOWN BUG: On AOL4, returns false if IE3 is embedded browser // or if this is the first browser window opened. Thus the // variables is_aol, is_aol3, and is_aol4 aren't 100% reliable. var is_aol = (agt.indexOf("aol") != -1); var is_aol3 = (is_aol && is_ie3); var is_aol4 = (is_aol && is_ie4); var is_opera = (agt.indexOf("opera") != -1); var is_webtv = (agt.indexOf("webtv") != -1); // *** JAVASCRIPT VERSION CHECK *** // Useful to workaround Nav3 bug in which Nav3 // loads