//------------------------------------------------------------

//http://www.quirksmode.org/js/detect.html

var BrowserDetect = {
  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.indexOf(data[i].subString) != -1)
          return data[i].identity;
      }
      else if (dataProp)
        return data[i].identity;
    }
  },
  searchVersion: function (dataString) {
    var index = dataString.indexOf(this.versionSearchString);
    if (index == -1) return;
    return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
  },
  dataBrowser: [
    {
      string: navigator.userAgent,
      subString: "Chrome",
      identity: "Chrome"
    },
    {   string: navigator.userAgent,
      subString: "OmniWeb",
      versionSearch: "OmniWeb/",
      identity: "OmniWeb"
    },
    {
      string: navigator.vendor,
      subString: "Apple",
      identity: "Safari",
      versionSearch: "Version"
    },
    {
      prop: window.opera,
      identity: "Opera"
    },
    {
      string: navigator.vendor,
      subString: "iCab",
      identity: "iCab"
    },
    {
      string: navigator.vendor,
      subString: "KDE",
      identity: "Konqueror"
    },
    {
      string: navigator.userAgent,
      subString: "Firefox",
      identity: "Firefox"
    },
    {
      string: navigator.vendor,
      subString: "Camino",
      identity: "Camino"
    },
    {   // for newer Netscapes (6+)
      string: navigator.userAgent,
      subString: "Netscape",
      identity: "Netscape"
    },
    {
      string: navigator.userAgent,
      subString: "MSIE",
      identity: "Explorer",
      versionSearch: "MSIE"
    },
    {
      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.userAgent,
         subString: "iPhone",
         identity: "iPhone/iPod"
      },
    {
      string: navigator.platform,
      subString: "Linux",
      identity: "Linux"
    }
  ]

};
BrowserDetect.init();

//------------------------------------------------------------

/** XHConn - Simple XMLHTTP Interface - bfults@gmail.com - 2005-04-08        **
 ** Code licensed under Creative Commons Attribution-ShareAlike License      **
 ** http://creativecommons.org/licenses/by-sa/2.0/                           **/
/**
 * Modified slightly from original to support synchoronous transactions
 * CDB 2007-05-16, 2007-06-05
 * http://snippets.dzone.com/posts/show/5416
 */

function XHConn()
{
  var xmlhttp, bComplete = false;
  try { xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); }
  catch (e) { try { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); }
  catch (e) { try { xmlhttp = new XMLHttpRequest(); }
  catch (e) { xmlhttp = false; }}}
  if (!xmlhttp) return null;
  this.connect = function(sURL, sMethod, sVars, fnDone, bAsynch)
  {
    if (!xmlhttp) return false;
    bComplete = false;
    sMethod = sMethod.toUpperCase();

    //True: Asincrónico / False: Sincrónico
    if (bAsynch == null)
      bAsynch = false;   //true por defecto, treat asynch as an optional argument

    try {
      if (sMethod == "GET") {
        xmlhttp.open(sMethod, sURL + "?" + sVars, (bAsynch == true));
        sVars = "";
      } else {
        xmlhttp.open(sMethod, sURL, (bAsynch == true));
        xmlhttp.setRequestHeader("Method", "POST " + sURL + " HTTP/1.1");
        xmlhttp.setRequestHeader("Content-Type",
          "application/x-www-form-urlencoded");
      }

      //Firefox 3.5 es detectado como Firefox 3.5, Firefox 3.6 es detectado como Firefox 2
      //alert(BrowserDetect.browser + " | " + BrowserDetect.version);

      /* Intento obtener la versión de Gecko */
      var versionGecko = 0;
      var uAgent = navigator.userAgent.toLowerCase();
      var posicion = uAgent.indexOf('gecko');

      if (posicion > -1) {
        tmp = uAgent.substr(posicion + 6, 8);
        versionGecko = new Number(tmp);
      }
      /* ------------------------------ */

      if (BrowserDetect.browser == 'Firefox') {
        if ((BrowserDetect.version == '3.5') || (versionGecko >= 2010)) {
          xmlhttp.onload = xmlhttp.onerror = xmlhttp.onabort = function() {
            bComplete = true;
            fnDone(xmlhttp);
          };
        }
      } else {
        xmlhttp.onreadystatechange = function() {
          if (xmlhttp.readyState == 4 && !bComplete) {
            bComplete = true;
            fnDone(xmlhttp);
          }
        };
      }

      xmlhttp.send(sVars);

      /**
       * Firefox <= 2.0.0 doesn't fire onreadystatechange for synchronous requests.
       * See http://lukav.com/wordpress/2007/04/12/firefox-firebug-and-synchronos-calls-problem/
       */
      var isGecko = (document.addEventListener) ? true : false;
      try {
        if (!bAsynch && isGecko && xmlhttp.onreadystatechange == null) {
          bComplete = true;
          fnDone(xmlhttp);
          return true;
        }
      }
      catch (e) { return false; }
      /**
       * End synchronous request patch
       */
    }
    catch(z) { return false; }
    return true;
  };
  return this;
}

