function DetectBrowser()
{
   var oldOnError = window.onerror;
   var element = null;

   window.onerror = null;

   // work around bug in xpcdom Mozilla 0.9.1
   window.saveNavigator = window.navigator;

   navigator.OS    = '';
   navigator.version  = parseFloat(navigator.appVersion);
   navigator.org    = '';
   navigator.family  = '';

   var platform;
   if (typeof(window.navigator.platform) != 'undefined')
   {
      platform = window.navigator.platform.toLowerCase();
      if (platform.indexOf('win') != -1)
         navigator.OS = 'win';
      else if (platform.indexOf('mac') != -1)
         navigator.OS = 'mac';
      else if (platform.indexOf('unix') != -1 || platform.indexOf('linux') != -1 || platform.indexOf('sun') != -1)
         navigator.OS = 'nix';
   }

   var i = 0;
   var ua = window.navigator.userAgent.toLowerCase();

   if (ua.indexOf('opera') != -1)
   {
      i = ua.indexOf('opera');
      navigator.family  = 'opera';
      navigator.org    = 'opera';
      navigator.version  = parseFloat('0' + ua.substr(i+6), 10);
   }
   else if ((i = ua.indexOf('msie')) != -1)
   {
      navigator.org    = 'microsoft';
      navigator.version  = parseFloat('0' + ua.substr(i+5), 10);
      navigator.family = 'ie'
   }
   else if ((i = ua.indexOf('chrome')) != -1)
   {
      navigator.org    = 'google';
      navigator.version  = parseFloat('0' + ua.substr(i+7), 11);
      navigator.family = 'chrome';
   }
   else if (i = ua.indexOf('safari') != -1)
   {
      navigator.org    = 'apple';
      navigator.version  = parseFloat('0' + ua.substr(i+7), 5);
      navigator.family = 'safari'
   }
   else if (ua.indexOf('gecko') != -1)
   {
      navigator.family = 'gecko';
      var rvStart = navigator.userAgent.indexOf('rv:') + 3;
      var rvEnd = navigator.userAgent.indexOf(')', rvStart);
      var rv = navigator.userAgent.substring(rvStart, rvEnd);
      var decIndex = rv.indexOf('.');
      if (decIndex != -1)
      {
         rv = rv.replace(/\./g, '')
         rv = rv.substring(0, decIndex) + '.' + rv.substr(decIndex)
      }
      navigator.version = parseFloat(rv);

      if (ua.indexOf('netscape') != -1)
         navigator.org = 'netscape';
      else if (ua.indexOf('compuserve') != -1)
         navigator.org = 'compuserve';
      else
         navigator.org = 'mozilla';
   }
   else if ((ua.indexOf('mozilla') !=-1) && (ua.indexOf('spoofer')==-1) && (ua.indexOf('compatible') == -1) && (ua.indexOf('opera')==-1)&& (ua.indexOf('webtv')==-1) && (ua.indexOf('hotjava')==-1))
   {
      var is_major = parseFloat(navigator.appVersion);

      if (is_major < 4)
         navigator.version = is_major;
      else
      {
         i = ua.lastIndexOf('/')
         navigator.version = parseFloat('0' + ua.substr(i+1), 10);
      }
      navigator.org = 'netscape';
      navigator.family = 'nn' + parseInt(navigator.appVersion);
   }
   else if ((i = ua.indexOf('aol')) != -1 )
   {
      // aol
      navigator.family  = 'aol';
      navigator.org    = 'aol';
      navigator.version  = parseFloat('0' + ua.substr(i+4), 10);
   }
   else if ((i = ua.indexOf('hotjava')) != -1 )
   {
      // hotjava
      navigator.family  = 'hotjava';
      navigator.org    = 'sun';
      navigator.version  = parseFloat(navigator.appVersion);
   }

   window.onerror = oldOnError;
}
function openwin(sUrl, sName, nWidth, nHeight, bScroll)
{
   var nTop = (window.screen.availHeight - nHeight)/2;
   var nLeft = (window.screen.availWidth - nWidth)/2;
   var szFeatures = "width=" + nWidth +",height=" + nHeight + ",left="+nLeft+",top="+nTop+",resizable=yes,status";

    if (bScroll)
    {
        szFeatures += ",scrollbars=yes";
    }
   return(window.open(sUrl,sName,szFeatures));
}
function openchildwin(sUrl, sName, nTop, nLeft, nWidth, nHeight)
{
    try
    {
        closechildwin(sName);
        var win = oToolBar.oPresWin;
        var doc = win.document;

        var zeroY, zeroX;
        if (typeof(document.body.scrollLeft)!= 'undefined')
        {
            zeroX = doc.body.scrollLeft;
            zeroY = doc.body.scrollTop;
        }
        else
        {
            zeroX = win.pageXOffset;
            zeroY = win.pageYOffset;
        }

        nLeft += zeroX;
        var oFr = doc.createElement("iframe");
        oFr.id = "cw_" + sName;
      var s = oFr.style;
      s.position = "absolute";
        s.width = nWidth + "px";
        s.height = nHeight + "px";
        s.left = nLeft + "px";
        s.top = zeroY + "px";
        s.border = "none";
        s.zIndex = 1;

      oFr.src = sUrl;
        doc.body.appendChild(oFr);
        return null;
    }
    catch(err)
    {
        var windowProperties="toolbar=no,location=no,status=no,menubar=no,scrollbars=auto,resizable=no,alwaysRaised,dependent,titlebar=no";
        var szFeatures = "width=" + nWidth +",height=" + nHeight + ",left="+nLeft+",top="+nTop+"," + windowProperties;
        return(window.open(sUrl,sName,szFeatures));
    }
}
function closechildwin(sName, bSelf)
{
    try {
        // if oTopWin is defined in the page which includes this script, use it; otherwise, refer to the 'top' window
        var topWindow = window.oTopWin || window.top;
        topWindow.htChildWindows[sName].close();
    } catch (err) {}
    /*
    var doc = bSelf ? parent.document : oToolBar.oPresWin.document;
    var oFr = doc.getElementById("cw_" + sName);
    var oOl = doc.getElementById("ol_" + sName);
    if(oFr)
    {
        doc.body.removeChild(oFr);
    }
    if(oOl)
    {
        doc.body.removeChild(oOl);
    }
    */
}

function color(img)
{
   var x = document.getElementById(img);
   if (x.style)
       x.style.filter=false;
   x.border = 1;
}

function gray(img)
{
   var x = document.getElementById(img);
   if (x.pressed)
      return;
   if (x.style)
       x.style.filter="gray()";
   x.border = 0;
}

function touch(id)
{
   //highlight(id,false)
}

function makeclean(id)
{
   var oImg = document.getElementById(id);
   if (!oImg)
     return;
   if (!oImg.filters)
     return;

   oImg.filters.alpha.opacity=100
}

function makefoggy(id)
{
   var oImg = document.getElementById(id);
   if (!oImg)
     return;
   if (!oImg.filters)
     return;

   oImg.filters.alpha.opacity=60;
}
function highlight(id,bOn)
{
   var o=document.getElementById(id);
   var sBasicClass = (String(o.className).split('_'))[0];
   if (o.buttondisabled)
      return;

   if (bOn || o.pressed)
      o.className = sBasicClass + "_highlighted";
   else
      o.className = sBasicClass;
}
function hover(id,bOn)
{
   var o=document.getElementById(id);
   var sBasicClass = (String(o.className).split('_'))[0];
   if (o.buttondisabled)
      return;

   if (bOn || o.pressed)
      o.className = sBasicClass + "_hovered";
   else
      o.className = sBasicClass;
}
function enablebutton(id, bEnable)
{
   var o=document.getElementById(id);
   var sBasicClass = (String(o.className).split('_'))[0];
   if (bEnable)
   {
      o.className = sBasicClass;
      o.onmouseup = (o.old_onmouseup ? o.old_onmouseup : o.onmouseup);
      o.buttondisabled = false;
   }
   else
   {
      o.className = sBasicClass + "_disabled";
      o.old_onmouseup = o.onmouseup;
      o.onmouseup = null;
      o.buttondisabled = true;
   }
}
function enableinput(id, bEnable)
{
   var o=document.getElementById(id);
   var sBasicClass = (String(o.className).split('_'))[0];
   if (bEnable)
   {
      o.className = sBasicClass;
      o.disabled = false;
   }
   else
   {
      o.className = sBasicClass + "_disabled";
      o.disabled = true;
   }
}
function GetCookie(sName)
{
   var aCookie = document.cookie.split("; ");
   for (var i=0; i < aCookie.length; i++)
   {
    var aCrumb = aCookie[i].split("=");
    if (sName == aCrumb[0])
      return unescape(aCrumb[1]);
   }
   return "";
}
function SetCookie(sName, sValue, sPath)
{
   if (sValue == "")
   {
     DelCookie(sName);
     return;
   }

   date = new Date(2010,1,1);
   var sCookie = sName + "=" + escape(sValue) + "; expires=" + date.toGMTString();

    if (sPath)
        sCookie += "; path=" + sPath;

    document.cookie = sCookie;
}
function DelCookie(sName)
{
   document.cookie = sName + "=0; expires=Fri, 31 Dec 1999 23:59:59 GMT;";
}
function AddUrlVar(sUrl,sVar)
{
   var szUrl = new String(sUrl);
   szUrl += (szUrl.indexOf("?") != -1) ? "&" : "?";
   szUrl += sVar;
   return szUrl;
}
function InsertStyleSheet(url)
{
   if (url)
   {
      var oHead = document.getElementsByTagName("head")[0];
      var oLink = document.createElement('link');
      oLink.rel = "stylesheet";
      oLink.type = "text/css";
      oLink.href = url;
      oHead.appendChild(oLink);
   }
}
function SetStyleByClass(t,c,p,v){
    var elements;
    if(t == '*') {
         // '*' not supported by IE/Win 5.5 and below
         elements = (ie) ? document.all : document.getElementsByTagName('*');
    } else {
         elements = document.getElementsByTagName(t);
    }
    for(var i = 0; i < elements.length; i++){
         var node = elements.item(i);
         for(var j = 0; j < node.attributes.length; j++) {
              if(node.attributes.item(j).nodeName == 'class') {
                   if(node.attributes.item(j).nodeValue == c) {
                        eval('node.style.' + p + " = '" +v + "'");
                   }
              }
         }
    }
}
function GetElementScreenXY(id)
{
    var o = document.getElementById(id);
    var oPoint = new Object();

    if (isNaN(window.screenX)) {
        oPoint.x=o.offsetLeft-document.body.scrollLeft+window.screenLeft;
        oPoint.y=o.offsetTop-document.body.scrollTop+window.screenTop;
        }
    else {
        oPoint.x=o.offsetLeft+window.screenX+(window.outerWidth-window.innerWidth);
        oPoint.y=o.offsetTop+window.screenY + 24;
        }

    return oPoint;
}

function xml_string(xml)
{
   this.string = xml;
   this.get_text = get_text;
   this.get_unescaped = get_unescaped;

   function get_text(tag)
   {
      var sVal = "";
      var sOpen = new String("<" + tag + ">");
      var sClose = new String("</" + tag + ">");
      var nOpen = this.string.indexOf(sOpen);
      if (nOpen < 0)
         return sVal;
      var nClose = this.string.indexOf(sClose);
      if (nClose < 0)
         return sVal;
      sVal = this.string.substring(nOpen + sOpen.length, nClose)
      this.string = this.string.substring(0, nOpen) + this.string.substring(nClose + sClose.length);

      return(sVal);
   }
   function get_unescaped(tag)
   {
      var sOut = this.get_text(tag);
      var re = /\&amp;/g;
      sOut = sOut.replace(re, "&");
      re = /\&apos\;/g;
      sOut = sOut.replace(re, "\'");
      re = /\&quot\;/g;
      sOut = sOut.replace(re, "\"");
      re = /\&lt\;/g;
      sOut = sOut.replace(re, "<");
      re = /\&#10\;/g;
      sOut = sOut.replace(re, "\n");
      re = /\&#13\;/g;
      sOut = sOut.replace(re, "\r");
      re = /\&#153\;/g;
      sOut = sOut.replace(re, "\x99");
      re = /\&#169\;/g;
      sOut = sOut.replace(re, "\xA9");
      return(sOut);
   }
}
function Trim(str) {
   var x = new String(str);
   x=x.replace(/^\s+/,'');
   x=x.replace(/\s+$/,'');
   return x;
}

function SetDomainByLocation()
{
    var szServer = new String(window.location.hostname);
    var nPos = szServer.indexOf('.');
    var szDomain = "";
    var szHost = "";

    if (nPos > 0)
    {
        szHost = szServer.substr(0, nPos);

        if (isNaN(szHost))
        {
            szDomain = szServer.substr(nPos+1);
            window.document.domain = szDomain;
        }
    }
}

function get_query_string(str)
{
    var htQueryString = {};

    if (str.indexOf("?") > -1)
    {
        var sQuery = str.split("?");
        if (sQuery.length > 1)
        {
            var sVars = sQuery[1];
            sVars = sVars.split("&");
            for (var i= 0; i < sVars.length; i++)
            {
                var sPair = (sVars[i]).split("=");
                var sKey = (sPair.length > 0 ? new String(sPair[0]) : null);
                if (sKey != null)
                {
                    var sVal = (sPair.length == 2 ? new String(sPair[1]) : "");
               htQueryString[sKey] = unescape(sVal);
                }
            }
        }
    }
    return htQueryString;
}


function XMLEscape(str,bRealXml)
{
   if (!str || str.length == 0)
       return "";
   var sOut = new String(str);
   var re = /\&/g;
   sOut = sOut.replace(re, "\&amp;");
   re = /\'/g;
   sOut = sOut.replace(re, "\&apos;");
   re = /\"/g;
   sOut = sOut.replace(re, "\&quot\;");
   re = /\</g;
   sOut = sOut.replace(re, "\&lt\;");

   if (bRealXml == null)
   {
   re = /\n/g;
   sOut = sOut.replace(re, "\&#10\;");
   re = /\r/g;
   sOut = sOut.replace(re, "\&#13\;");
   }

   re = /\xA9/g;	// copyright
   sOut = sOut.replace(re, "\&#169;");
   re = /\x99/g;	// trademark
   sOut = sOut.replace(re, "\&#153;");
   return sOut;
}

function URIEscape(str)
{
   if (!str || str.length == 0)
       return "";
   var sOut = new String(str);
   var re = /\%/g;
    sOut = sOut.replace(re, "%25");
    re = /\&/g;
   sOut = sOut.replace(re, "%26");
   re = /\?/g;
   sOut = sOut.replace(re, "%3F");
    re = /\#/g;
    sOut = sOut.replace(re, "%23");
    re = /\:/g;
    sOut = sOut.replace(re, "%3A");
   re = /\\/g;
    sOut = sOut.replace(re, "%5C");
   re = /\//g;
    sOut = sOut.replace(re, "%2F");
    re = /\ /g;
    sOut = sOut.replace(re, "%20");
    re = /\r/g;
    sOut = sOut.replace(re, "%0D");
    re = /\n/g;
    sOut = sOut.replace(re, "%0A");

    return sOut;
}

function HTMLEscape(str)
{
   if (!str || str.length == 0)
       return "";
   var sOut = new String(str);
   re = /\</g;
   sOut = sOut.replace(re, "\&#60\;");
    return sOut;
}
function JSEscape(str)
{
   if (!str || str.length == 0)
       return "";
   var sOut = new String(str);
   re = /'/g;
   sOut = sOut.replace(re, "\\'");
    return sOut;
}
function sprintf(format)
{
    var LEFT_JUSTIFY =      0x01,
         LEADING_ZEROES =    0x02,
         SIGNED =            0x04,
         EXPECT_PRECISION =  0x08,
         FORMAT_ERROR =      0x10,
         ARG_SUBBED =        0x20,
         EXPECT_CONVERSION = 0x40;

    function isdigit(ch)
    {
         if (ch < '0' || ch > '9')
              return (0);
         return (1);
    }

    function string_inside_field(str, field_width, option)
    {
        var block, i;

        if (typeof(str) == "undefined" || typeof(field_width) ==
    "undefined" ||
                         typeof(option) == "undefined" || field_width <= 0)
             return (null);
        block = "";
        if (option & LEFT_JUSTIFY)
             block += str;
        for (i = field_width - str.length; i > 0; i--)
             block += " ";
        if ((option & LEFT_JUSTIFY) == 0)
             block += str;
        return (block);
    }

   var i, state, idx, precision, fwidth, argn, val, buf, str, len,
          buflen, valstr;

   state = 0;
   argn = 1;
    format = String(format);
   if (typeof(format) == "undefined" || typeof(format) == "null" ||
                                  typeof(format) != "string")
       return (-1);
   // count args in format and those
   buf = "";
   while ((idx = format.search(/%/)) >= 0)
   {
       if (idx > 0)
       buf += format.slice(0, idx);
       idx++;
       do {
          switch (ch = format.charAt(idx))
          {
          case 'l':
          case 'h':
             if ((state & EXPECT_CONVERSION) != 0)
             {
                 state |= FORMAT_ERROR;
                 break;
             }
             break;
          case 'u':
             arguments[argn] &= 0x7ffffff;
          case 'd':
          case 'i':
             val = arguments[argn++];
             state |= ARG_SUBBED;
             idx++;
             if (typeof(val) == "undefined")
             {
                buf += " ";
                break;
             }
             val = parseInt(val.toString());
             if (isNaN(val) || val == Number.NEGATIVE_INFINITY ||
                  val == Number.POSITIVE_INFINITY)
             {
                  buf += " ";
                  break;
             }
             valstr = new String(val);
             if (typeof(fwidth) == "undefined")
                 fwidth = valstr.length;
             buflen = valstr.length;
             if ((state & LEFT_JUSTIFY) == 0)
                 valstr = "";
             for (i = fwidth - buflen; i > 0; i--)
                if ((state & LEADING_ZEROES) == 0 ||
                               (state & LEFT_JUSTIFY) != 0)
                   valstr += " ";
                else
                   valstr += "0";
             if ((state & LEFT_JUSTIFY) == 0)
                valstr += val;
             buf += valstr;
             break;
          case 'x':
          case 'X':
             hexval = parseInt(arguments[argn++].toString());
             hexadecimal = new String(2 *
                    (Math.log(hexval)/Math.log(10) + 1) *
                     Math.log(10) / Math.log(16));
             i = 0;
             while (hexval > Math.pow(16, i))
                 i++;
             i--;
             while (i >= 0)
                 ;
             if (hexadecimal.length < fwidth)
                format_integer(hexadecimal, state, fwidth);
             delete hexadecimal;
             break;
          case 'p': /* pointers not allowed */
             break;
          case 'o':
             break;
          case 'e':
          case 'E':
          case 'f':  /* default is [-]ddd.ddd or %6.3f */
             idx++;
             state |= ARG_SUBBED;
             if (typeof(precision) == "undefined")
                precision = 3;
             if (typeof(fwidth) == "undefined")
                fwidth = 6;
             if (precision > fwidth)
                fwidth = precision;
             val = arguments[argn++];
             if (typeof(val) == "undefined")
             {
                buf += " ";
                break;
             }
             val = parseFloat(val.toString());
             if (isNaN(val) || val == Number.NEGATIVE_INFINITY ||
                    val == Number.POSITIVE_INFINITY)
             {
                buf += " ";
                break;
             }
             valstr = new String(val);
             if ((i = valstr.indexOf(".")) < 0)
             {
                 valstr += ".";
                 for (i = 0; i < precision ; i++)
                    valstr += "0";
             }
             else if (valstr.length - i > precision)
             {
                 delete valstr;
                 val = Math.round(val * Math.pow(10, precision))
                          / Math.pow(10, precision);
                 valstr = new String(parseFloat(val.toString()));
                 if ((i = valstr.indexOf(".")) < 0)
                 {
                     i = 0;
                     valstr += ".";
                 }
                 else
                 {
                     valstr = valstr.substring(0, i + precision + 1);
                     i = valstr.length - i - 1;
                 }
                 while (i++ < precision)
                    valstr += "0";
             }
             if ((state & SIGNED) != 0 && val > 0.0)
                valstr = "+" + valstr;
             if (fwidth > valstr.length)
                if ((state & LEFT_JUSTIFY) != 0)
             for (i = fwidth - valstr.length; i > 0; i--)
                valstr += " ";
             else if ((state & LEADING_ZEROES) != 0)
                for (i = fwidth - valstr.length; i > 0; i--)
                    valstr = "0" + valstr;
             else
                for (i = fwidth - valstr.length; i > 0; i--)
                    valstr = " " + valstr;
             buf += valstr;
             break;
          case 'g':
          case 'G':
             break;
          case '-':
             if ((state & EXPECT_CONVERSION) != 0)
             {
                 state |= FORMAT_ERROR;
                 break;
             }
             if ((state & EXPECT_PRECISION) == 0)
                 state |= LEFT_JUSTIFY;
             idx++;
             break;
          case '*':
             if ((state & EXPECT_CONVERSION) != 0)
             {
                state |= FORMAT_ERROR;
                break;
             }
             if ((state & EXPECT_PRECISION) == 0)
                fwidth = parseInt(arguments[argn++].toString());
             else
                precision = parseInt(arguments[argn++].toString());
             break;
          case '+':
             if ((state & EXPECT_CONVERSION) != 0)
             {
                state |= FORMAT_ERROR;
                break;
             }
             if ((state & EXPECT_PRECISION) == 0)
                state |= SIGNED;
             idx++;
             break;
          case '.':
             if ((state & EXPECT_CONVERSION) != 0)
             {
                state |= FORMAT_ERROR;
                break;
             }
             if ((state & EXPECT_PRECISION) != 0)
                state |= FORMAT_ERROR;
             else
                state |= EXPECT_PRECISION;
             idx++;
             break;
          case ' ': /* if there is a sign, this is ignored */
             if ((state & EXPECT_CONVERSION) != 0)
             {
                 state |= FORMAT_ERROR;
                 break;
             }
             if ((state & SIGNED) == 0)
                 break;
             break;
          case '#':
             break;
          case '%':
             if ((state & EXPECT_CONVERSION) != 0)
             {
                 state |= FORMAT_ERROR;
                 break;
             }
             buf += "%";
             format = format.substr(idx);
             state |= ARG_SUBBED;
             break;
          case 's':
             state |= ARG_SUBBED;
             idx++;
             str = arguments[argn++];
             if (typeof(str) == "undefined")
             {
                buf += " ";
                break;
             }
             if (typeof(str) != "string")
                str = str.valueOf().toString();
             if (typeof(precision) == "undefined" ||
                                precision == null)
             {
                if (typeof(fwidth) == "undefined" || fwidth == null)
                    buf += str;
                else /* fwidth specifies a minimum width */
                    buf += string_inside_field(str, fwidth, state);
             }
             else if (typeof(fwidth) == "undefined" || fwidth == null)
             {
                /* precision specifies maximum! */
                if (precision < str.length)
                   buf += str.slice(0, precision);
                else
                   buf += str;
             }
             else
             {
        /* precision specifies maximum and overrides fwidth value! */
                if (precision < fwidth)
                   if (precision < str.length)
                      buf += str.slice(0, precision);
                   else
                      buf += string_inside_field(str, fwidth, state);
                else
                   if (precision < str.length)
                      buf += str.slice(0, precision);
                   else if (fwidth < str.length)
                      buf += string_inside_field(str, fwidth, state);
                   else
                      buf += str;
              }
              break;
           case 'c':
              break;
           case '0':
              if ((state & EXPECT_CONVERSION) != 0)
              {
                  state |= FORMAT_ERROR;
                  break;
              }
              if ((state & EXPECT_PRECISION) == 0)
                 state |= LEADING_ZEROES;
              break;
           default:
              if ((state & EXPECT_CONVERSION) != 0)
              {
                  state |= FORMAT_ERROR;
                  break;
              }
              i = val = 0;
              while (isdigit(ch = format.charAt(idx)) == true)
              {
                 val = Number(ch) + 10 * val;
                 idx++;
              }
              if (state & EXPECT_PRECISION)
              {
                 precision = val;
                 state |= EXPECT_CONVERSION;
              }
              else
                 fwidth = val;
          }
       } while ((state & (ARG_SUBBED | FORMAT_ERROR)) == 0);
       state = 0;
       format = format.substr(idx);
       precision = fwidth = null;
    }
    buf += format;
    return (buf);
}

// Returns true if chkVer is the same or newer than srvVer
// ex. 7.0.1.0 + 7.0.2.0 returns true, 7.1.1.0 and 7.0.2.0 returns false
// NOTE - this function is cut/pasted in: servermisc.asp clientmisc.asp and common.js
function RevCheck(srvVer,chkVer)
{
   var bIsOK = false; // assume
   var aInstalledRev = chkVer.split(".");
   var aServerRev    = srvVer.split(".");
   if (chkVer == "unknown")
       {
       bIsOK = false;
       }
   else if (aInstalledRev[0] > aServerRev[0])
       {
         bIsOK = true;
       }
   else if ((aInstalledRev[0] == aServerRev[0]) &&
       (aInstalledRev[1] == aServerRev[1]))
       {
       var nInstalledState = "10"; // R
       var nServerState    = "10"; // R
       var sInstalledState = aInstalledRev[2].substring(0,1);
       var sServerState    = aServerRev[2].substring(0,1);

       if (sInstalledState == "P")
          nInstalledState = 2;
       else if (sInstalledState == "A")
          nInstalledState = 3;
       else if (sInstalledState == "B")
          nInstalledState = 4;
       else if (sInstalledState == "F")
          nInstalledState = 5;
       else if (sInstalledState == "R")
          nInstalledState = 10;

       if (sServerState == "P")
          nServerState = 2;
       else if (sServerState == "A")
          nServerState = 3;
       else if (sServerState == "B")
          nServerState = 4;
       else if (sServerState == "F")
          nServerState = 5;
       else if (sServerState == "R")
          nServerState = 10;

       if (nInstalledState > nServerState)
          {
          bIsOK = true;
          }
       else if (nInstalledState == nServerState)
          {
          var nIrev = parseInt(aInstalledRev[2].substring(1,aInstalledRev[2].length))
          var nSrev = parseInt(aServerRev[2].substring(1,aServerRev[2].length));
          if (nIrev >= nSrev)
              {
              bIsOK = true;
              }
          }
       }
   else
      {
      // Special case any 7.1 ok for 7.0
      if ((aServerRev[0]    == "7") &&
          (aServerRev[1]    == "0") &&
          (aInstalledRev[0] == "7") &&
          (aInstalledRev[1] == "1"))
         bIsOK = true;
      }
   return bIsOK;
}

function toggle_pane(o, div, height, alt)
{
  var oDiv = document.getElementById(div);
  if (!oDiv)
    return;

  var e_alt = "";
  var c_alt = "";
  if(alt && alt.length > 1){
	e_alt = alt[0];
	c_alt = alt[1];
  }

  if (o.src.indexOf("collapse") != -1)
  {
    o.src = "images/roster/expand.gif";
	o.alt = e_alt;
	o.title = e_alt;
//    oDiv.style.display = "none";
    oDiv.style.height = '0px';
  }
  else
  {
    o.src = "images/roster/collapse.gif";
	o.alt = c_alt;
	o.title = c_alt;
//    oDiv.style.display = "";
    oDiv.style.height = height;
  }
}
function HttpSleep(sec)
{
  xmlhttp=null;
  if (window.XMLHttpRequest)
    {
      xmlhttp=new XMLHttpRequest();
    }
  else if (window.ActiveXObject)
    {
      xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    }
  if (xmlhttp!=null)
    {
      xmlhttp.open("GET","/webagent/main.asp?call=Sleep&sec=" + sec,false);
      xmlhttp.send(null);
    }
}
function IsJavaEnabled()
{
  var bJavaEnabled = true;
  var sJavaVendor;
  var sJavaVer;
  var sApplet;
  var ua = window.navigator.userAgent.toLowerCase();
  window.java = new Object();
  window.java.vendor = 0;
  window.java.version = 0;

  if (ua.indexOf("gecko") != -1 && ua.indexOf("like gecko") == -1 && navigator.mimeTypes)
  {
     if (typeof(navigator.mimeTypes['application/x-java-vm']) == "undefined")
       return false;
  }

  // see if it's already there
  try
  {
    oDetectVM = document.getElementById("detectVM");
  }
  catch(err)
  {
    oDetectVM = null;
  }

  if (oDetectVM == null)
  {
      if (window.ActiveXObject)
      {
         sApplet='<OBJECT ' +
                 'classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" width="0" height="0" id="detectVM">' +
                 '<PARAM name="code" value="detectVM.class">' +
                 '<PARAM name="codebase" value="/browser/">' +
                 '</OBJECT>';
      }
      else
      {
        sApplet="<applet codebase='/browser/' code='detectVM.class' height='0' width='0' id='detectVM'></APPLET>";
      }

      var oAppletDiv = document.createElement("div");
      oAppletDiv.id = "_javacheck";
      oAppletDiv.innerHTML = sApplet;
      document.body.appendChild(oAppletDiv);
}

  var i;
  for (i=0; i<5; i++)
  {
    try
    {
      oDetectVM = document.getElementById("detectVM");
      
      sJavaVendor = new String(oDetectVM.getVendor());
      sJavaVer = new String(oDetectVM.getVersion());
  
      window.java.vendor = sJavaVendor;
      window.java.version = sJavaVer;
      break;
    }
    catch(err)
    {
  	   HttpSleep(1); 
	}
		
    bJavaEnabled = false;
  }
  if (!bJavaEnabled && window.ActiveXObject)
  {
	try{
			if (new ActiveXObject("JavaWebStart.isInstalled.1.8.0.0"))
			{
				bJavaEnabled = true;
				sJavaVer = new String("1.8.0");
			}
	}
	catch(e)
	{
	}
	try{
			if (new ActiveXObject("JavaWebStart.isInstalled.1.7.0.0"))
			{
				bJavaEnabled = true;
				sJavaVer = new String("1.7.0");
			}
	}
	catch(e)
	{
	}
	try{
			if (new ActiveXObject("JavaWebStart.isInstalled.1.6.0.0"))
			{
				bJavaEnabled = true;
				sJavaVer = new String("1.6.0");
			}
	}
	catch(e)
	{
	}
	try{
			if (new ActiveXObject("JavaWebStart.isInstalled.1.5.0.0"))
			{
				bJavaEnabled = true;
				sJavaVer = new String("1.5.0");
			}
	}
	catch(e)
	{
	}
}

  if (bJavaEnabled)
  {
    var aJavaVer = sJavaVer.split(".");
    if (aJavaVer[1] < 5)
      bJavaEnabled = false;
  }

  return bJavaEnabled;
}

function IsFlashEnabled() {
    // Adapted from http://www.adobe.com/products/flashplayer/download/detection_kit/
    var isIE  = (navigator.appVersion.indexOf("MSIE") != -1) ? true : false;
    var isWin = (navigator.appVersion.toLowerCase().indexOf("win") != -1) ? true : false;
    var isOpera = (navigator.userAgent.indexOf("Opera") != -1) ? true : false;

    var vStr;

    if (navigator.plugins != null && navigator.plugins.length > 0) {
        if (navigator.plugins["Shockwave Flash 2.0"] || navigator.plugins["Shockwave Flash"]) {
            var swVer2 = navigator.plugins["Shockwave Flash 2.0"] ? " 2.0" : "";
            var desc = navigator.plugins["Shockwave Flash" + swVer2].description;
            var descArr = desc.split(" ");
            var tArr = descArr[2].split(".");
            var major = tArr[0];
            var minor = tArr[1];
            if ( descArr[3] != "" ) {
                tArr = descArr[3].split("r");
            } else {
                tArr = descArr[4].split("r");
            }
            var revision = tArr[1] > 0 ? tArr[1] : 0;
            vStr = major + "." + minor + "." + revision;
        }
    } else if (isIE && isWin && !isOpera) {
        var axo;
        try {
            axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");
            vStr = axo.GetVariable("$version");
        } catch (e) {}
        if (!vStr) {
            try {
                axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");
                vStr = "WIN 6,0,21,0";
                axo.AllowScriptAccess = "always";
                vStr = axo.GetVariable("$version");
            } catch (e) {}
        }
        if (!vStr) {
            try {
                axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.3");
                vStr = axo.GetVariable("$version");
            } catch (e) {}
        }
        if (!vStr) {
            try {
                axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.3");
                vStr = "WIN 3,0,18,0";
            } catch (e) {}
        }
        if (!vStr) {
            try {
                axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
                vStr = "WIN 2,0,0,11";
            } catch (e) {}
        }
        if (vStr) {
            // "WIN 9,0,45,0" -> "9.0.45"
            vStr = vStr.split(" ")[1].split(",").slice(0,-1).join(".");
        }
    }
    if (vStr) {
        var vArr = vStr.split(".");
        window.flash = {version:vStr, majorVersion:vArr[0], minorVersion:vArr[1], revision:vArr[2]};
		if(window.flash.majorVersion>=8)
		{
			if(window.flash.minorVersion>=0)
			{
				if(window.flash.revision>=0)
					return true;
				else
					return false;
			}
			else
				return false;
		}
		else
			return false;
    }
    window.flash = {version:0, majorVersion:0, minorVersion:0, revision:0};
	return false;

}

function PasswordGenerator(mixedcase, numbers, symbols, usernameemail, username, email)
{
  var length = 8;
  if((parseInt(numbers) + parseInt(symbols)) >= 7)      // custom rules 
    length = numbers + symbols + 2; // give enough length for generated password to enter at least one upper and one lower case letter in addition to symbols and numbers
  var numbersarray = '0123456789';
  var locasearray = 'abcdefghijklmnopqrstuvwxyz';
  var upcasearray = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  var symbolsarray = '~!@#$%^&*()[]{},.;:';
  var charsarray = numbersarray + locasearray + upcasearray + symbolsarray;
  var tmparray = new Array();
  for (var i=0; i<numbers; i++ )
  {
    tmparray[i] = numbersarray.charAt(Math.floor(Math.random()*numbersarray.length)); 
  }
  for( i=numbers; i< parseInt(numbers) + parseInt(symbols); i++)
  {
    tmparray[i] = symbolsarray.charAt(Math.floor(Math.random()*symbolsarray.length)); 
  }
  var ind = tmparray.length;
  if(mixedcase == 0)
  {
    tmparray[ind] = locasearray.charAt(Math.floor(Math.random()*locasearray.length)); 
    tmparray[ind+1] = upcasearray.charAt(Math.floor(Math.random()*upcasearray.length)); 
  }
  if(length - tmparray.length > 0)
  {
    for(var j=ind+2; j < length; j++)
    {
      tmparray[j] = charsarray.charAt(Math.floor(Math.random()*charsarray.length));
    }
  }
  tmparray.sort(RandomizeArray);
  var password = tmparray.join("");
  if(usernameemail == 0)
  {
    while((password.indexOf(username) > -1) || ((email != "") && (password.indexOf(email) > -1)))
    {
      tmparray.sort(RandomizeArray);
      var password = tmparray.join("");
    }
  }  
  return password;
}

function RandomizeArray(a,b)
{
  return (Math.round(Math.random())-0.5); 
} 

function PasswordValidation(pwd, length, casesensitive, mixedcase, numbers, symbols, usernameemail, username, email)
{
  if(pwd.length < length)
  {
    return false;
  }  
  if(mixedcase == 0)  
  {
    if((pwd.toUpperCase() == pwd) || (pwd.toLowerCase() == pwd))
    {
      return false;
    }
  }
  if(numbers > 0)
  {
    var thenumbers = "0123456789";
    if (CheckString(pwd, numbers, thenumbers) != true)
    {
      return false;
    }  
  }  
  if(symbols > 0) 
  { 
    var specialchars = "~!@#$%^&*()[]{},.;:";
    if (CheckString(pwd, symbols, specialchars) != true)
    {
      return false;
    }  
  }
  if(usernameemail == 0)
  {
    if((pwd.indexOf(username) > -1) || ((email != "") && (pwd.indexOf(email) > -1)))
    {
      return false;
    }  
  }
  return true;
}

function CheckString(data, checkvalue, strToCheck)
{
  var count = 0;
  for(var i=0; i < data.length; i++ )
  {
    for(var j=0; j < strToCheck.length; j++)
    {
      if(data.charAt(i) == strToCheck.charAt(j))
      {
        count++;
        break;
      }  
    }
    if(count == checkvalue)  
        break;
  }
  if(count < checkvalue)
    return false;
  
  return true;
}
function hmac_sha1(key,str)
{         
  var aKey = smash.crypto.str_to_WA(key, 8);
  return smash.crypto.hmac_sha1_hex(aKey, str, 16);
}

