/* *******************************************************************
** EVEREST.JS - User Info Detection Library
** ========================================
** This "EVERything you always wanted to know about your user
** and weren't afraid to requEST" library contains JS code to
** detect salient info re: a user's browser, version, platform,
** screen resolution, local time/date, etc. You may use/modify 
** the library as long as you faithfully maintain this header!
**
** Many thanks to Netscape's Ultimate JavaScript Client Sniffer,
** Version 3.0 (developer.netscape.com:80/docs/examples/
** javascript/browser_type.html), whose code I've respectfully
** incorporated into Everest.js.
**
** I need *your* help keeping Everest.js up-to-date and bug-free!
** Please report any errors you discover to devhead@zd.com.
**
** Author      Ver  Date    Comments
** ======      ===  ====    ========
** Rick Scott  1.0  7/1/99  First release
**
** Copyright 1999, Rick Scott, all rights reserved.
******************************************************************* */

/* *******************************************************************
** EVEREST.JS Usage
** ================
** To load this JS library file in an HTML doc, insert this line
** in the doc HEAD:
**
** <SCRIPT SRC="Everest.js" LANGUAGE="JavaScript"></SCRIPT>
**
** Once Everest.js has been loaded, the following global 
** properties and variables will be available for you to read
** (IS_OTHER_VARs (e.g., IS_OTHER_CODENAME) have non-blank values;
**  IS_NA_VARs (e.g., IS_NA_CODENAME) are blank/null/undefined):
**
**   user.appCodeName - browser code name
**     IS_MOZILLA, IS_OTHER_CODENAME, IS_NA_CODENAME
**   user.appName - browser application name
**     IS_NETSCAPE, IS_IE, IS_OPERA, IS_OTHER_APPNAME, IS_NA_APPNAME
**   user.appVersion - browser version
**     IS_V1, IS_V2, IS_V3, IS_V4, IS_V4UP, IS_V5, IS_V5UP, 
**     IS_OTHER_APPVERSION, IS_NA_APPVERSION
**   user.platform - browser platform (OS)
**     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 
**     IS_OTHER_PLATFORM, IS_NA_PLATFORM
**   user.cookiesEnabled - are browser cookies enabled?
**     IS_COOKIESENABLED
**   user.javaEnabled - is browser Java enabled?
**     IS_JAVAENABLED
**   user.taintEnabled - is browser data-tainting enabled?
**     IS_TAINTENABLED
**   user.numFrames - num frames in user's page
**     IS_INFRAME
**   user.numHistoryURLs - num URLs in user's history
**   user.availHeight - available height (in pixels) of user's screen
**   user.availWidth - available width (pixels) of user's screen
**   user.height - total height of user's screen
**   user.width - total width of user's screen
**   user.colorDepth - color bit depth of browser (8, 16, 24, etc.)
**     IS_8BITCOLOR, IS_16BITCOLOR, IS_24BITCOLOR, IS_32BITCOLOR,
**     IS_OTHER_COLORDEPTH, IS_NA_COLORDEPTH
**     bit depth   num colors
**     ---------   ----------
**     8           256
**     16          65,536
**     24          16,777,216
**   user.referrer - URL of HTML doc from which this page was accessed
**   user.year - user's current year
**   user.month - user's current month
**   user.date - user's current date (day number)
**   user.time - user's current time (hh:mm:ss)
**   user.timezoneOffset - user's num mins time-zone offset from GMT
**   user.jsVersion - JS version
**     IS_JS11, IS_JS12, IS_JS13, IS_JS14, IS_JS15, 
**     IS_OTHER_JSVERSION, IS_NA_JSVERSION
**
******************************************************************* */

/* **************************************************************** */
/* UserInfo object constructor function                             */
/* **************************************************************** */

var NA = null;  // Not Available value

function UserInfo()  // new UserInfo() instantiates a UserInfo object
  {
  this.appCodeName = NA;     // set all these to NA (Not Available)
  this.appName = NA;         // so that the client browser will not
  this.appVersion = NA;      // display an error message (or crash!)
  this.platform = NA;        // if it doesn't support them
  this.cookiesEnabled = NA;
  this.javaEnabled = NA;
  this.taintEnabled = NA;
  this.numFrames = NA;
  this.numHistoryURLs = NA;
  this.availHeight = NA;
  this.availWidth = NA;
  this.height = NA;
  this.width = NA;
  this.colorDepth = NA;
  this.referrer  = NA;
  this.year = NA;
  this.month = NA;
  this.date = NA;
  this.time = NA;
  this.timezoneOffset  = NA;
  this.jsVersion = NA;

  /* Navigator object properties ************************************/

  if (top.navigator.appCodeName != null)  // get browser code name
    this.appCodeName = navigator.appCodeName;

  if (top.navigator.appName != null)  // get browser app name
    {
    if (navigator.userAgent.indexOf("Opera") != -1)
      this.appName = "Opera";
    else
      this.appName = navigator.appName;
    }

  if (top.navigator.appVersion != null)  // get browser version number
    {
    this.appVersion = navigator.appVersion;
    var index = this.appVersion.indexOf(" ");
    this.appVersion = this.appVersion.substring(0,index);
    if (this.appName.indexOf("Internet") != -1) // fix for IE 5.0 appVersion bug
      {                                         // (returns 4.0 version number)
      if (top.navigator.userAgent.indexOf("5.0") != -1)
        this.appVersion = "5.0";
      }
    }

  if (top.navigator.platform != null)  // get browser platform
    {
    this.platform = navigator.platform;
    }
  else  // get platform for browsers that don't support navigator.platform
    {
    var startindex = navigator.appVersion.indexOf("(") + 1;
    var endindex = navigator.appVersion.indexOf(";");
    this.platform = navigator.appVersion.substring(startindex,endindex);
    }

  if (top.navigator.javaEnabled() != null)  // get browser platform
    this.javaEnabled = navigator.javaEnabled();

  if (top.navigator.taintEnabled() != null)  // get browser platform
      this.taintEnabled = navigator.taintEnabled();

  /* Window object properties ***************************************/

  if (top.length != null)  // num frames in user's page
    this.numFrames = top.length;

  if (top.history.length != null)  // num URLS in history
    this.numHistoryURLs = top.window.history.length

  /* Screen object properties ***************************************/

  if (top.screen != null)  // get various screen properties
    {
    this.availHeight = screen.availHeight;  // avail height (px) of user's screen
    this.availWidth = screen.availWidth;  // avail width of user's screen
    this.colorDepth = screen.colorDepth;  // color bit depth of browser
    this.height = screen.height;  // total height of user's screen
    this.width = screen.width;  // total width of user's screen
    }

  /* Document object properties *************************************/

  // this.referrer is URL of HTML doc from which this page was accessed
  if (top.document.referrer != null)
    this.referrer = document.referrer;

  if (document.cookie != null)
    {
    document.cookie = "name=value";  // cookies enabled?
    if (document.cookie == "")
      this.cookiesEnabled = false;
    else
      this.cookiesEnabled = true;
    }

  /* Date object properties *****************************************/

  var today = new Date();  // get user's current date/time settings

  this.year = today.getYear();
  if (this.year < 1900)
    this.year += 1900;  // we want a four-digit year

  this.month = today.getMonth();

  this.date = today.getDate();

  this.time = today.getHours() + ":" +
              today.getMinutes() + ":" +
              today.getSeconds();

  if (today.getTimezoneOffset() != null)  // get user's num mins GMT timezone offset
    this.timezoneOffset = today.getTimezoneOffset();
  }

/* **************************************************************** */
/* instantiate UserInfo object for current user                     */
/* **************************************************************** */

var user = new UserInfo();  // create user Object for current user

/* **************************************************************** */
/* set a ton of global IS_ Everest variables                        */
/* **************************************************************** */

var IS_MOZILLA = NA;  // begin by setting all IS_ vars to NA
var IS_OTHER_CODENAME = NA;
var IS_NA_CODENAME = NA;
var IS_NETSCAPE = NA;
var IS_IE = NA;
var IS_OPERA = NA;
var IS_OTHER_APPNAME = NA;
var IS_NA_APPNAME = NA;
var IS_V1 = NA;
var IS_V2 = NA;
var IS_V3 = NA;
var IS_V4 = NA;
var IS_V4UP = NA;
var IS_V5 = NA;
var IS_V5UP = NA;
var IS_OTHER_APPVERSION = NA;
var IS_NA_APPVERSION = NA;
var IS_WIN = NA;
var IS_WIN16 = NA;
var IS_WIN32 = NA;
var IS_WIN31 = NA;
var IS_WIN95 = NA;
var IS_WINNT = NA;
var IS_WIN98  = NA;
var IS_OS2  = NA;
var IS_MAC = NA;
var IS_MAC68K = NA;
var IS_MACPPC  = NA;
var IS_UNIX  = NA;
var IS_SUN = NA;
var IS_SUN4 = NA;
var IS_SUN5 = NA;
var IS_SUNI86  = NA;
var IS_IRIX = NA;
var IS_IRIX5 = NA;
var IS_IRIX6  = NA;
var IS_HPUX = NA;
var IS_HPUX9 = NA;
var IS_HPUX10  = NA;
var IS_AIX = NA;
var IS_AIX1 = NA;
var IS_AIX2 = NA;
var IS_AIX3 = NA;
var IS_AIX4  = NA;
var IS_LINUX = NA;
var IS_SCO = NA;
var IS_UNIXWARE = NA;
var IS_MPRAS = NA;
var IS_RELIANT  = NA;
var IS_DEC = NA;
var IS_SINIX = NA;
var IS_FREEBSD = NA;
var IS_BSD = NA;
var IS_VMS = NA;
var IS_OTHER_PLATFORM = NA;
var IS_NA_PLATFORM = NA;
var IS_COOKIESENABLED = NA;
var IS_JAVAENABLED = NA;
var IS_TAINTENABLED = NA;
var IS_INFRAME = NA;
var IS_8BITCOLOR = NA;
var IS_16BITCOLOR = NA;
var IS_24BITCOLOR = NA;
var IS_32BITCOLOR = NA;
var IS_OTHER_COLORDEPTH = NA;
var IS_NA_COLORDEPTH = NA;
var IS_JS11 = NA;
var IS_JS12 = NA;
var IS_JS13 = NA;
var IS_JS14 = NA;
var IS_JS15 = NA;
var IS_OTHER_JSVERSION = NA;
var IS_NA_JSVERSION = NA;

// browser code name
IS_MOZILLA = (user.appCodeName.toLowerCase().indexOf("mozilla") != -1);
IS_NA_CODENAME = (user.appCodeName == NA);
IS_OTHER_CODENAME = (!IS_MOZILLA && !IS_NA_CODENAME);

// browser app (vendor)
IS_NETSCAPE = (user.appName.toLowerCase().indexOf("netscape") != -1);
IS_IE = (user.appName.toLowerCase().indexOf("internet") != -1);
IS_OPERA = (user.appName.toLowerCase() == "opera");
IS_NA_APPNAME = (user.appName == NA);
IS_OTHER_APPNAME = (!IS_NETSCAPE && !IS_IE && !IS_OPERA && !IS_NA_APPNAME);

// browser version
if (user.appVersion != NA)  // don't try to parseInt a string (NA = "")
  {
  IS_V1 = (parseInt(user.appVersion) == 1)
  IS_V2 = (parseInt(user.appVersion) == 2)
  IS_V3 = (parseInt(user.appVersion) == 3)
  IS_V4 = (parseInt(user.appVersion) == 4)
  IS_V4UP = (parseInt(user.appVersion) >= 4)
  IS_V5 = (parseInt(user.appVersion) == 5)
  IS_V5UP = (parseInt(user.appVersion) >= 5)
  if (IS_IE)  // fix for IE 5.0 appVersion bug (returns 4.0 version number)
    {
    if (top.navigator.userAgent.indexOf("5.0") != -1)
      {
      IS_V4 = false;
      IS_V4UP = false;
      IS_V5 = true;
      IS_V5UP = true;
      }
    }
  }
IS_NA_APPVERSION = (user.appVersion == NA);
IS_OTHER_APPVERSION = (!IS_V1 && !IS_V2 && !IS_V3 && !IS_V4 && !IS_V5 &&
                           !IS_NA_APPVERSION);

// user OS/platform
if (top.navigator.userAgent && top.navigator.appVersion)
  {
  agt = navigator.userAgent.toLowerCase();  // abbreviation
  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.
  IS_WIN95 = ((agt.indexOf("win95") != -1) || (agt.indexOf("windows 95") != -1) ||
              (user.platform.toLowerCase() == "win95"));
  // is this a 16 bit compiled version?
  IS_WIN16 = ((agt.indexOf("win16") != -1) || (agt.indexOf("16bit") != -1) || 
                  (agt.indexOf("windows 3.1") != -1) || (agt.indexOf("windows 16-bit") != -1));  
  IS_WIN31 = ((agt.indexOf("windows 3.1") != -1) || (agt.indexOf("win16") != -1) ||
                  (agt.indexOf("windows 16-bit") != -1));
  // 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".
  IS_WIN98 = ((agt.indexOf("win98") != -1) || (agt.indexOf("windows 98") != -1));
  IS_WINNT = ((agt.indexOf("winnt") != -1) || (agt.indexOf("windows nt") != -1));
  IS_WIN32 = (IS_WIN95 || IS_WINNT || IS_WIN98 || 
                  ((user.appVersion >= 4) && (navigator.platform == "Win32")) ||
                  (agt.indexOf("win32") != -1) || (agt.indexOf("32bit") != -1));
  IS_OS2 = ((agt.indexOf("os/2") != -1) || 
                (navigator.appVersion.indexOf("OS/2") != -1) ||   
                (agt.indexOf("ibm-webexplorer") != -1));
  IS_MAC    = (agt.indexOf("mac") != -1);
  IS_MAC68K = (IS_MAC && ((agt.indexOf("68k") != -1) || 
                              (agt.indexOf("68000") != -1)));
  IS_MACPPC = (IS_MAC && ((agt.indexOf("ppc") != -1) || 
                              (agt.indexOf("powerpc") != -1)));
  IS_SUN    = (agt.indexOf("sunos") != -1);
  IS_SUN4   = (agt.indexOf("sunos 4") != -1);
  IS_SUN5   = (agt.indexOf("sunos 5") != -1);
  IS_SUNI86 = (IS_SUN && (agt.indexOf("i86") != -1));
  IS_IRIX   = (agt.indexOf("irix") !=-1);    // SGI
  IS_IRIX5  = (agt.indexOf("irix 5") !=-1);
  IS_IRIX6  = ((agt.indexOf("irix 6") !=-1) || (agt.indexOf("irix6") !=-1));
  IS_HPUX   = (agt.indexOf("hp-ux") != -1);
  IS_HPUX9  = (IS_HPUX && (agt.indexOf("09.") != -1));
  IS_HPUX10 = (IS_HPUX && (agt.indexOf("10.") != -1));
  IS_AIX    = (agt.indexOf("aix") !=-1);      // IBM
  IS_AIX1   = (agt.indexOf("aix 1") !=-1);    
  IS_AIX2   = (agt.indexOf("aix 2") !=-1);    
  IS_AIX3   = (agt.indexOf("aix 3") !=-1);    
  IS_AIX4   = (agt.indexOf("aix 4") !=-1);    
  IS_LINUX  = (agt.indexOf("inux") != -1);
  IS_SCO    = (agt.indexOf("sco") != -1) || (agt.indexOf("unix_sv") != -1);
  IS_UNIXWARE = (agt.indexOf("unix_system_v") != -1); 
  IS_MPRAS    = (agt.indexOf("ncr") != -1); 
  IS_RELIANT  = (agt.indexOf("reliantunix") != -1);
  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)); 
  IS_SINIX = (agt.indexOf("sinix") != -1);
  IS_FREEBSD = (agt.indexOf("freebsd") != -1);
  IS_BSD = (agt.indexOf("bsd") != -1);
  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);
  IS_VMS   = ((agt.indexOf("vax") != -1) || (agt.indexOf("openvms") != -1));
  IS_NA_PLATFORM = (agt == "" || agt == null); 
  IS_OTHER_PLATFORM = (!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 && !IS_NA_PLATFORM)
  }

// misc enabled vars
if (user.cookiesEnabled != NA)
  IS_COOKIESENABLED = user.cookiesEnabled;
if (user.javaEnabled != NA)
  IS_JAVAENABLED = user.javaEnabled;
if (user.taintEnabled != NA)
  IS_TAINTENABLED = user.taintEnabled;

// did user open this HTML doc in a frame?
if (user.numFrames != NA)
  IS_INFRAME = (user.numFrames != 0);

// color bit depth
if (user.colorDepth != NA)
  {
  IS_8BITCOLOR = (user.colorDepth == 8);
  IS_16BITCOLOR = (user.colorDepth == 16);
  IS_24BITCOLOR = (user.colorDepth == 24);
  IS_32BITCOLOR = (user.colorDepth == 32);
  }
  IS_NA_COLORDEPTH = (user.colorDepth == NA);
  IS_OTHER_COLORDEPTH = (!IS_8BITCOLOR && !IS_16BITCOLOR && !IS_24BITCOLOR && 
                         !IS_32BITCOLOR && !IS_NA_COLORDEPTH)

/* **************************************************************** */
/* now that we've assigned values to all the above global vars,     */
/* we can add jsVersion to our set of UserObject properties         */
/* **************************************************************** */

user.jsVersion = get_jsVersion();  // JS version

function get_jsVersion()  // get the user's JS version
  {
  if ((IS_NETSCAPE && IS_V2) || (IS_IE && IS_V3))
    return 1.0;
  else if ((IS_NETSCAPE && IS_V3) || (IS_OPERA)) 
    return 1.1;
  else if (((IS_NETSCAPE && IS_V4) && (user.appVersion <= 4.05)) 
             || (IS_IE && IS_V4)) 
    return 1.2;
  else if (((IS_NETSCAPE && IS_V4) && (user.appVersion > 4.05))
             || (IS_IE && IS_V5))
    return 1.3;
  else if (IS_NETSCAPE && IS_V5)
    return 1.4;
  // 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_NETSCAPE && (user.appVersion > 5))
    return 1.4;
  else if (IS_IE && (user.appVersion > 5))
    return 1.3;
  // HACK: no idea for other browsers; always check for JS version with > or >= 
  else 
    return NA;   
  }

/* **************************************************************** */
/* now we can finish up the global Everest variables ************** */
/* **************************************************************** */

// JS version
IS_JS11 = (user.jsVersion == 1.1);
IS_JS12 = (user.jsVersion == 1.2);
IS_JS13 = (user.jsVersion == 1.3);
IS_JS14 = (user.jsVersion == 1.4);
IS_JS15 = (user.jsVersion == 1.5);
IS_NA_JSVERSION = (user.jsVersion == NA);
IS_OTHER_JSVERSION = (!IS_JS11 && !IS_JS12 && !IS_JS13 && !IS_JS14 &&
                      !IS_JS15 && !IS_NA_JSVERSION);


