   /* lifted from <http://www.quirksmode.org/js/detect.html> and adapted for Chrome, Safari, Firefox & xPloder
    * adapted strings found at
    *    <http://www.thespanner.co.uk/2009/01/29/detecting-browsers-javascript-hacks/> [Chrome/Firefox/Safari]
    * and
    *    <http://www.javascriptkit.com/javatutors/conditionalcompile.shtml> [xPloder]
    */
var BrowserDetect =
{
   dataBrowser:
   [
      {
         prop: /a/.__proto__ == '//',
         identity: 'safari'
      },
      {
         prop: /source/.test(/a/.toString + ''),
         identity: 'chrome'
      },
      {
         prop: /a/[-1] == 'a',
         identity: 'firefox'
      },
      {
         prop: window.opera,
         identity: 'opera'
      },
      {
         prop: /*@cc_on!@*/false,
         identity: 'explorer',
         versionSearch: 'MSIE'
      },
      {
         string: navigator.vendor,
         subString: 'iCab',
         identity: 'icab'
      },
      {
         string: navigator.vendor,
         subString: 'KDE',
         identity: 'konqueror'
      },
      {
         string: navigator.vendor,
         subString: 'Camino',
         identity: 'camino'
      },
      {
         string: navigator.userAgent,
         subString: 'OmniWeb',
         identity: 'omniweb',
         versionSearch: 'OmniWeb/'
      },
      {
         string: navigator.userAgent,
         subString: 'Gecko',
         identity: 'mozilla',
         versionSearch: 'rv'
      },
      {     // for older Netscapes (4-)
         string: navigator.userAgent,
         subString: 'Mozilla',
         identity: 'netscape',
         versionSearch: 'Mozilla'
      }
   ],

   dataOS:
   [
      {
         string: navigator.platform,
         subString: 'Win',
         identity: 'windows'
      },
      {
         string: navigator.platform,
         subString: 'Mac',
         identity: 'mac'
      },
      {
         string: navigator.platform,
         subString: 'Linux',
         identity: 'linux'
      }
   ],

   init: function()
   {
      this.browser = this.searchString(this.dataBrowser)     || 'An unknown browser';
      this.version = this.searchVersion(navigator.userAgent) || this.searchVersion(navigator.appVersion) || 'an unknown version';
      this.OS      = this.searchString(this.dataOS)          || 'an unknown OS';
   },

   searchString: function(data)
   {
      for (var i = 0; i < data.length; i++)
      {
         var dataString = data[i].string;
         var dataProp   = data[i].prop;
         this.versionSearchString = data[i].versionSearch || data[i].identity;
         if (dataString)
         {
            if (dataString.match(data[i].subString))
               return data[i].identity;
         }
         else if (dataProp)
            return data[i].identity;
      }
   },

   searchVersion: function (dataString)
   {
      var index = dataString.toLowerCase().indexOf(this.versionSearchString.toLowerCase());
      if (index == -1)
         return;
      return parseFloat(dataString.substring(index + this.versionSearchString.length + 1));
   }
};
BrowserDetect.init();

// combat xPloder's image caching bug <http://ahinea.com/en/tech/ie-dhtml-image-caching.html>, <http://www.mister-pixel.com/> and <http://www.bazon.net/mishoo/articles.epl?art-id=958> [comment]
   if (BrowserDetect.browser == 'explorer')
   {
      try { document.execCommand('BackgroundImageCache', false, true); }
      catch(e) {}
   }

// display xPloder version in titlebar [for use w/ multiple xPloders]
   if (BrowserDetect.browser == 'explorer' && window.location.host.match(/brains/))
      document.title = ' xPloder ' + navigator.userAgent.toLowerCase().substr(navigator.userAgent.toLowerCase().indexOf('msie ') + 5, 3) + ' - ' + document.title;

