// Basic Javascript-functions and global variables.


// *****************************************************************************
// JavaScript Browser Sniffer
// Eric Krok, Andy King, Michel Plungjan Jan. 31, 2002
// 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 sniffer
// and andy king's sniffer
// Revised May 7 99 to add is.nav5up and is.ie5up (see below). (see below).
// Revised June 11 99 to add additional props, checks
// Revised June 23 99 added screen props - gecko m6 doesn't support yet - abk
//                    converted to this. from is object to work everywhere
// 990624 - added cookie forms links frames checks - abk
// 001031 - ie4 mod 5.0 -> 5. (ie5.5 mididentified - abk)
//          this.ie4 mod tp work with ie6+ - abk
// 001120 - ns6 released, document.layers false, put back in
//        - this.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
// 011107 - added this.ie6 and this.ie6up variables - dmr
// 020128 - added link to netscape's sniffer, on which this is based - abk
//          updated sniffer for aol4-6, ie5mac = js1.4, TVNavigator, AOLTV,
//          hotjava
// 020131 - cleaned up links, added more links to example object detection
// 020131 - a couple small problems with Opera detection. First, when Opera
//          is set to be compatible with other browsers it will contain their
//          information in the userAgent strings. Thus, to be sure we have
//          Opera we should check for it before checking for the other bigs.
//          (And make sure the others are !opera.) Also corrected a minor
//          bug in the this.opera6up assignment.
// 020214 - Added link for Opera/JS compatibility; added improvements for
//          windows xp/2000 id in opera and aol 7 id (thanks to Les
//          Hill, Les.Hill@getronics.com, for the suggestion).
// 020531 - Added N6/7 and moz identifiers.
// 020605 - Added mozilla guessing, Netscape 7 identification, and cleaner
//          identification for Netscape 6. (this comment added after code
//          changes)
// 020725 - Added this.gecko. -- dmr
// 021205 - Added this.Flash and this.FlashVersion, based on Doc JavaScript code.
//          Added Opera 7 variables. -- dmr
// 021209 - Added aol8. -- dmr
// 030110 - Added this.safari, added 1.5 js designation for Opera 7. --dmr
// 030128 - Added this.konq, per user suggestion (thanks to Sam Vilain).
//          Removed duplicate Opera checks left over after last revision. - dmr
// 031124 - Added this.fb and version. We report this right after the this.moz
//          report. - dmr
// 040325 - Added this.fx and version. We report this right after the this.moz
//          report. - dmr
// 040421 - Added Debian check to this.moz. Thanks to Patrice Bridoux for
//          reporting this.
// 040517 - Added this.fb/this.fx to plugins based flash detection. Thanks to
//          Martin Bischoff for pointing out this omission.
// 040617 - On Mac IE, appVersion differs from the version in the ua,
//          with the UA appearing to be more accurate. As an experiment,
//          for Mac we'll pull this.minor from the ua instead.
// 040831 - Fixed Opera bug in flash detection logic; when Opera has
//          "enable plugins" unchecked in preferences, the "plugin"
//          variable is still true, but the "description" property
//          belonging to it is undefined.
// 051202 - Added ua check for higher versions of Firefox (1.5+),
//          since vendor/vendorSub is no longer used and the sniffer
//          was assuming Mozilla. Also belatedly added this.nav8 and
//          this.nav8up.
//
// Everything you always wanted to know about your JavaScript client
// but were afraid to ask. Creates "this." variables indicating:
// (1) browser vendor:
//     this.nav, this.ie, this.opera
// (2) browser version number:
//     this.major (integer indicating major version number: 2, 3, 4 ...)
//     this.minor (float   indicating full  version number: 2.02, 3.01, 4.04 ...)
// (3) browser vendor AND major version number
//     this.nav2, this.nav3, this.nav4, this.nav4up, this.nav5, this.nav5up,
//     this.nav6, this.nav6up, this.ie3, this.ie4, this.ie4up, this.ie5up, this.ie6...
// (4) JavaScript version number:
//     this.js (float indicating full JavaScript version number: 1, 1.1, 1.2 ...)
// (5) OS platform and version:
//     this.win, this.win16, this.win32, this.win31, this.win95, this.winnt, this.win98
//     this.os2
//     this.mac, this.mac68k, this.macppc
//     this.unix
//        this.sun, this.sun4, this.sun5, this.suni86
//        this.irix, this.irix5, this.irix6
//        this.hpux, this.hpux9, this.hpux10
//        this.aix, this.aix1, this.aix2, this.aix3, this.aix4
//        this.linux, this.sco, this.unixware, this.mpras, this.reliant
//        this.dec, this.sinix, this.freebsd, this.bsd
//     this.vms
//
// 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
//
// 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 this.nav4up ("Nav4 or greater")
// and this.ie4up ("IE4 or greater") instead of this.nav4 or this.ie4
// to check version in code which you want to work on future
// versions. For DOM tests scripters commonly used the
// this.getElementById test, but make sure you test your code as
// filter non-compliant browsers (Opera 5-6 for example) as some
// browsers return true for this test, and don't fully support
// the W3C's DOM1.
//

function javaScriptBrowserSniffer() {
  // convert all characters to lowercase to simplify testing
  var agt=navigator.userAgent.toLowerCase();
  var appVer = navigator.appVersion.toLowerCase();

  // *** BROWSER VERSION ***

  this.minor = parseFloat(appVer);
  this.major = parseInt(this.minor);

  this.opera = (agt.indexOf("opera") != -1);
  this.opera2 = (agt.indexOf("opera 2") != -1 || agt.indexOf("opera/2") != -1);
  this.opera3 = (agt.indexOf("opera 3") != -1 || agt.indexOf("opera/3") != -1);
  this.opera4 = (agt.indexOf("opera 4") != -1 || agt.indexOf("opera/4") != -1);
  this.opera5 = (agt.indexOf("opera 5") != -1 || agt.indexOf("opera/5") != -1);
  this.opera6 = (agt.indexOf("opera 6") != -1 || agt.indexOf("opera/6") != -1); // new 020128- abk
  this.opera7 = (agt.indexOf("opera 7") != -1 || agt.indexOf("opera/7") != -1); // new 021205- dmr
  this.opera5up = (this.opera && !this.opera2 && !this.opera3 && !this.opera4);
  this.opera6up = (this.opera && !this.opera2 && !this.opera3 && !this.opera4 && !this.opera5); // new020128
  this.opera7up = (this.opera && !this.opera2 && !this.opera3 && !this.opera4 && !this.opera5 && !this.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
  // And on Mac IE5+, we look for this.minor in the ua; since
  // it appears to be more accurate than appVersion - 06/17/2004

  this.mac = (agt.indexOf("mac")!=-1);
  var iePos  = appVer.indexOf('msie');
  if (iePos !=-1) {
     if(this.mac) {
         var iePos = agt.indexOf('msie');
         this.minor = parseFloat(agt.substring(iePos+5,agt.indexOf(';',iePos)));
     }
     else this.minor = parseFloat(appVer.substring(iePos+5,appVer.indexOf(';',iePos)));
     this.major = parseInt(this.minor);
  }

  // ditto Konqueror

  this.konq = false;
  var kqPos   = agt.indexOf('konqueror');
  if (kqPos !=-1) {
     this.konq  = true;
     this.minor = parseFloat(agt.substring(kqPos+10,agt.indexOf(';',kqPos)));
     this.major = parseInt(this.minor);
  }

  this.getElementById   = (document.getElementById) ? "true" : "false"; // 001121-abk
  this.getElementsByTagName = (document.getElementsByTagName) ? "true" : "false"; // 001127-abk
  this.documentElement = (document.documentElement) ? "true" : "false"; // 001121-abk

  this.safari = ((agt.indexOf('safari')!=-1)&&(agt.indexOf('mac')!=-1))?true:false;
  this.khtml  = (this.safari || this.konq);

  this.gecko = ((!this.khtml)&&(navigator.product)&&(navigator.product.toLowerCase()=="gecko"))?true:false;
  this.gver  = 0;
  if (this.gecko) this.gver=navigator.productSub;

  this.fb = ((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)     &&
               (this.gecko) && (navigator.vendor=="Firebird"));
  this.fx = ((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)     &&
               (this.gecko) && ((navigator.vendor=="Firefox")||(agt.indexOf('firefox')!=-1)));
  this.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)     &&
                  (this.gecko) && (!this.fb) && (!this.fx) &&
                  ((navigator.vendor=="")||(navigator.vendor=="Mozilla")||(navigator.vendor=="Debian")));
  if ((this.moz)||(this.fb)||(this.fx)) {  // 032504 - dmr
     this.moz_ver = (navigator.vendorSub)?navigator.vendorSub:0;
     if(this.fx&&!this.moz_ver) {
         this.moz_ver = agt.indexOf('firefox/');
         this.moz_ver = agt.substring(this.moz_ver+8);
         this.moz_ver = parseFloat(this.moz_ver);
     }
     if(!(this.moz_ver)) {
         this.moz_ver = agt.indexOf('rv:');
         this.moz_ver = agt.substring(this.moz_ver+3);
         this.paren   = this.moz_ver.indexOf(')');
         this.moz_ver = this.moz_ver.substring(0,this.paren);
     }
     this.minor = this.moz_ver;
     this.major = parseInt(this.moz_ver);
  }
  this.fb_ver = this.moz_ver;
  this.fx_ver = this.moz_ver;

  this.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)
              && (!this.khtml) && (!(this.moz)) && (!this.fb) && (!this.fx));

  // 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"))&&
      (this.nav)) {
     this.major = parseInt(navigator.vendorSub);
     // here we need this.minor as a valid float for testing. We'll
     // revert to the actual content before printing the result.
     this.minor = parseFloat(navigator.vendorSub);
  }

  this.nav2 = (this.nav && (this.major == 2));
  this.nav3 = (this.nav && (this.major == 3));
  this.nav4 = (this.nav && (this.major == 4));
  this.nav4up = (this.nav && this.minor >= 4);  // changed to this.minor for
                                              // consistency - dmr, 011001
  this.navonly      = (this.nav && ((agt.indexOf(";nav") != -1) ||
                        (agt.indexOf("; nav") != -1)) );

  this.nav6   = (this.nav && this.major==6);    // new 010118 mhp
  this.nav6up = (this.nav && this.minor >= 6); // new 010118 mhp

  this.nav5   = (this.nav && this.major == 5 && !this.nav6); // checked for ns6
  this.nav5up = (this.nav && this.minor >= 5);

  this.nav7   = (this.nav && this.major == 7);
  this.nav7up = (this.nav && this.minor >= 7);

  this.nav8   = (this.nav && this.major == 8);
  this.nav8up = (this.nav && this.minor >= 8);

  this.ie   = ((iePos!=-1) && (!this.opera) && (!this.khtml));
  this.ie3  = (this.ie && (this.major < 4));

  this.ie4   = (this.ie && this.major == 4);
  this.ie4up = (this.ie && this.minor >= 4);
  this.ie5   = (this.ie && this.major == 5);
  this.ie5up = (this.ie && this.minor >= 5);

  this.ie5_5  = (this.ie && (agt.indexOf("msie 5.5") !=-1)); // 020128 new - abk
  this.ie5_5up =(this.ie && this.minor >= 5.5);                // 020128 new - abk

  this.ie6   = (this.ie && this.major == 6);
  this.ie6up = (this.ie && this.minor >= 6);

// KNOWN BUG: On AOL4, returns false if IE3 is embedded browser
  // or if this is the first browser window opened.  Thus the
  // variables this.aol, this.aol3, and this.aol4 aren't 100% reliable.

  this.aol   = (agt.indexOf("aol") != -1);
  this.aol3  = (this.aol && this.ie3);
  this.aol4  = (this.aol && this.ie4);
  this.aol5  = (agt.indexOf("aol 5") != -1);
  this.aol6  = (agt.indexOf("aol 6") != -1);
  this.aol7  = ((agt.indexOf("aol 7")!=-1) || (agt.indexOf("aol7")!=-1));
  this.aol8  = ((agt.indexOf("aol 8")!=-1) || (agt.indexOf("aol8")!=-1));

  this.webtv = (agt.indexOf("webtv") != -1);

  // new 020128 - abk

  this.TVNavigator = ((agt.indexOf("navio") != -1) || (agt.indexOf("navio_aoltv") != -1));
  this.AOLTV = this.TVNavigator;

  this.hotjava = (agt.indexOf("hotjava") != -1);
  this.hotjava3 = (this.hotjava && (this.major == 3));
  this.hotjava3up = (this.hotjava && (this.major >= 3));

  // end new

  // *** JAVASCRIPT VERSION CHECK ***
  // Useful to workaround Nav3 bug in which Nav3
  // loads <SCRIPT LANGUAGE="JavaScript1.2">.
  // updated 020131 by dragle
  this.js;
  if (this.nav2 || this.ie3) this.js = 1.0;
  else if (this.nav3) this.js = 1.1;
  else if ((this.opera5)||(this.opera6)) this.js = 1.3; // 020214 - dmr
  else if (this.opera7up) this.js = 1.5; // 031010 - dmr
  else if (this.khtml) this.js = 1.5;   // 030110 - dmr
  else if (this.opera) this.js = 1.1;
  else if ((this.nav4 && (this.minor <= 4.05)) || this.ie4) this.js = 1.2;
  else if ((this.nav4 && (this.minor > 4.05)) || this.ie5) this.js = 1.3;
  else if (this.nav5 && !(this.nav6)) this.js = 1.4;
  else if (this.hotjava3up) this.js = 1.4; // new 020128 - abk
  else if (this.nav6up) this.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 (this.nav && (this.major > 5)) this.js = 1.4;
  else if (this.ie && (this.major > 5)) this.js = 1.3;
  else if (this.moz) this.js = 1.5;
  else if (this.fb||this.fx) this.js = 1.5; // 032504 - dmr

  // what about ie6 and ie6up for js version? abk

  // HACK: no idea for other browsers; always check for JS version
  // with > or >=
  else this.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) && this.ie5up) this.js = 1.4; // 020128 - abk

  // Done with this.minor testing; revert to real for N6/7
  if (this.nav6up) {
     this.minor = navigator.vendorSub;
  }

  // *** PLATFORM ***
  this.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.
  this.win95 = ((agt.indexOf("win95")!=-1) || (agt.indexOf("windows 95")!=-1));

  // is this a 16 bit compiled version?
  this.win16 = ((agt.indexOf("win16")!=-1) ||
             (agt.indexOf("16bit")!=-1) || (agt.indexOf("windows 3.1")!=-1) ||
             (agt.indexOf("windows 16-bit")!=-1) );

  this.win31 = ((agt.indexOf("windows 3.1")!=-1) || (agt.indexOf("win16")!=-1) ||
                  (agt.indexOf("windows 16-bit")!=-1));

	this.winme = ((agt.indexOf("win 9x 4.90")!=-1));    // new 020128 - abk
  this.win2k = ((agt.indexOf("windows nt 5.0")!=-1) || (agt.indexOf("windows 2000")!=-1)); // 020214 - dmr
  this.winxp = ((agt.indexOf("windows nt 5.1")!=-1) || (agt.indexOf("windows xp")!=-1)); // 020214 - dmr

  // 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".
  this.win98 = ((agt.indexOf("win98")!=-1) || (agt.indexOf("windows 98")!=-1));
  this.winnt = ((agt.indexOf("winnt")!=-1) || (agt.indexOf("windows nt")!=-1));
  this.win32 = (this.win95 || this.winnt || this.win98 ||
                  ((this.major >= 4) && (navigator.platform == "Win32")) ||
                  (agt.indexOf("win32")!=-1) || (agt.indexOf("32bit")!=-1));

  this.os2   = ((agt.indexOf("os/2")!=-1) ||
                  (navigator.appVersion.indexOf("OS/2")!=-1) ||
                  (agt.indexOf("ibm-webexplorer")!=-1));

  this.mac    = (agt.indexOf("mac")!=-1);
  if (this.mac) { this.win = !this.mac; } // dmr - 06/20/2002
  this.mac68k = (this.mac && ((agt.indexOf("68k")!=-1) ||
                             (agt.indexOf("68000")!=-1)));
  this.macppc = (this.mac && ((agt.indexOf("ppc")!=-1) ||
                              (agt.indexOf("powerpc")!=-1)));

  this.sun   = (agt.indexOf("sunos")!=-1);
  this.sun4  = (agt.indexOf("sunos 4")!=-1);
  this.sun5  = (agt.indexOf("sunos 5")!=-1);
  this.suni86= (this.sun && (agt.indexOf("i86")!=-1));
  this.irix  = (agt.indexOf("irix") !=-1);    // SGI
  this.irix5 = (agt.indexOf("irix 5") !=-1);
  this.irix6 = ((agt.indexOf("irix 6") !=-1) || (agt.indexOf("irix6") !=-1));
  this.hpux  = (agt.indexOf("hp-ux")!=-1);
  this.hpux9 = (this.hpux && (agt.indexOf("09.")!=-1));
  this.hpux10= (this.hpux && (agt.indexOf("10.")!=-1));
  this.aix   = (agt.indexOf("aix") !=-1);      // IBM
  this.aix1  = (agt.indexOf("aix 1") !=-1);
  this.aix2  = (agt.indexOf("aix 2") !=-1);
  this.aix3  = (agt.indexOf("aix 3") !=-1);
  this.aix4  = (agt.indexOf("aix 4") !=-1);
  this.linux = (agt.indexOf("inux")!=-1);
  this.sco   = (agt.indexOf("sco")!=-1) || (agt.indexOf("unix_sv")!=-1);
  this.unixware = (agt.indexOf("unix_system_v")!=-1);
  this.mpras    = (agt.indexOf("ncr")!=-1);
  this.reliant  = (agt.indexOf("reliantunix")!=-1);
  this.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));
  this.sinix = (agt.indexOf("sinix")!=-1);
  this.freebsd = (agt.indexOf("freebsd")!=-1);
  this.bsd = (agt.indexOf("bsd")!=-1);
  this.unix  = ((agt.indexOf("x11")!=-1) || this.sun || this.irix || this.hpux ||
               this.sco ||this.unixware || this.mpras || this.reliant ||
               this.dec || this.sinix || this.aix || this.linux || this.bsd || this.freebsd);

  this.vms   = ((agt.indexOf("vax")!=-1) || (agt.indexOf("openvms")!=-1));
// additional checks, abk
  this.anchors = (document.anchors) ? "true":"false";
  this.regexp = (window.RegExp) ? "true":"false";
  this.option = (window.Option) ? "true":"false";
  this.all = (document.all) ? "true":"false";
// cookies - 990624 - abk
  document.cookie = "cookies=true";
  this.cookie = (document.cookie) ? "true" : "false";
  this.images = (document.images) ? "true":"false";
  this.layers = (document.layers) ? "true":"false"; // gecko m7 bug?
// new doc obj tests 990624-abk
  this.forms = (document.forms) ? "true" : "false";
  this.links = (document.links) ? "true" : "false";
  this.frames = (window.frames) ? "true" : "false";
  this.screen = (window.screen) ? "true" : "false";

// java
  this.java = (navigator.javaEnabled());

// Flash checking code adapted from Doc JavaScript information;
// see http://webref.com/js/column84/2.html

  this.Flash        = false;
  this.FlashVersion = 0;

  if ((this.nav||this.opera||this.moz||this.fb||this.fx)||
      (this.mac&&this.ie5up)) {
     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) {
     if (plugin&&plugin.description) {
        this.Flash = true;
        this.FlashVersion = parseInt(plugin.description.substring(plugin.description.indexOf(".")-1));
     }
  }

  if (this.win&&this.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' +
        'this.FlashVersion = playerversion' + '\n' +
        'this.Flash = hasPlayer' + '\n' +
        '<\/sc' + 'ript>'
     );
  }

  this.transparency = (this.opera) ? false : true;
}  // function javaScriptBrowserSniffer
// JavaScript Browser Sniffer
// *****************************************************************************

var is=new javaScriptBrowserSniffer();

var ns=(document.layers)?1:0;
var ns6=(document.getElementById&&!document.all)?1:0;
var ie=document.all;

var loadedPictureZIndex_gl=100;
var loadedPicturesA_gl=new Array();

function hexCharToDez(sNumber) {
  if(sNumber.substr(0, 1).match(/[0-9]/)) {
    return sNumber.charCodeAt(0)-"0".charCodeAt(0);
  }
  if(sNumber.substr(0, 1).match(/[a-f]/)) {
    return sNumber.charCodeAt(0)-"a".charCodeAt(0)+10;
  }
  return 0;
}

function byteToDez(sNumber) {
  return hexCharToDez(sNumber.substr(0, 1))*16+hexCharToDez(sNumber.substr(1, 1));
}

function dezToHexChar(nNumber) {
  nNumber%=16;
  if((nNumber>=0)&&(nNumber<=9)) {
    return String.fromCharCode(nNumber+"0".charCodeAt(0));
  }
  if((nNumber>=10)&&(nNumber<=15)) {
    return String.fromCharCode(nNumber-10+"a".charCodeAt(0));
  }
  return "0";
}

function byteToHex(nNumber) {
  nNumber%=256;

  var nLowNibble=nNumber%16;
  var nHighNibble=(nNumber-nLowNibble)/16;
  var sRV="00";

  sRV=dezToHexChar(nHighNibble)+dezToHexChar(nLowNibble);

  return sRV;
}

function getObjectById(id) {
  if(ns) {
    return eval("document.layers['"+id+"']");
  }
  else if(ns6) {
    return eval("document.getElementById('"+id+"')");
  }
  else {
    return eval("document.all['"+id+"']");
  }
  return null;
}

function windowInnerWidth() {
  if(ns||ns6) {
    return window.innerWidth;
  }
  else {
    return document.body.clientWidth;
  }
}

function windowInnerHeight() {
  if(ns||ns6) {
    return window.innerHeight;
  }
  else {
    return document.body.clientHeight;
  }
}

function documentAreaWidth() {
  return windowInnerWidth()+(ns?(window.pageXOffset-20):document.body.scrollLeft);
}

function documentAreaHeight() {
  return windowInnerHeight()+(ns?window.pageYOffset-20:document.body.scrollTop);
}

function documentWidth() {
	return windowInnerWidth();
}

function documentHeight() {
	if(document.body.scrollHeight>document.body.offsetHeight) {
	  return document.body.scrollHeight;
	}
	else {
	  return document.body.offsetHeight;
	}
}

function documentScrollingOffsetX() {
	var x,y;
	if(self.pageYOffset) {
	  return self.pageXOffset;
	}
	else if(document.documentElement&&document.documentElement.scrollTop) {
	  return document.documentElement.scrollLeft;
	}
	else if(document.body) {
	  return document.body.scrollLeft;
	}
  return 0;
}

function documentScrollingOffsetY() {
	if(self.pageYOffset) {
	  return self.pageYOffset;
	}
	else if(document.documentElement&&document.documentElement.scrollTop) {
	  return document.documentElement.scrollTop;
	}
	else if(document.body) {
	  return document.body.scrollTop;
	}
  return 0;
}

function getObjectPositionX(oObj) {
  var nRV=0;
  if(oObj.offsetParent) {
    while(oObj.offsetParent) {
      nRV+=oObj.offsetLeft;
      oObj=oObj.offsetParent;
    }
  }
  else {
    if(oObj.x) {
      nRV+=oObj.x;
    }
  }
  return nRV;
}

function getObjectPositionY(oObj) {
  var nRV=0;
  if(oObj.offsetParent) {
    while(oObj.offsetParent) {
      nRV+=oObj.offsetTop;
      oObj = oObj.offsetParent;
    }
  }
  else {
    if(oObj.y) {
      nRV+=oObj.y;
    }
  }
  return nRV;
}

function getObjectWidth(oObj) {
  return (ns)?oObj.width:oObj.offsetWidth;
  return (ns)?oObj.width:(ie)?oObj.clientWidth:oObj.offsetWidth;
}

function getObjectHeight(oObj) {
  return (ns)?oObj.height:oObj.offsetHeight;
  return (ns)?oObj.height:(ie)?oObj.clientHeight:oObj.offsetHeight;
}

function getElementWidth(sId) {
  return getObjectWidth(getObjectById(sId));
}

function getElementHeight(sId) {
  return getObjectHeight(getObjectById(sId));
}

function setStatustext(text) {
  if(window.statusbar&&(window.statusbar.visible==true)) {
    window.defaultStatus=text;
  }
}

function loadPicture(id, file, imgExtra) {
  document.write("<div id='div_"+id+"' style='position:absolute; top:0; left:0; z-index:"+loadedPictureZIndex_gl+"; visibility:hidden; filter:alpha(opacity=100); -moz-opacity:1.0;'><img name='"+id+"' src='"+file+"' "+imgExtra+"></div>");
  loadedPictureZIndex_gl=loadedPictureZIndex_gl+1;
  loadedPicturesA_gl.push(id);
}

function reloadPicture(id) {
  document[id].src=document[id].src;
}

function showElement(id) {
  if(oObj=getObjectById(id)) {
    oObj.style.visibility="visible";
  }
}

function hideElement(id) {
  if(oObj=getObjectById(id)) {
    oObj.style.visibility="hidden";
  }
}

function showPicture(id) {
  showElement("div_"+id);
}

function hidePicture(id) {
  hideElement("div_"+id);
}

function moveElementTo(id, x, y) {
  if(oObj=getObjectById(id)) {
    if(ns) {
      oObj.left=x;
      oObj.top=y;
    }
    else {
      oObj.style.left=x+"px";
      oObj.style.top=y+"px";
    }
  }
}

function moveObjectTo(oObj, x, y) {
  if(ns) {
    oObj.left=x;
    oObj.top=y;
  }
  else {
    oObj.style.left=x+"px";
    oObj.style.top=y+"px";
  }
}

function movePictureTo(id, x, y) {
  moveElementTo("div_"+id, x, y);
}

function setElementTransparency(id, degree) {
  if(is.transparency) {
	  if(oObj=getObjectById(id)) {
	    if(ns||ns6) {
	      oObj.style.MozOpacity=degree/100.0;
	    }
	    else {
	      oObj.filters.alpha.opacity=degree;
	    }
	  }
  }
}

function setElementHTMLCode(sId, sCode) {
  if(oObj=getObjectById(sId)) {
	  if(ns) {
	    oObj.write(sCode);
	    oObj.close();
	  }
	  else {
	    oObj.innerHTML=sCode;
	  }
  }
}

function objPosX(obj)
{
	var curleft = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curleft += obj.offsetLeft
			obj = obj.offsetParent;
		}
	}
	else if (obj.x)
		curleft += obj.x;
	return curleft;
}

function objPosY(obj)
{
	var curtop = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curtop += obj.offsetTop
			obj = obj.offsetParent;
		}
	}
	else if (obj.y)
		curtop += obj.y;
	return curtop;
}

function setPictureTransparency(id, degree) {
  setElementTransparency("div_"+id, degree);
}

var aFadeInOutData_gl=new Array();

function timerFadePictureAndThenDo(nIndex) {
  aFadeInOutData_gl[nIndex]["degree"]+=aFadeInOutData_gl[nIndex]["degree_step"];
  if(aFadeInOutData_gl[nIndex]["direction"]=="in") {
	  if(aFadeInOutData_gl[nIndex]["degree"]>=100) {
	    aFadeInOutData_gl[nIndex]["degree"]=100;
	  }
  }
  else {
	  if(aFadeInOutData_gl[nIndex]["degree"]<=0) {
	    aFadeInOutData_gl[nIndex]["degree"]=0;
	  }
  }
  setPictureTransparency(aFadeInOutData_gl[nIndex]["id"], aFadeInOutData_gl[nIndex]["degree"]);
  if(((aFadeInOutData_gl[nIndex]["degree"]==100)&&(aFadeInOutData_gl[nIndex]["direction"]=="in"))
   ||((aFadeInOutData_gl[nIndex]["degree"]==0)&&(aFadeInOutData_gl[nIndex]["direction"]=="out"))) {
    aFadeInOutData_gl[nIndex]["timer"]=null;
    if(aFadeInOutData_gl[nIndex]["expression"]) {
      eval(aFadeInOutData_gl[nIndex]["expression"]);
    }
  }
  else {
    aFadeInOutData_gl[nIndex]["timer"]=window.setTimeout('timerFadePictureAndThenDo('+nIndex+')', aFadeInOutData_gl[nIndex]["timeout"]);
  }
}

function fadePictureAndThenDo(bDirection, sId, nMilliseconds, sExpression) {
  // bDirection -
  //   true: Fade in.
  //   false: Fade out.
  var nMinimumStepTime=25;
  var nIndex;

  // Get index of fader-array.
  nIndex=-1;
  for(var nI=0; nI<aFadeInOutData_gl.length; nI++) {
    if(aFadeInOutData_gl[nI]["id"]==sId) {
      nIndex=nI;
      break;
    }
  }
  // Remove old timer.
  if(nIndex>=0) {
    if(aFadeInOutData_gl[nIndex]["timer"]) {
	    window.clearTimeout(aFadeInOutData_gl[nIndex]["timer"]);
	    aFadeInOutData_gl[nIndex]["timer"]=null;
      if(bDirection) {
        hidePicture(sId);
      }
      else {
        showPicture(sId);
      }
    }
  }
  // Create new entry in fader-array.
  if(nIndex==-1) {
    nIndex=aFadeInOutData_gl.length;
    aFadeInOutData_gl.push(new Object());
  }
  aFadeInOutData_gl[nIndex]["id"]=sId;
  aFadeInOutData_gl[nIndex]["direction"]=(bDirection?"in":"out");
  aFadeInOutData_gl[nIndex]["degree"]=(bDirection?0:100);
  aFadeInOutData_gl[nIndex]["expression"]=sExpression;
  if((nMilliseconds/100)>=nMinimumStepTime) {
    aFadeInOutData_gl[nIndex]["degree_step"]=(bDirection?1:-1);
    aFadeInOutData_gl[nIndex]["timeout"]=(nMilliseconds/100);
  }
  else {
    aFadeInOutData_gl[nIndex]["degree_step"]=(bDirection?1:-1)*nMinimumStepTime*100/nMilliseconds;
    aFadeInOutData_gl[nIndex]["timeout"]=nMinimumStepTime;
  }
  oFadeInTimer_gl=window.setTimeout('timerFadePictureAndThenDo('+nIndex+')', aFadeInOutData_gl[nIndex]["timeout"]);
}

function fadePictureInAndThenDo(sId, nMilliseconds, sExpression) {
  fadePictureAndThenDo(true, sId, nMilliseconds, sExpression);
}

function fadePictureOutAndThenDo(sId, nMilliseconds, sExpression) {
  fadePictureAndThenDo(false, sId, nMilliseconds, sExpression);
}

// Some basic Javascript-functions from Douglas Crockford, www.crockford.com
function isBoolean(a) {
  return typeof(a)=='boolean';
}

function isFunction(a) {
  return typeof(a)=='function';
}

function isNull(a) {
  return typeof(a)=='object'&&!a;
}

function isNumber(a) {
  return typeof(a)=='number'&&isFinite(a);
}

function isObject(a) {
  return(a&&typeof(a)=='object')||isFunction(a);
}

function isString(a) {
  return typeof(a)=='string';
}

function isUndefined(a) {
  return typeof(a)=='undefined';
}

function isDefined(a) {
  if(!isUndefined(a)) {
    return !isNull(a);
  }
  return false;
}

function isAlien(a) {
  return isObject(a)&&typeof(a.constructor)!='function';
}

function isArray(a) {
  return isObject(a)&&a.constructor==Array;
}

function isEmpty(o) {
  var i, v;
  if(isObject(o)) {
    for(i in o) {
      v=o[i];
      if(isUndefined(v)&&isFunction(v)) {
        return false;
      }
    }
  }
  return true;
}