// JavaScript Browser Sniffer
//
// Taken for OLC by Wroolie 5 Jan 2004
//
// Eric Krok, Andy King, Michel Plungjan Jan. 31, 2002
// see http://www.webreference.com/ for more information and contact details
//
// This program is free software; and is 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.
//
// Code based in part on 
// http://www.mozilla.org/docs/web-developer/sniffer/browser_type.html
// The Ultimate JavaScript Client Sniffer
// and Andy King's object detection sniffer

// 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);

var is_opera=(agt.indexOf("opera") != -1);
var is_opera2=(agt.indexOf("opera 2") != -1 || agt.indexOf("opera/2") != -1);
var is_opera3=(agt.indexOf("opera 3") != -1 || agt.indexOf("opera/3") != -1);
var is_opera4=(agt.indexOf("opera 4") != -1 || agt.indexOf("opera/4") != -1);
var is_opera5=(agt.indexOf("opera 5") != -1 || agt.indexOf("opera/5") != -1);
var is_opera6=(agt.indexOf("opera 6") != -1 || agt.indexOf("opera/6") != -1); // new 020128- abk
var is_opera7=(agt.indexOf("opera 7") != -1 || agt.indexOf("opera/7") != -1); // new 021205- dmr
var is_opera5up=(is_opera && !is_opera2 && !is_opera3 && !is_opera4);
var is_opera6up=(is_opera && !is_opera2 && !is_opera3 && !is_opera4 && !is_opera5); // new020128
var is_opera7up=(is_opera && !is_opera2 && !is_opera3 && !is_opera4 && !is_opera5 && !is_opera6); // new021205 -- dmr

// 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))); //added missing ; - 030617 - bdn
is_major=parseInt(is_minor);}

// ditto Konqueror

var is_konq=false;
var kqPos=agt.indexOf('konqueror');
if (kqPos !=-1){is_konq=true;
is_minor=parseFloat(agt.substring(kqPos+10,agt.indexOf(';',kqPos)));
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_safari=((agt.indexOf('safari')!=-1)&&(agt.indexOf('mac')!=-1))?true:false;
var is_khtml=(is_safari || is_konq);

var is_gecko=((!is_khtml)&&(navigator.product)&&(navigator.product.toLowerCase()=="gecko"))?true:false;
var is_gver=0;
if (is_gecko) is_gver=navigator.productSub;

var is_moz=((agt.indexOf('mozilla/5')!=-1) && (agt.indexOf('spoofer')==-1) && (agt.indexOf('compatible')==-1) && (agt.indexOf('opera')==-1) && (agt.indexOf('webtv')==-1) && (agt.indexOf('hotjava')==-1) && (is_gecko) && ((navigator.vendor=="")||(navigator.vendor=="Mozilla")));

if (is_moz){ var is_moz_ver=(navigator.vendorSub)?navigator.vendorSub:0;
if(!(is_moz_ver)){ is_moz_ver=agt.indexOf('rv:'); is_moz_ver=agt.substring(is_moz_ver+3);
is_paren=is_moz_ver.indexOf(')'); is_moz_ver=is_moz_ver.substring(0,is_paren);
}
is_minor=is_moz_ver; is_major=parseInt(is_moz_ver);
}

var is_nav=((agt.indexOf('mozilla')!=-1) && (agt.indexOf('spoofer')==-1) && (agt.indexOf('compatible') == -1) && (agt.indexOf('opera')==-1) && (agt.indexOf('webtv')==-1) && (agt.indexOf('hotjava')==-1) && (!is_khtml) && (!(is_moz)));

// Netscape6 is mozilla/5 + Netscape6/6.0!!!
// Mozilla/5.0 (Windows; U; Win98; en-US; m18) Gecko/20001108 Netscape6/6.0
// Changed this to use navigator.vendor/vendorSub - dmr 060502   
// var nav6Pos = agt.indexOf('netscape6');
// if (nav6Pos !=-1){
if ((navigator.vendor)&&((navigator.vendor=="Netscape6")||(navigator.vendor=="Netscape"))&&
(is_nav)){
is_major=parseInt(navigator.vendorSub);
// here we need is_minor as a valid float for testing. We'll
// revert to the actual content before printing the result. 
is_minor=parseFloat(navigator.vendorSub);
}

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_minor>=4);  // changed to is_minor for
                                        // consistency - dmr, 011001
var is_navonly=(is_nav && ((agt.indexOf(";nav") != -1) || (agt.indexOf("; nav") != -1)) );

var is_nav6=(is_nav&&is_major==6); // new 010118 mhp
var is_nav6up=(is_nav&&is_minor>=6); // new 010118 mhp, added missing ; - 030617 - bdn
var is_nav5=(is_nav&&is_major==5 && !is_nav6); // checked for ns6
var is_nav5up=(is_nav&&is_minor>=5);
var is_nav7=(is_nav&&is_major==7);var is_nav7up=(is_nav&&is_minor>=7);

var is_ie=((iePos!=-1) && (!is_opera) && (!is_khtml));
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);
var is_ie5_5=(is_ie && (agt.indexOf("msie 5.5") !=-1)); // 020128 new - abk
var is_ie5_5up=(is_ie && is_minor >= 5.5); // 020128 new - abk
var is_ie6=(is_ie&&is_major==6); var is_ie6up=(is_ie&&is_minor>=6);
var is_ie7=(is_ie&&is_major==7); var is_ie7up=(is_ie&&is_minor>=7);
var is_ie8=(is_ie&&is_major==8); var is_ie8up=(is_ie&&is_minor>=8);
var is_ie9=(is_ie&&is_major==9); var is_ie9up=(is_ie&&is_minor>=9);

// 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_aol5=(agt.indexOf("aol 5") != -1);
var is_aol6=(agt.indexOf("aol 6") != -1);
var is_aol7=((agt.indexOf("aol 7")!=-1) || (agt.indexOf("aol7")!=-1));
var is_aol8=((agt.indexOf("aol 8")!=-1) || (agt.indexOf("aol8")!=-1));

var is_webtv = (agt.indexOf("webtv") != -1);
    
// new 020128 - abk
    
var is_TVNavigator=((agt.indexOf("navio") != -1) || (agt.indexOf("navio_aoltv") != -1)); 
var is_AOLTV=is_TVNavigator;

var is_hotjava = (agt.indexOf("hotjava") != -1);
var is_hotjava3 = (is_hotjava && (is_major == 3));
var is_hotjava3up = (is_hotjava && (is_major >= 3));

// end new
	
// *** JAVASCRIPT VERSION CHECK ***
// Useful to workaround Nav3 bug in which Nav3
// loads <SCRIPT LANGUAGE="JavaScript1.2">.
// updated 020131 by dragle
var is_js;
if (is_nav2 || is_ie3) is_js=1.0;
else if (is_nav3) is_js=1.1;
else if ((is_opera5)||(is_opera6)) is_js=1.3; // 020214 - dmr
else if (is_opera7up) is_js=1.5; // 031010 - dmr
else if (is_khtml) is_js=1.5; // 030110 - dmr
else if (is_opera) is_js=1.1;
else if ((is_nav4 && (is_minor<=4.05)) || is_ie4) is_js=1.2;
else if ((is_nav4 && (is_minor>4.05)) || is_ie5) is_js=1.3;
else if (is_nav5 && !(is_nav6)) is_js=1.4;
else if (is_hotjava3up) is_js=1.4; // new 020128 - abk
else if (is_nav6up) is_js=1.5;

// NOTE: In the future, update this code when newer versions of JS
// are released. For now, we try to provide some upward compatibility
// so that future versions of Nav and IE will show they are at
// *least* JS 1.x capable. Always check for JS version compatibility
// with > or >=.

else if (is_nav && (is_major > 5)) is_js=1.4;
else if (is_ie && (is_major > 5)) is_js=1.3;
else if (is_moz) is_js=1.5;

// what about ie6 and ie6up for js version? abk

// HACK: no idea for other browsers; always check for JS version 
// with > or >=
else is_js=0.0;
// HACK FOR IE5 MAC = js vers = 1.4 (if put inside if/else jumps out at 1.3)
if ((agt.indexOf("mac")!=-1) && is_ie5up) is_js=1.4; // 020128 - abk

// Done with is_minor testing; revert to real for N6/7
if (is_nav6up) is_minor=navigator.vendorSub; // 030617 - removed unneccessary {} - bdn

// *** PLATFORM ***
var is_win = ((agt.indexOf("win")!=-1) || (agt.indexOf("16bit")!=-1));
// NOTE: On Opera 3.0, the userAgent string includes "Windows 95/NT4" on all
//  Win32, so you can't distinguish between Win95 and WinNT.
var is_win95 = ((agt.indexOf("win95")!=-1) || (agt.indexOf("windows 95")!=-1));

// is this a 16 bit compiled version?
var is_win16 = ((agt.indexOf("win16")!=-1) || (agt.indexOf("16bit")!=-1) || (agt.indexOf("windows 3.1")!=-1) || (agt.indexOf("windows 16-bit")!=-1) );

var is_win31=((agt.indexOf("windows 3.1")!=-1) || (agt.indexOf("win16")!=-1) || (agt.indexOf("windows 16-bit")!=-1));
var is_winme=((agt.indexOf("win 9x 4.90")!=-1)); // new 020128 - abk
var is_win2k=((agt.indexOf("windows nt 5.0")!=-1) || (agt.indexOf("windows 2000")!=-1)); // 020214 - dmr
var is_winxp=((agt.indexOf("windows nt 5.1")!=-1) || (agt.indexOf("windows xp")!=-1)); // 020214 - dmr

var is_winvista = ((agt.indexOf("windows nt 5.1")!=-1) || (agt.indexOf("windows vista")!=-1)); // 081008

// NOTE: Reliable detection of Win98 may not be possible. It appears that:
//  - On Nav 4.x and before you'll get plain "Windows" in userAgent.
//  - On Mercury client, the 32-bit version will return "Win98", but
//    the 16-bit version running on Win98 will still return "Win95".
var is_win98 = ((agt.indexOf("win98")!=-1) || (agt.indexOf("windows 98")!=-1));
var is_winnt = ((agt.indexOf("winnt")!=-1) || (agt.indexOf("windows nt")!=-1));
var is_win32 = (is_win95||is_winnt||is_win98||
((is_major >= 4)&&(navigator.platform == "Win32")) ||
(agt.indexOf("win32")!=-1)||(agt.indexOf("32bit")!=-1));

var is_os2= ((agt.indexOf("os/2")!=-1) || (navigator.appVersion.indexOf("OS/2")!=-1) || (agt.indexOf("ibm-webexplorer")!=-1));

var is_mac= (agt.indexOf("mac")!=-1);
if (is_mac){is_win = !is_mac;} // dmr - 06/20/2002
var is_mac68k= (is_mac && ((agt.indexOf("68k")!=-1) || (agt.indexOf("68000")!=-1)));
var is_macppc= (is_mac && ((agt.indexOf("ppc")!=-1) || (agt.indexOf("powerpc")!=-1)));

var is_sun=(agt.indexOf("sunos")!=-1);
var is_sun4=(agt.indexOf("sunos 4")!=-1);
var is_sun5=(agt.indexOf("sunos 5")!=-1);
var is_suni86=(is_sun && (agt.indexOf("i86")!=-1));
var is_irix=(agt.indexOf("irix") !=-1);    // SGI
var is_irix5=(agt.indexOf("irix 5") !=-1);
var is_irix6=((agt.indexOf("irix 6") !=-1) || (agt.indexOf("irix6") !=-1));
var is_hpux=(agt.indexOf("hp-ux")!=-1);
var is_hpux9=(is_hpux && (agt.indexOf("09.")!=-1));
var is_hpux10=(is_hpux && (agt.indexOf("10.")!=-1));
var is_aix=(agt.indexOf("aix") !=-1);      // IBM
var is_aix1=(agt.indexOf("aix 1") !=-1);
var is_aix2=(agt.indexOf("aix 2") !=-1);
var is_aix3=(agt.indexOf("aix 3") !=-1);
var is_aix4=(agt.indexOf("aix 4") !=-1);
var is_linux=(agt.indexOf("inux")!=-1);
var is_sco=((agt.indexOf("sco")!=-1) || (agt.indexOf("unix_sv")!=-1));
var is_unixware=(agt.indexOf("unix_system_v")!=-1);
var is_mpras=(agt.indexOf("ncr")!=-1);
var is_reliant=(agt.indexOf("reliantunix")!=-1);

var is_dec= ((agt.indexOf("dec")!=-1) || (agt.indexOf("osf1")!=-1) || (agt.indexOf("dec_alpha")!=-1) || (agt.indexOf("alphaserver")!=-1) ||(agt.indexOf("ultrix")!=-1) || (agt.indexOf("alphastation")!=-1));

var is_sinix = (agt.indexOf("sinix")!=-1);
var is_freebsd = (agt.indexOf("freebsd")!=-1);
var is_bsd = (agt.indexOf("bsd")!=-1);

var is_unix=((agt.indexOf("x11")!=-1) || is_sun || is_irix || is_hpux || is_sco ||is_unixware || is_mpras || is_reliant || is_dec || is_sinix || is_aix || is_linux || is_bsd || is_freebsd);

var is_vms   = ((agt.indexOf("vax")!=-1) || (agt.indexOf("openvms")!=-1));
// additional checks, abk
var is_anchors = (document.anchors) ? "true":"false";
var is_regexp = (window.RegExp) ? "true":"false";
var is_option = (window.Option) ? "true":"false";
var is_all = (document.all) ? "true":"false";
// cookies - 990624 - abk
document.cookie = "cookies=true";
var is_cookie = (document.cookie) ? "true" : "false";
var is_images = (document.images) ? "true":"false";
var is_layers = (document.layers) ? "true":"false"; // gecko m7 bug?
// new doc obj tests 990624-abk
var is_forms = (document.forms) ? "true" : "false";
var is_links = (document.links) ? "true" : "false";
var is_frames = (window.frames) ? "true" : "false";
var is_screen = (window.screen) ? "true" : "false";

// java
var is_java = (navigator.javaEnabled());

// Flash checking code adapted from Doc JavaScript information; 
// see http://webref.com/js/column84/2.html

var is_Flash=false; var is_FlashVersion=0;

if ((is_nav||is_opera||is_moz)||(is_mac&&is_ie5up)) {  //030617 - bdn - put on one line, makes easier to follow flow
var plugin = (navigator.mimeTypes && navigator.mimeTypes["application/x-shockwave-flash"] &&
navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin) ?
navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin : 0;
if (plugin){is_Flash=true;
is_FlashVersion=parseInt(plugin.description.substring(plugin.description.indexOf(".")-1));
}
}

 if (is_win&&is_ie4up)
 {
 document.write(
 '<scr' + 'ipt language=VBScript>' + '\n' +
 'Dim hasPlayer, playerversion' + '\n' +
 'hasPlayer = false' + '\n' +
 'playerversion = 10' + '\n' +
 'Do While playerversion > 0' + '\n' +
 'On Error Resume Next' + '\n' +
 'hasPlayer = (IsObject(CreateObject("ShockwaveFlash.ShockwaveFlash." & playerversion)))' + '\n' +
 'If hasPlayer = true Then Exit Do' + '\n' +
 'playerversion = playerversion - 1' + '\n' +
 'Loop' + '\n' +
  'is_FlashVersion = playerversion' + '\n' +
  'is_Flash = hasPlayer' + '\n' +
  '<\/sc' + 'ript>'
  );
}

// Windows Media Player checking code adapted from
// eMedia Communications Strategies information and Microsoft documentation 
// see http://www.emediacommunications.biz/sm5/articlesm5.html
// and http://support.microsoft.com/default.aspx?scid=kb;en-us;279022
//
//Note: Windows Media Player version 7+ ships with the old 6.4
// control as well as the newest version.  For this reason,
// is_WMP64 will remain true even if is_WMP7up is set to true.

var is_WMP=false; var is_WMP64=false; var is_WMP7up=false;

if (is_win&&is_ie4up)  //use ActiveX test
{
var objMediaPlayer;

try {
objMediaPlayer = new ActiveXObject("MediaPlayer.MediaPlayer.1");
is_WMP=true; is_WMP64=true;
}
catch(objError){is_WMP=false;is_WMP64=false;}

if (is_WMP){
try {objMediaPlayer=new ActiveXObject("WMPlayer.OCX");is_WMP7up=true;}

catch(objError){is_WMP7up=false;}
}
}
else { //use plugin test (this not tested yet)
var numPlugins=navigator.plugins.length;

for (var i=0; i < numPlugins; i++){
if (navigator.plugins[i].name.substring(0,20)=="Windows Media Player"){
is_WMP=true; is_WMP64=true;
}
}
}

var WMPVer;

if (is_WMP7up){WMPVer=objMediaPlayer.versionInfo;objMediaPlayer=null;} else WMPVer="6.4";

var is_WMPMinor=parseFloat(WMPVer); var is_WMPMajor=parseInt(is_WMPMinor);

var is_WMP7=(is_WMPMinor==7.0); var is_WMP71=(is_WMPMinor==7.1);
var is_WMP8=(is_WMPMajor==8);  var is_WMP9=(is_WMPMajor==9);
var is_WMP71up=(is_WMPMinor>=7.1); var is_WMP8up=(is_WMPMinor>=8);
var is_WMP9up=(is_WMPMinor>=9);

//Very generic functions added below by Wroolie for the OLC
//Project.  These just take the variables above and deliver
//the data in the format I want it in. 5 Jan 2005.

function getPlatform(){
//function added by wroolie 4 January 2004
var sRet="";

if (is_win95){sRet="Windows 95";}  if (is_win31){sRet="Windows 3.11";}
if (is_win98){sRet="Windows 98";}  if (is_winme){sRet="Windows ME";}
if (is_winnt){sRet="Windows NT";}  if (is_win2k){sRet="Windows 2000";}
if (is_winxp){sRet="Windows XP";}
   
if (is_mac){sRet="Mac";}   if (is_mac68k){sRet="Mac 86K";}
if (is_macppc){sRet="Mac PowerPC";}   if (is_sun){sRet="Sun";}
if (is_os2){sRet="OS2";}   if (is_sun4){sRet="Sun 4";}
if (is_sun5){sRet="Sun 5";}   if (is_suni86){sRet="Sun i86";}
if (is_irix){sRet="Irix";}   if (is_irix5){sRet="Irix 5";}
if (is_irix6){sRet="Irix 6";}   if (is_hpux){sRet="HPUX";}
if (is_hpux9){sRet="HPUX 9";}   if (is_hpux10){sRet="HPUX 10";}
if (is_aix){sRet="AIX";}   if (is_aix1){sRet="AIX 1";}
if (is_aix2){sRet="AIX 2";}   if (is_aix3){sRet="AIX 3";}
if (is_aix4){sRet="AIX 4";}   if (is_linux){sRet="Linux";}
if (is_sco){sRet="SCO";}   if (is_unixware){sRet="Unixware";}
if (is_mpras){sRet="MPRAS";}   if (is_reliant){sRet="Reliant Unix";}
if (is_sinix){sRet="Sinix";}   if (is_freebsd){sRet="FreeBSD";}
if (is_vms){sRet="Open VMS";}   if (sRet==""){sRet="Unknown";}

return sRet;}

function getBrowser(){var sRet="";
	
if (is_ie){
if (is_ie3){sRet="Internet Explorer 3";}  if (is_ie4){sRet="Internet Explorer 4";}
if (is_ie5){sRet="Internet Explorer 5";}  if (is_ie5_5){sRet="Internet Explorer 5.5";}
if (is_ie6){sRet="Internet Explorer 6";}  if (sRet==""){sRet="Internet Explorer";}
} else {sRet="Unsupported Browser";}  return sRet;}

function getWMP(){sRet=""; if (is_WMP){sRet="Windows Media Player "+is_WMPMajor;} else {sRet="No Windows Media Player";} return sRet;}

function getFlash(){var sRet=""; if (is_Flash){sRet="Flash "+is_FlashVersion;} else {sRet="No Flash";} return sRet;}

