//##############################################################################
 var snif        = true;                //File Loaded Indicator
//##############################################################################
// Platform Ident --  0  = BOTs (Offliners, Crawlers and Spiders)
//                    1  = TV (WebTV, NavIO, AOLTV, PowerTV, NetPliance etc)
//                    2  = Handheld (Windows CE...)
//                    3  = Win/Tel (Windows/Intel Paradigm)
//                    4  = n/a
//                    5  = MAC (Macintosh)
//                    6  = n/a
//                    7  = Linux (all flavors and versions)
//                    8  = n/a
//                    9  = Unix (Non-Linux Unix)
 var pl  = -1;                          //Unique index per platform (WIN, MAC etc)

// OperaSystem ---- 0/0  = Generic Catchall (Bot, Crawl, Spi(y)der, Search)
//                  0/1  = Validator/Language (W3C etc)
//                  0/2  = Validator/Links
//                  0/3  = Search Engine/Obscure
//                  0/4  = Search Engine/Known
//                  0/5  = FTP Client/DL Manager
//                  0/7  = Offline Browsers (WebStripper, 
//                  0/8  = Anonymizers
//                  0/9  = E-Mail Scrounger
//                  1/0  = Netpliance
//                  1/1  = WebTV
//                  1/2  = NavIO
//                  1/3  = AOLTV
//                  1/4  = Liberate/DTV
//                  1/5  = PowerTV/1.5 (Compatible; Spyglass DM 3.2.1, EXPLORER)
//                  1/5  = NetBox (Linux OS)
//                  2/3  = Windows CE
//                  3/3  = Windows Desktop/Laptop
//                  5/5  = MAC (all flavors and versions)
//                  7/7  = Linux (all flavors and versions)
//                  9/10 = DEC/VAX/Open VMS
//                  9/11 = BSD (Free, Open or Net)
//                  9/12 = NCR
//                  9/13 = Sinix
//                  9/14 = Reliant
//                  9/15 = System V
//                  9/16 = SCO
//                  9/20 = HP
//                  9/21 = Sun
//                  9/22 = Irix
//                  9/23 = IBM/Aix
 var os  = -1;                          //Unique index per OS (Win98, Linux etc)

// OpSys Version --- x.x = Parsed Numeric OS Version (not all OS have a version)
 var ov  = -1;                          //Operating System Version Number

// Chip Set ---------  1 = TV Chip Sets (this might be redundant w/others)
//                     8 = RISC (Unknown)
//                    64 = Alpha (DEC)
//                    68 = 68K/68000 (MAC)
//                    69 = PowerPC (MAC)
//                    86 = Intel/AMD etc
 var cs  = -1;                          //CPU/Chip Set Identifier

// Browser Ident ----- 0 = Bots etc
//                     1 = TV (WebTV, NavIO, AOLTV, PowerTV, NetPliance etc)
//                     2 = Avant Browser
//                     3 = Internet Exploder
//                     4 = Opera
//                     8 = NetScape -- Gecko (bi > 5/see below)  
//                     9 = Mozilla --- Gecko/All Platforms
//                    10 = KMeleon --- Gecko/All Platforms 
//                    11 = Konqueror - Gecko/Linux          (10)
//                    12 = Galeon ---- Gecko/Linux          (11)
//                    13 = Camino/Chimera - Gecko/MAC       (12)
//                    18 = Firefox --- Gecko/All Platforms
//                    19 = Safari ---- MAC (pseudo 'gecko') (13)
//                    20 = iCab ------ MAC
//                    21 = OmniWeb
//                    22 = HotJava
//                    33 = Multiple -- Mosaic
 var br  = -1;                          //Unique index per browser (NS, IE etc)
 var lz  = -1;                          //Gecko Browser (any none -1 value)
 var sp  = -1;                          //Other Special Browser ID (AOL/0)

// Browser Version - x.x = Full Parsed Browser Verion (not all browsers one)
 var bv  = -1;                          //Full Browser Release Version

// Browser Version --- x = Partial Parsed Browser Verion (Interger Portion Only)
 var bi  = -1;                          //Partial Browser Release Version

// Spec ID Version - x.x = Unique to each type of Spec Browser ID
 var sl  = -1;                          //Special/Unique Browser Version ID

// JavaScript Vers - x.x = Browser Ver based guess work on applicable JS Version
 var js  = -1;                          //JavaScript Version (automatically unique)

// Browser Name ---- 's' = Browser Name String (may be overridden based on parsing)
 var an  = navigator.appName;           //Text string identifying a browser

// Platform Name --- 's' = Platform Name String (not overridden currently)
 var pn  = navigator.platform;          //Text string identifying a platform

// App Ver String -- 's' = Application Version String buffer
 var av  = navigator.appVersion.toLowerCase ();

// User Agent ------ 's' = User Agent (lower cased makes it easier to work with)
 var ua  = ' ' + navigator.userAgent.toLowerCase ();

// Referring URL --- 's' = URL of referring Page
 var ru  = 'NULL';                      //Text string identifying referring URL

 var go_noe = false;
//==============================================================================
// overlay_paste (1);
//==============================================================================
 pl  = sniff_platform (pn.toLowerCase (), ua);
 os  = sniff_operasys (pl, ua, pn);
 cs  = sniff_chipset (pl, ua, pn);
 br  = sniff_browserid (pl, ua);

 sp  = sniff_browserver (br, ua, av, os);

 js  = sniff_javascript (br, sp, bv, bi);

 ru  = sniff_referrer (pl, br, bv)

 var je   = (navigator.javaEnabled ()) ? true : false;

//   document.cookie = "cookies=true";
//   var is_cookie   = (document.cookie) ? "true" : "false";
 var is_cookied  = (navigator.cookieEnabled) ? true : false;
 if (br == 8 && bi <= 4 ||
     br == 4 && bi <= 6)                //Newer browsers (IE5, NS6 Mozilla) know
    is_cookied  = true;                 // if 'cookies' are enabled.
//==============================================================================
// overlay_results (1);
//==============================================================================
//                                        *** Platform Identity

 function sniff_platform (PN, UA)
    {
    var ll  = sniff_operabot ('P', PN, UA);
    if (ll != -1)
       return ll;

    if (PN.indexOf ('webtv') >= 0 ||
        UA.indexOf ('webtv') >= 0 ||
        PN.indexOf ('navio') >= 0 ||
        UA.indexOf ('navio') >= 0 ||
        PN.indexOf ('aoltv') >= 0 ||
        UA.indexOf ('aoltv') >= 0 ||
        UA.indexOf ('powertv') >= 0 ||
        PN.indexOf ('powertv') >= 0 ||
        UA.indexOf ('liberate') >= 0 ||
        PN.indexOf ('liberate') >= 0 ||
        UA.indexOf ('netpliance') >= 0 )
       return 1;

    if (PN.indexOf ('mac')   >= 0)
       return 5;

    if (PN.indexOf ('linux') >= 0 ||
        UA.indexOf ('linux') >= 0)
       return 7;

    if (PN.indexOf ('x11') >= 0 ||
        UA.indexOf ('x11') >= 0)
       return 9;

    if (PN.indexOf ('wince') >= 0 ||
        UA.indexOf ('wince') >= 0)
       return 2;

    if (PN.indexOf ('win') >= 0 ||
        UA.indexOf ('win') >= 0)
       return 3;

    return -1;
    }
//==============================================================================
//                                        *** Operating System Identity
//
// 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".
// NOTE: On Opera 3.0, the userAgent string includes "Windows 95/NT4" on all
//       Win32, so you can't distinguish between Win95 and WinNT.

 function sniff_operasys (PL, UA, PN)
    {
    var c = -1;                         //
    switch (PL)                         //
       {                                //
       case 0:
       return sniff_operabot ('O', PN, UA, PL);
       break;

       case 1:                          //WebTV/NAVIO/AOLTV
       if (UA.indexOf ('netpliance') >= 0)
          return 0;

       if (UA.indexOf ('webtv') >= 0)   //
          return 1;                     //

       if (UA.indexOf ('navio') >= 0)
          return 2;
                                        // 
       if (UA.indexOf ('aoltv') >= 0)   //
          return 3;                     //

       if (UA.indexOf ('liberate') >= 0)
          return 4;

       if (UA.indexOf ('powertv') >= 0) //
          return 5;                     //

       break;                           //Case of 'WebTV/AOLTV'

       case 2:
       if (UA.indexOf ('windows ce') > 0)
          return 3;

       break;

       case 3:
       if (UA.indexOf ('windows 3.1') > 0 ||
           UA.indexOf ('win16') > 0 ||
           UA.indexOf ('windows 16-bit') > 0 ||
           UA.indexOf ('windows x86')    > 0)
          ov  = 3.1;

       if (UA.indexOf ('win95') > 0 ||
           UA.indexOf ('windows 95') > 0)
          ov   = 95;

       if (UA.indexOf ('win98') > 0 ||
           UA.indexOf ('windows 98')  > 0)
          ov   = 98;

       if (UA.indexOf ('win 9x 4.90') > 0)
          ov   = 4.9;

       if (UA.indexOf ('winnt') > 0 ||
           UA.indexOf ('windows nt') > 0)
          {
          if (UA.indexOf ('winnt') > 0)
             {
             c = UA.indexOf ('winnt') + 5;
             if (UA.indexOf ('winnt ') > 0)
                c  = c + 1;

             }

          if (UA.indexOf ('windows nt') > 0)
             {
             c = UA.indexOf ('windows nt') + 10;
             if (UA.indexOf ('windows nt ') > 0)
                c  = c + 1;

             }

          if (UA.substring (c, c + 1) >= 0 && UA.substring (c, c + 1) <= 9)
             ov = parseFloat (UA.substring (c));

          }

       if (ov == -1 && (UA.indexOf ('winnt;') > 0 || 
                        UA.indexOf ('windows nt;') > 0 ||
                        UA.indexOf ('windows nt)') > 0))
          ov   = 4.0;

       if (ov == -1 && (UA.indexOf ('windows me') > 0 || 
                        av.indexOf ('windows me') > 0))
          ov   = 4.9;

       if (ov == -1 && (UA.indexOf ('windows 2000') > 0 || 
                        av.indexOf ('windows 2000') > 0))
          ov   = 5;

       if (ov == -1 && (UA.indexOf ('windows xp') > 0 || 
                        av.indexOf ('windows xp') > 0))
          ov   = 5.1;

       return PL;                       //
       break;                           //Case of 'WIN/TEL behemoth'

       case 5:                          //MAC -- Format is approximately...
       if (PN.indexOf ('macos') >= 0 ||
           PN.indexOf ('mac os') >= 0 ||
           PN.indexOf ('macintosh os') >= 0)
          c = PN.indexOf ('os ') + 5;

       if (c  != -1 && (PN.substring (c, c + 1)  >= 0 && PN.substring (c, c + 1) <= 9))
          ov   = parseFloat (PN.substring (c));

       if (ov == -1 && (UA.indexOf ('mac os x') >= 0 || PN.indexOf ('mac os x') >= 0 ||
                        UA.indexOf ('macos x')  >= 0 || PN.indexOf ('macos x')  >= 0))
          ov   = 10;

       return PL;                       //
       break;                           //Case of 'MAC'

       case 7:                          //Linux
       c = UA.indexOf ('linux');
       if (c  > 0 && (UA.substring (c + 6, c + 7) >= 0 && UA.substring (c + 6, c + 7) <= 9))
          ov  = parseFloat (UA.substring (c + 6));

       return PL;                       //
       break;                           //Case of 'Linux'

    default:
       if (UA.indexOf ('dec')    > 0 ||
           UA.indexOf ('vms')    > 0 ||
           UA.indexOf ('vax')    > 0 ||
           UA.indexOf ('osf1')   > 0 ||
           UA.indexOf ('ultrix') > 0)
          {                             //DEC, VAX, OpenVMS and OSF1 are strings
          os = 10;                      // I've seen before.  The 'ultrix' is a
          c  = UA.indexOf ('osf1');     // little iffy.
          if (c > 0)                    //DEC/OSF1 -- Format is approximately...
             {                          // Mozilla/4.78 [en] (X11; U; OSF1 V5.1 alpha)
             c = c + 6;
             if (UA.substring (c, c + 1) >= 0 && UA.substring (c, c + 1) <= 9)
                ov = parseFloat (UA.substring (c));

             }                          //Note: the 'alpha' string identifies
                                        // the Chip Set not a OS flavor.
          }

       if (UA.indexOf ('ncr') > 0)
          os = 12;

       if (UA.indexOf ('sinix') > 0)
          os = 13;

       if (UA.indexOf ('reliantunix') > 0)
          os = 14;

       if (UA.indexOf ('unix_system_v') > 0)
          os = 15;

       if (UA.indexOf ('sco')     > 0 ||
           UA.indexOf ('unix_sv') > 0)
          os = 16;

       c  = UA.indexOf ('bsd');         //OpenBSD, FreeBSD or NetBSD -- Format is approximately...
       if (c > 0)                       // Mozilla/3.0 (OpenBSD 3.0 i386; U) Opera 5.0  [en]
          {                             // Mozilla/6.0 [en] (X11; U; FreeBSD-4.3 i386)
          if (UA.indexOf ('free') > 0)  // Mozilla/3.04 (X11; U; NetBSD 1.5 i386)
             os = 11.1;                 // Mozilla/4.72 [en] (X11; U; FreeBSD 4.0-RELEASE i386; Nav)
                                        // Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:0.9.7) Gecko/20020128
          if (UA.indexOf ('open') > 0)  // Mozilla/3.0 (WorldGate Gazelle 3.5.1 build 15; FreeBSD2.2.5-STABLE)
             os = 11.2;                 //

          if (UA.indexOf ('net') > 0)   //As you can see above, BSD has all kinds
             os = 11.3;                 // of UA formats.

          c  = c + 4;
          if (UA.substring (c - 1, c) >= 0 && UA.substring (c - 1, c) <= 9)
             c = c - 1;

          if (UA.substring (c, c + 1) >= 0 && UA.substring (c, c + 1) <= 9)
             ov = parseFloat (UA.substring (c));

          }                             //

       c  = UA.indexOf ('hp-ux');       //HP or Hewlet-Packard -- Format is approximately...
       if (c > 0)                       // Mozilla/4.72 [en] (X11; U; HP-UX B.10.20 9000/785)
          {                             // Mozilla/4.73C-CCK-MCD  [en] (X11; U; HP-UX B.11.00 9000/785)
          os = 20;                      //
          c  = c + 8;
          if (UA.substring (c, c + 1) >= 0 && UA.substring (c, c + 1) <= 9)
             ov = parseFloat (UA.substring (c));

          }

       c  = UA.indexOf ('sunos');       //Sun/Solaris -- Format is approximately...
       if (c > 0)                       // Mozilla/4.5 [en] (X11; U; SunOS 5.5.1 sun4u)
          {                             // Mozilla/4.5 [en] (X11; I; SunOS 5.8 sun4u)
          os = 21;                      // Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.3b) Gecko/20030127
          c  = c + 6;
          if (UA.substring (c, c + 1) >= 0 && UA.substring (c, c + 1) <= 9)
             ov = parseFloat (UA.substring (c));
          else
             {                          //-->>Format is approximately (PN)...
             c = PN.indexOf ('sunos');  // SunOS 5.8 sun4u sparc SUNW,Ultra-5_10
             c = c + 6;
             if (PN.substring (c, c + 1) >= 0 && PN.substring (c, c + 1) <= 9)
                ov  = parseFloat (PN.substring (c));

             }                          //
                                        //
          }                             //

       c  = UA.indexOf ('irix');        //SGI/Irix -- Format is approximately...
       if (c > 0)                       // Mozilla/4.75C-SGI [en] (X11; I; IRIX 6.5 IP32)
          {                             // Mozilla/4.75C-SGI [en] (X11; I; IRIX64 6.5 IP27) 
          os = 22;                      // Mozilla/5.0 (X11; U; IRIX64 IP30; en-US; rv:0.9.9+) Gecko/20020420
          c  = c + 5;
          if (UA.indexOf ('irix64') > 0)
             c = c + 2;

          if (UA.substring (c, c + 1) >= 0 && UA.substring (c, c + 1) <= 9)
             ov  = parseFloat (UA.substring (c));

          }

       c  = UA.indexOf ('aix');         //IBM/AIX -- Format is approximately...
       if (c > 0)                       // Mozilla/4.76i [en] (X11; U; AIX 4.3)
          {                             // Mozilla/4.76iC-CCK-MCD  [en_US] (X11; U; AIX 5.1)
          os = 23;                      // 
          c  = c + 4;
          if (UA.substring (c, c + 1) >= 0 && UA.substring (c, c + 1) <= 9)
             ov  = parseFloat (UA.substring (c));

          }

       if (os >= 10)                    //If we've found anything within the
          pl   = 9;                     // 'default bucket' then it's going
                                        // to be identified as a flavor of
       return os;                       // Unix.  Only the Linux Unix has a
       break;                           // seperate Platform ID.
       }                                //End of Switch/'platform id'

    return -1;                          //Default OS is the Platform we're on.
    }
//==============================================================================
//                                        *** CPU/Chip Set

 function sniff_chipset (PL, UA, PN)
    {                                   //Chip Sets and Plaforms should usually
    var ls  = -1;                       // be synonymous but not always.  This
    if (UA.indexOf ('risc') >= 0)       // little routine gives us a rough of
       ls   = 8;                        // who's playing in what sandbox.

    if (UA.indexOf ('alpha') >= 0)
       ls   = 64;

    if (UA.indexOf ('68k') >= 0 || UA.indexOf ('68000') >= 0)
       ls   = 68;

    if (UA.indexOf ('ppc') >= 0 || UA.indexOf ('powerpc') >= 0)
       ls   = 69;

    if (UA.indexOf ('86') >= 0  || PN.indexOf ('86') >= 0)
       ls   = 86;

    if (PL == 1)                        //TV Platform
       ls   = 1;                        //

    if (PL == 3)                        //WinTel
       ls   = 86;                       //

    return ls;
    }
//==============================================================================
//                                        *** Browser Identity

 function sniff_browserid  (PL, UA)
    {
    if (PL == 0 || PL == 1)             //For 'Bots and TV (incl NetPliance)
       return PL;                       // Browser ID is the same as the 
                                        // Platform.
    if (UA.indexOf ('opera') >= 0)
       return 4;

    if (UA.indexOf ('k-meleon') >= 0)
       return 10;

    if (UA.indexOf ('konqueror') >= 0)
       return 11;

    if (UA.indexOf ('galeon')  >= 0)
       return 12;

    if (UA.indexOf ('camino') >= 0 ||
        UA.indexOf ('chimera') >= 0)
       return 13;

    if (UA.indexOf ('firefox') >= 0)
       return 18;

    if (UA.indexOf ('safari') >= 0)
       return 19;

    if (UA.indexOf ('icab') >= 0)
       return 20;

    if (UA.indexOf ('omniweb') >= 0 && UA.indexOf ('netscape') == -1)
       return 21;
                                        //If both 'netscape' and 'OmniWeb' are
    if (UA.indexOf ('hotjava') >= 0)    // in the User Agent, NetScape overrides
       return 22;                       // OmniWeb.

    if (UA.indexOf ('xchaos_arachne') >= 0 ||
        UA.indexOf ('slimbrowser') >= 0 ||
        UA.indexOf ('pwwebspeak') >= 0 ||
        UA.indexOf ('justview') >= 0 ||
        UA.indexOf ('ibrowse') >= 0 ||
        UA.indexOf ('plucker') >= 0 ||
        UA.indexOf ('wannabe') >= 0 ||
        UA.indexOf ('mosaic') >= 0 ||   //There are actually quite a few browsers
        UA.indexOf ('lynx') >= 0 ||     // out in the world.  Until such time
        UA.indexOf ('qweb') >= 0 ||     // that any of these browsers come to be a
        UA.indexOf ('w3m') >= 0)        // major force, they're generic.  Speaking
       return 33;                       // of generic, there's a generic version
                                        // of IE, it's Avant.  As Mozilla is to NS,
    if (UA.indexOf ('avant') >= 0)      // so Avant is to IE (Don't ask me why).
       return 2;                        // We'll ID Avant seperately for grins.

    if (UA.indexOf ('msie')  >= 0)      //To distinguish between a branded Mozilla
       return 3;                        // browser and a true NetScape browser, we...

    var faux  = (UA.indexOf ('compatible') >= 0 || UA.indexOf ('spoofer') >= 0);
    if (faux == false && UA.indexOf ('mozilla') >= 0)
       {
       if (UA.indexOf ('netscape') > 0 ||
           UA.indexOf ('cs 2000') > 0)
          return 8;                     //...must do a little detective work.  By
                                        // a process of elimination we can be fairly
       var c  = UA.indexOf ('mozilla'); // sure that we have either a Mozilla or a
       if (c != -1)                     // NetScape browser - not some poser.
          {
          var n = parseFloat (UA.substring (c + 8));
          if (n < 5)
             return 8;                  //As you can see, we back into both NS
                                        // and Mozilla brower identities.  It
          }                             // boils down to, if we haven't found
                                        // something interesting we try to guess
       return 9;                        // the differences between NetScape >= 6
       }                                // and any Mozilla.Org browsers.

    return -1;                          //Didn't find anything interesting.
    }
//==============================================================================
//                                        *** Browser Version

 function sniff_browserver (BR, UA, AV, OS)
    {
    var v  = -1;                        //We've found out the true identity of
    var lp = -1;                        // our visitor's browser (at least I think
    switch (BR)                         // we have).  Now we look for something
       {                                // approximating a version/release number.
       case 0:                          // As you glance over the various formats
       if (an.length < 1)               // of the UserAgent (the most likely place
          an = navigator.userAgent;     // for the Ver/Rel info) you'll notice
                                        // the huge variations between UserAgent
       bv = 0;                          // fields of the various browsers.  It
       bi = 0;                          // makes it kind of interesting finding
       return lp;                       // an algorithm for parsing a 'useful'
       break;                           // Ver/Rel.

       case 1:                          //WebTV/AOLTV -- Format is approximately...
       v  = UA.indexOf ('i-opener');    // Mozilla/3.x (I-Opener 1.1; Netpliance)
       if (v != -1)                     //
          {
          bv  = parseFloat (UA.substring (v + 9));
          bi  = parseInt (bv);
          an  = 'I-Opener';
          }
                                        //-->>Format is approximately...
       v  = UA.indexOf ('webtv');       // Mozilla/4.0 MSTV/1.1 WebTV/2.5 (Compatible; MSIE 4.0)
       if (v != -1)                     // Mozilla 4.0 WebTV 2.6 (compatible  MSIE 4.0)
          {
          bv  = parseFloat (UA.substring (v + 6));
          bi  = parseInt (bv);
          }                             // Mozilla/3.0 WebTV;1.4 (Compatible; MSIE 2.0)

       v  = UA.indexOf ('dtv');         //-->>Format is approximately...
       if (v != -1)                     // Mozilla 3.0 (Liberate DTV 1.2)
          {
          bv  = parseFloat (UA.substring (v + 4));
          bi  = parseInt (bv);
          an  = 'Liberate/DTV';         // Mozilla/4.7 ( Liberate; DTV; 4_0; WIN32; GenericProvider )
          pn  = 'TV';
          }

       v  = UA.indexOf ('navio');       //-->>Format is approximately...
       if (v != -1)                     // Mozilla/4.7.2 NAVIO (8; 7; Acer; G100; 1; R2.0_NCIPAL; 030519)
          {
          bv  = parseFloat (UA.substring (v + 7));
          bi  = parseInt (bv);
          an  = 'NAVIO';                // Mozilla/3.0 NAVIO (11; 1; Inprimis; i2020; 1; R3.0_LBRT; R3.0_LNET045P_FC8)
          pn  = 'TV';                   //
          }

       v  = UA.indexOf ('powertv');     //-->>Format is approximately...
       if (v != -1)                     // Mozilla/4.0 PowerTV/1.5 (Compatible; Spyglass DM 3.2.1, EXPLORER)
          {
          bv  = parseFloat (UA.substring (v + 8));
          bi  = parseInt (bv);
          an  = 'PowerTV';              //
          pn  = 'TV';                   //
          }                             //
                                        //
       break;                           //Case of 'WebTV/AOLTV'

       case 2:                          //-->>Avant
       case 3:                          //-->>MSIE
       v  = UA.indexOf ('msie');        // it is compatible with.  So look for a
       if (v != -1)                     // real version further on in the string.
          {
          bv  = parseFloat (UA.substring (v + 5));
          bi  = parseInt (bv);
          }
       else                             //
          {                             //
          v  = AV.indexOf ('msie');     // it is compatible with.  So look for a
          if (v != -1)                  // real version further on in the string.
             {
             bv  = parseFloat (av.substring (v + 5));
             bi  = parseInt   (bv);
             }

          }                             //
                                        //
       break;                           //Case of 'WIN/TEL behemoth'

       case 4:                          //Opera -- Format is approximately...
       an = 'Opera';                    // Mozilla 4.0 (compatible  MSIE 6.0  Windows NT 5.1) Opera 7.10   en
       v  = UA.indexOf ('opera');       // Mozilla 4.0 (compatible  MSIE 6.0  Linux 2.4.18-14 i686) Opera 7.11   en
       if (v != -1)                     // Opera/6.01 (Windows 2000; U) [en]
          {
          bv  = parseFloat (UA.substring (v + 6));
          bi  = parseInt (bv);
          }

       break;

       case 8:                          //NetScape -- Format is approximately...
       v  = UA.indexOf ('netscape');    // Mozilla/4.8 [en]c-cck-mcd (qwest.net) (windows nt 5.0; u)
       if (v == -1)                     // Mozilla/5.0 (Windows; U; Win98; en-US; m18) Gecko/20001108 NetScape6/6.0[1234567890]
          {                             // Mozilla 5.0 (Windows  U  Windows NT 5.1  en-US  rv 0.9.4) Gecko 20011019 NetScape6/6.2
          v = UA.indexOf ('cs 2000');   // Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:0.9.4.2) Gecko/20020220 CS 2000 7.0/7.0
          v = v - 1;                    //
          }                             //

       if (v != -1)                     //I'm only guessing but I think 'CS 2000' is just
          {                             // a rebranded NetScape 6+ (given the Ver Nos.)
          v   = v + 8;                  // Anyway if didn't find the NS string look for CS.
          var d1 = 0;
          if (UA.substring (v, v + 1) == ' ' || UA.substring (v, v + 1) == '/')
             d1  = v + 1;

          if (UA.substring (v, v + 1) >= '0' && UA.substring (v, v + 1) <= '9')
             d1  = v + 2;

          if (d1 > 0)
             {
             bv  = parseFloat (UA.substring (d1));
             bi  = parseInt (bv);
             }

          }

       break;

       case 9:                          //Mozilla -- Format is approximately...
       an = 'Mozilla';                  // Mozilla and most other Gecko browsers
       break;                           // excepting NS 6+ are parsed below.

       case 10:                         //K-Meleon -- Format is approximately...
       an = 'K-Meleon';                 // Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.2b) Gecko/20021016 K-Meleon 0.7
       v  = UA.indexOf ('k-meleon');    //
       if (v != -1)                     // 
          {
          bv  = parseFloat (UA.substring (v + 9));
          bi  = parseInt (bv);
          }

       break;

       case 11:                         //Konqueror -- Format is approximately...
       v  = UA.indexOf ('konqueror');   // Mozilla 5.0 (compatible  Konqueror 3.1  Linux 2.4.20-gentoo-r5  X11  i686  de, en_US)
       if (v != -1)                     // Mozilla 5.0 (compatible  Konqueror 3  Linux)
          {
          bv  = parseFloat (UA.substring (v + 10));
          bi  = parseInt (bv);
          }

       break;

       case 12:                         //Galeon -- Format is approximately...
       an = 'Galeon';                   // Mozilla 5.0 Galeon 1.2.9 (X11  Linux i686  U ) Gecko 20030526
       v  = UA.indexOf ('galeon');      // Mozilla/5.0 (X11; U; Linux i686) Gecko/20030430 Galeon/1.3.4 Debian/1.3.4.20030509-1
       if (v != -1)                     // Mozilla/5.0 (X11; U; Galeon; 0.12.1; 590848) <<appears to be a very early version>
          {
          bv  = parseFloat (UA.substring (v + 7));
          bi  = parseInt (bv);
          }

       break;

       case 13:                         //Camino -- Format is approximately...
       an = 'Camino';                   // Mozilla 5.0 (Macintosh  U  PPC Mac OS X Mach-O  en-US  rv 1.0.1) Gecko 20030306 Camino 0.66
       break;

       case 18:                         //Firefox -- Format is approximately...
       an = 'Firefox';                  // Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7.8) Gecko/20050511 Firefox/1.0.4
       v  = UA.indexOf ('firefox');     //
       if (v != -1)                     //
          {
          bv  = parseFloat (UA.substring (v + 8));
          bi  = parseInt (bv);
          }

       break;

       case 19:                         //Safari -- Format is approximately...
       an = 'Safari';                   // Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/73 (KHTML, like Gecko) Safari/73
       v  = UA.indexOf ('applewebkit');
       if (v != -1)                     //Using 'applewebkit/xx' to ID a Safari...
          {
          bv  = (parseFloat (UA.substring (v + 12)) / 100);
          bi  = parseInt (bv);
          }                             //...version is just something handy to
                                        // do.  Better than calling all of them
       break;                           // Safari Version X or something.

       case 20:                         //iCab -- Format is approximately...
       v  = UA.indexOf ('icab');        // iCab/2.9.1 (Macintosh; U; PPC; Mac OS X)
       if (v != -1)                     // iCab/Pre2.0 (Macintosh; I; PPC)
          {                             // Mozilla/4.5 (compatible; iCab 2.7.1; Macintosh; I; PPC)
          v   = v + 5;
          if (UA.substring (v, v + 1) >= 0 && UA.substring (v, v + 1) <= 9)
             var d1  = v;
          else
             var d1  = v + 3;

          bv  = parseFloat (UA.substring (d1));
          bi  = parseInt (bv);
          }

       break;

       case 21:                         //OmniWeb -- Format is approximately...
       v  = UA.indexOf ('omniweb');     // Mozilla/5.0 (Macintosh; U; PPC; en-US; rv:0.9.2) Gecko/20010726 NetScape6/6.1 OmniWeb/4.1-v382
       if (v != -1)                     // Mozilla/4.0 (compatible; MSIE 5.12; Mac_PowerPC) OmniWeb/4.1-v372
          {
          bv  = parseFloat (UA.substring (v + 8));
          bi  = parseInt (bv);
          }                             //

       break;                           //Case of 'OmniWeb'

       case 22:                         //HotJava
       break;                           //Case of 'HotJava'

       case 33:                         //'Generic Browsers' -- Format is... anybody's guess
       v  = UA.indexOf ('mosaic');      //
       if (v != -1)                     //
          {
          bv  = parseFloat (UA.substring (v + 7));
          bi  = parseInt (bv);
          an  = 'Mosaic';
          }

       break;

    default:
       if (an.length < 1)
          an = 'Unk Browser';

       break;                           //
       }                                //End of Switch/'platform id'
//------------------------------------------------------------------------------
    if (UA.indexOf ('aol')   > 0)       //KNOWN BUG: On AOL4, returns false if
       {                                // IE3 is an embedded browser or if this
       lp = 0;                          // is the first browser window opened.
       v  = UA.indexOf ('aol ');        //
       if (v != -1)
          sl  = parseFloat (UA.substring (v + 4));
       else
          sl  = parseFloat (UA.substring (v + 3));

       }                                //

    if (UA.indexOf ('gecko') > 0 && BR != 19)
       {
       v  = UA.indexOf ('gecko');
       sl = parseInt (UA.substring (v + 6));
       if (isNaN (sl) == true)
          sl = -1;                      //Gecko Rendering Engine based browsers
                                        // have unique features so we might like
       v  = UA.indexOf (' rv:');        // to know when we have a Gecko browser.
       if (v == -1)                     // The 'lz/lizard' is set to the browser
          v   = UA.indexOf (' rv ');    // ID.  Note that 'Safari/BR==19' isn't...

       if (v != -1 && BR != 8 && BR != 10 && BR != 18)
          {
          bv  = parseFloat (UA.substring (v + 4));
          bi  = parseInt (bv);
          }                             //...real Gecko so we brush it off.  Now
                                        // if the browser isn't 8/NS or 10/KM we
       lz = BR;                         // parse out the 'revision id/rv', using
                                        // it as the browser Ver/Rel
       if (UA.indexOf ('phoenix') > 0)
          lp  = 1;

       if (UA.indexOf ('firebird') > 0)
          lp  = 2;
                                        //
       }                                //

    if (bv == -1 ||
        isNaN (bv) == true ||
        isNaN (bi) == true)
       {
       bv = parseFloat (AV);            // parsing out the hidden 'Release Info'.
       bi = parseInt (AV);              // platforms are different... we return
       }                                //

    return lp;
    }
//==============================================================================
//                                        *** JavaScript Version
//
// NOTE: In the future, update this code as 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 Vers compatibility with > or >=.  We have no idea of what other browsers
// might support so always check for JS Vers with > or >=

 function sniff_javascript (BR, SP, BV, BI)
    {
    var jsv = 0;
    switch (BR)
       {
       case 1:                          //WebTV/NAVIO
       if (BR != 4 && BI >= 2)
          jsv  = 1.2;

       break;

       case 2:                          //-->Avant
       case 3:                          //-->MSIE
       if (BI <  4)
          jsv  = 1.0;

       if (BI == 4)
          jsv  = 1.2;

       if (BI == 5)
          jsv  = 1.3;

       if (BI >= 6)
          jsv  = 1.5;

       break;

       case 4:                          //Opera
       js = 1.1;
       if (BI == 5 || BI == 6)
          jsv  = 1.3;

       if (BI >= 7)
          jsv  = 1.5;

       break;

       case 8:                          //NetScape
       if (BI == 2)
          jsv  = 1.0;

       if (BI == 3)
          jsv  = 1.1;

       if (BI == 4)
          {
          if (BV <= 4.05)
             jsv  = 1.2;
          else
             jsv  = 1.3;

          }

       if (BI >= 5)
          jsv  = 1.5;

       break;

       case 9:                          //Mozilla
       case 18:                         //Firefox
       jsv = 1.5;
       break;

       case 10:                         //K-Meleon
       jsv = 1.5;
       break;

       case 11:                         //Konqueror
       jsv = 1.5;                       //
       break;                           //Case of 'Konqueror'

       case 12:                         //Galeon
       jsv = 1.5;                       //
       break;                           //Case of 'Galeon'

       case 13:                         //Camino
       jsv = 1.5;                       //
       break;                           //Case of 'Camino'

       case 19:                         //Safari
       jsv = 1.5;                       //
       break;                           //Case of 'Safari'

       case 20:                         //iCab
       jsv = 1.5;                       //
       break;                           //Case of 'iCab'

       case 22:                         //HotJava
       if (BI >= 3)
          jsv  = 1.3;

       break;                           //Case of 'HotJava'

    default:
       break;                           //
       }                                //End of Switch/'platform id'

    return jsv;
    }
//==============================================================================
//                  0/0  = Generic Catchall (Bot, Crawl, Spi(y)der, Search)
//                  0/1  = Validators - Language (W3C etc)
//                  0/2  = Validators - Links etc
//                  0/3  = Obscure Search Engines
//                  0/4  = Well Known Search Engines
//                  0/5  = FTP clients and download managers
//                  0/7  = Offline Browsers (WebStripper 
//                  0/8  = Anonymizers
//                  0/9  = E-Mail Address Gatherers

 function sniff_operabot (REQ, PN, UA, PL)
    {
    var res = -1;

    return res;                         //
    }
//==============================================================================
//                                        *** Referrering URL

 function sniff_referrer (PL, BR, MAJ)
    {
    var lr  = '';

    if (PL == 5 && (BR == 2 || BR == 3) && MAJ == 4)
       lr   = document.referrer;
    else
       {
       window.oe = window.onerror;
       window.onerror = evt_gostats;
//lr = parent.document.referrer;
//lr = top.document.referrer;
       if ((lr == '') || (lr == '[unknown origin]') || (lr == 'unknown') || (lr == 'undefined'))
          if (document['parent']  !=  null) 
             if (parent['document']  !=  null)
                if (parent.document['referrer'] != null) 
                   if (typeof(parent.document)  == 'object')
                      lr = parent.document.referrer;

       if ((lr  ==  '') || (lr == '[unknown origin]') || (lr == 'unknown') || (lr == 'undefined'))
          if (document['referrer'] != null)
             lr  =  document.referrer;

       go_noe = evt_gostats ()
       }

    return (lr ? lr : (go_noe ? 'NULL' : document.referrer));
    }
//==============================================================================
 function evt_gostats ()
    {
    window.onerror = window.oe;
    return true;
    }
//##############################################################################
 function overlay_paste (DIS)
    {
    if (DIS > 0)
       alert ('ua ' + ua + 
            '\npn ' + pn + 
            '\nan ' + an + 
            '\nav ' + av + 
            '\nnv ' + navigator.vendor);

    if (DIS > 1)
       alert ('ua>' + navigator.userAgent +
            '\npn>' + navigator.platform + 
            '\nan>' + navigator.appName + 
            '\nav>' + navigator.appVersion +
            '\nnv>' + navigator.vendor +
            '\ndr>' + document.referrer + '<');

    }
//------------------------------------------------------------------------------
 function overlay_results (DIS)
    {
    alert('pl> ' + pl + '  os> ' + os + '  ov> ' + ov +
        '\nbr> ' + br + '  bi> ' + bi + '  bv> ' + bv + '  sl> ' + sl +
        '\npn> ' + pn + '  an> ' + an + '  je> ' + je + '  ce> ' + is_cookied +
        '\nru> ' + ru + '<');
    }
//##############################################################################