/**
 * @archivo navegador.js
 * Navegador @módulo
 * /
importar * como Dom desde './dom';
importar ventana desde 'global/window';

const AGENTE_USUARIO = ventana.navegador && ventana.navigator.userAgent || '';
const webkitVersionMap = (/AppleWebKit\/([\d.]+)/i).exec(USER_AGENT);
const appleWebkitVersion = webkitVersionMap ? parseFloat(webkitVersionMap.pop()) : null;

/ **
 * Si este dispositivo es o no un iPod.
 *
 * @estático
 * @const
 * @tipo {Booleano}
 * /
export const IS_IPOD = (/iPod/i).test(USER_AGENT);

/ **
 * La versión de iOS detectada - o `null`.
 *
 * @estático
 * @const
 * @type {cadena|null}
 * /
export const IOS_VERSION = (función() {
  const coincidencia = USER_AGENT.match(/OS (\d+)_/i);

  si (coincidencia && partido[1]) {
    devolver partido[1];
  }
  devolver nulo;
}());

/ **
 * Si se trata o no de un dispositivo Android.
 *
 * @estático
 * @const
 * @tipo {Booleano}
 * /
export const IS_ANDROID = (/Android/i).test(USER_AGENT);

/ **
 * La versión de Android detectada - o `null`.
 *
 * @estático
 * @const
 * @type {número|cadena|null}
 * /
exportar const ANDROID_VERSION = (función() {
  // Esto coincide con las versiones Major.Minor.Patch de Android
  // ANDROID_VERSION es Major.Minor as a Number, si Minor no está disponible, solo se devuelve Major
  coincidencia const = USER_AGENT.match(/Android (\d+)(?:\.(\d+))?(?:\.(\d+))*/i);

  si (! coincidencia) {
    devolver nulo;
  }

  const mayor = partido[1] && parseFloat(coincidencia[1]);
  constante menor = partido[2] && parseFloat(coincidencia[2]);

  si (mayor && menor) {
    return parseFloat(coincidencia[1] + '.' + coincidencia[2]);
  } más si (principal) {
    volver mayor;
  }
  devolver nulo;
}());

/ **
 * Si se trata o no de un navegador Android nativo.
 *
 * @estático
 * @const
 * @tipo {Booleano}
 * /
exportación constante IS_NATIVE_ANDROID = IS_ANDROID && VERSIÓN DE ANDROID < 5 && appleWebkitVersión < 537;

/ **
 * Sea o no Mozilla Firefox.
 *
 * @estático
 * @const
 * @tipo {Booleano}
 * /
export const IS_FIREFOX = (/Firefox/i).test(USER_AGENT);

/ **
 * Si se trata o no de Microsoft Edge.
 *
 * @estático
 * @const
 * @tipo {Booleano}
 * /
export const IS_EDGE = (/Edg/i).test(USER_AGENT);

/ **
 * Si esto es o no Google Chrome.
 *
 * Esto también será &quot;verdadero&quot; para Chrome en iOS, que tendrá un soporte diferente
 * ya que en realidad es Safari debajo del capó.
 *
 * @estático
 * @const
 * @tipo {Booleano}
 * /
exportar const IS_CHROME = !IS_EDGE && ((/Chrome/i).test(USER_AGENT) || (/CriOS/i).test(USER_AGENT));

/ **
 * La versión detectada de Google Chrome - o `null`.
 *
 * @estático
 * @const
 * @type {número|nulo}
 * /
export const CHROME_VERSION = (función() {
  coincidencia const = USER_AGENT.match(/(Chrome|CriOS)\/(\d+)/);

  si (coincidencia && partido[2]) {
    return parseFloat(coincidencia[2]);
  }
  devolver nulo;
}());

/ **
 * La versión detectada de Internet Explorer - o `null`.
 *
 * @estático
 * @const
 * @type {número|nulo}
 * /
exportar constante IE_VERSION = (función() {
  const resultado = (/MSIE\s(\d+)\.\d/).exec(USER_AGENT);
  dejar versión = resultado && parseFloat(resultado[1]);

  si (! versión && (/Trident\/7.0/i).prueba(USUARIO_AGENTE) && (/rv:11.0/).prueba(AGENTE_USUARIO)) {
    // IE 11 tiene una cadena de agente de usuario diferente a otras versiones de IE
    versión = 11.0;
  }

  versión de retorno;
}());

/ **
 * Si se trata o no de Safari de escritorio.
 *
 * @estático
 * @const
 * @tipo {Booleano}
 * /
export const IS_SAFARI = (/Safari/i).test(USER_AGENT) && !ES_CROMO && !ES_ANDROID && !ES_BORDE;

/ **
 * Si se trata o no de una máquina con Windows.
 *
 * @estático
 * @const
 * @tipo {Booleano}
 * /
export const IS_WINDOWS = (/Windows/i).test(USER_AGENT);

/ **
 * Si este dispositivo es táctil o no.
 *
 * @estático
 * @const
 * @tipo {Booleano}
 * /
exportar const TOUCH_ENABLED = Boolean(Dom.isReal() && (
  'ontouchstart' en la ventana ||
  ventana.navigator.maxTouchPoints ||
  ventana.DocumentTouch && ventana.documento instancia de ventana.DocumentTouch));

/ **
 * Si este dispositivo es o no un iPad.
 *
 * @estático
 * @const
 * @tipo {Booleano}
 * /
export const IS_IPAD = (/iPad/i).test(USER_AGENT) ||
  (ES_SAFARI && TOQUE_HABILITADO && !(/iPhone/i).prueba(USUARIO_AGENTE));

/ **
 * Si este dispositivo es o no un iPhone.
 *
 * @estático
 * @const
 * @tipo {Booleano}
 * /
// La UIWebView de la aplicación de Facebook se identifica como un iPhone y un iPad, por lo que
// para identificar iPhones, necesitamos excluir iPads.
// http://artsy.github.io/blog/2012/10/18/los-peligros-de-ios-user-agent-sniffing/
export const IS_IPHONE = (/iPhone/i).test(USER_AGENT) && !ES_IPAD;

/ **
 * Si se trata o no de un dispositivo iOS.
 *
 * @estático
 * @const
 * @tipo {Booleano}
 * /
exportar constante IS_IOS = IS_IPHONE || ES_IPAD || ES_IPOD;

/ **
 * Ya sea que se trate o no de cualquier sabor de Safari, incluido iOS.
 *
 * @estático
 * @const
 * @tipo {Booleano}
 * /
exportación constante IS_ANY_SAFARI = (IS_SAFARI || IS_IOS) && !ES_CROMO;