/*
Versión 1.0 (13/04/2007):
========================
- Nombres de los plugins para la ejecución del VBSCRIPT (para el bloque de detección exclusivo para IE):
  * FLASH                : "ShockwaveFlash.ShockwaveFlash.1"
  * DIRECTOR             : "SWCtl.SWCtl" -> Genérico aprobado por Adobe.
  * REAL                 : "rmocx.RealPlayer G2 Control" o "RealPlayer.RealPlayer(tm) ActiveX Control (32-bit)" o "RealVideo.RealVideo(tm) ActiveX Control (32-bit)"
  * WINDOWS MEDIA PLAYER : "MediaPlayer.MediaPlayer.1" o "WMPlayer.OCX"
  * ADOBE ACROBAT READER : "PDF.PdfCtrl.5" Ojo! -> PDF.PdfCtrl.version to AcroPDF.PDF.1 en AR7+
  
- Ejemplo de utilización:
	<script language="javascript">
		var BI = new BrowserInfo();
		var pluginFound = BI.GetPluginInfo("Flash"); -> ESTO BUSCA LA FUNCIÓN CON JS, ES DECIR, SUPONIENDO QUE EL BROWSER SOPORTA LA FUNCIÓN (MOZILLA, OPERA, ETC.)
		// SI NO ENCUENTRA RESULTADO, EJECUTA EL BLOQUE VBSCRIPT, EXCLUSIVO PARA IE:
		if(!pluginFound && detectableWithVB) {
			pluginFound = detectActiveXControl('ShockwaveFlash.ShockwaveFlash.1');
		}
	</script>
	
- El bloque de vbscript mejora al de Apple, ya que, si existe la variable Version, la devuelve, y sino devuelve true (si existe el plug) o false si no existe.
  Apple se limitaba al true o false.
  
- Plugins para investigar:
  CRViewer.CRViewer
  AxMetaStream.MetaStreamCtl.1
  Autodesk.MGMap.1
  Wfica.WficaCtl.1
  IPIX.ActiveXCtrl.5
  RFXInstMgr.RFXInstMgr.1 WGInstMgr.WGInstMgr.1 richfx.com

*/
var detectableWithVB = false;
var pluginFound      = false;

BrowserInfo = function() {
	this.GetBrowserInfo     = GetBrowserInfo;
	this.GetPluginInfo      = GetPluginInfo;
	this.DimVentana         = DimVentana;
	this.GetWindowInfo      = GetWindowInfo;
	this.GetLanguageBrowser = GetLanguageBrowser;
	this.GetSysLang         = GetSysLang;
	this.PluginVersion      = PluginVersion;
	this.FindBrowserName    = FindBrowserName;
	this.FindOS             = FindOS;
	this.userAgent          = navigator.userAgent;
	this.isWin              = undefined;
	this.isIE               = undefined;
	this.isOpera            = undefined;
	this.isFirefox          = undefined;
	this.isMozilla          = undefined;
	this.init               = init;
	this.init();
	
	function init() {
		this.isWin          = (this.FindOS().plataforma    == 'win')     ? true : false;
		this.isIE           = (this.FindBrowserName().name == 'msie')    ? true : false;
		this.isOpera        = (this.FindBrowserName().name == 'opera')   ? true : false;
		this.isFirefox      = (this.FindBrowserName().name == 'firefox') ? true : false;
		this.isMozilla      = (this.FindBrowserName().name == 'mozilla') ? true : false;
	}
	
	function FindBrowserName() {
		var ua                               = this.userAgent.toLowerCase();
		var m;
		var spl;
		var returnObjBrowser                 = {name:null, version:null};
		if (ua.match(/cs\s*2000/)) {
			returnObjBrowser.name            = "compuserve";
			if (ua.match(/gecko/)) {
				returnObjBrowser.version     = 7;
			} else {
				returnObjBrowser.version     = 2000;
			}
			return returnObjBrowser;
		}
		var names                            = ["opera", "aol", "konqueror", "netscape", "safari", "msie"];
		for (var i = 0; i<names.length; i++) {
			var ns                           = names[i];
			if ((m = ua.indexOf(ns)) >= 0) {
				returnObjBrowser.name        = ns;
				m                            = ua.substr(m+ns.length).match(/[ \/]*(\d+(\.\d+)?)/);
				if (m) {
					returnObjBrowser.version = parseFloat(m[1]);
				}
				return returnObjBrowser;
			}
		}
		if (ua.indexOf("gecko") >= 0) {
			if (ua.indexOf("firefox") >= 0) {
				returnObjBrowser.name        = "firefox";
			} else {
				returnObjBrowser.name        = "mozilla";
			}
			// Le agregué la opción de Firefox
			m = (ua.match(/firefox\/\d.\d+?/) != null) ? ua.match(/firefox\/\d.\d+?/) : ua.match(/rv:(\d+(\.\d+)?)/);
			m = m.toString();
			spl = (m.indexOf("/") != -1) ? "/" : ":";
			m = m.split(spl);
			if (m) {
				returnObjBrowser.version     = parseFloat(m[1]);
			}
			return returnObjBrowser;
		}
		m = ua.match(/mozilla[^\/]*\/(\d+(\.\d+)?)/);
		if (m) {
			returnObjBrowser.name            = "mozcompat";
			returnObjBrowser.version         = parseFloat(m[1]);
		}
		return returnObjBrowser;
	}
	
	function FindOS() {
		var ua                     = this.userAgent.toLowerCase();
		ua                         = ua.replace(/[^a-z0-9.]+/g, "");
		ua                         = "**"+ua.replace(/windows/g, "win");
		var returnObjOS            = {plataforma:null, os_ver:"kk"};
		returnObjOS.plataforma     = "win";
		if (0<ua.indexOf("win9")) {
			returnObjOS.os_ver     = "9x";
		}
		if (0<ua.indexOf("winnt5.1")) {
			returnObjOS.os_ver     = "xp";
			return returnObjOS;
		}
		if (0<ua.indexOf("winnt5.2")) {
			returnObjOS.os_ver     = "xp";
			return returnObjOS;
		}
		if (0<ua.indexOf("winxp")) {
			returnObjOS.os_ver     = "xp";
			return returnObjOS;
		}
		if (0<ua.indexOf("winnt")) {
			returnObjOS.os_ver     = "nt";
			return returnObjOS;
		}
		if (0<ua.indexOf("win")) {
			returnObjOS.os_ver     = "";
			return returnObjOS;
		}
		if (0<ua.indexOf("macosx")) {
			returnObjOS.plataforma = "mac";
			returnObjOS.os_ver     = "osx";
			return returnObjOS;
		}
		if (0<ua.indexOf("mac")) {
			returnObjOS.plataforma = "mac";
			returnObjOS.os_ver     = "classic";
			return returnObjOS;
		}
		if (0<ua.indexOf("linux")) {
			returnObjOS.plataforma = "linux";
			return returnObjOS;
		}
	}
	
	function GetLanguageBrowser() {
		return (navigator.language != undefined) ? navigator.language : navigator.userLanguage;
	}
	
	function GetSysLang() {
		return (navigator.systemLanguage != undefined) ? navigator.systemLanguage : navigator.userLanguage;
	}
	
	
	function GetBrowserInfo() {
		var InfoNavObj    = {
			nombre        : this.FindBrowserName().name,
			version       : this.FindBrowserName().version,
			userAgent     : this.userAgent,
			plataforma    : this.FindOS().plataforma,
			plat_nav      : navigator.platform,
			os_ver        : this.FindOS().os_ver,
			codigoNombre  : navigator.appCodeName,
			idioma        : this.GetLanguageBrowser(),
			idioma_sys    : this.GetSysLang(), // Sólo IE y Opera
			tiposMime     : navigator.mimeTypes,
			plugs         : navigator.plugins,
			javaEnabl     : navigator.javaEnabled(),
			cookies       : navigator.cookieEnabled,
			online        : navigator.onLine, // No Opera
			wScreen       : screen.width,
			hScreen       : screen.height,
			wScreenUtil   : screen.availWidth,
			hScreenUtil   : screen.availHeight,
			colorDepth    : screen.colorDepth,
			pixelDepth    : screen.pixelDepth // No IE
		};
		return InfoNavObj;
	}
	
	function DimVentana(completa) {
		// Ver: http://www.quirksmode.org/js/doctypes.html
		var completa     = (completa == undefined) ? false : completa;
		var objTam       = {w:0, h:0};
		if (typeof window.innerWidth != 'undefined') {
			// Mozilla, Firefox, Opera
			var element  = window;
			if(!completa) {
				objTam.w = element.innerWidth;
				objTam.h = element.innerHeight;
			} else {
				objTam.w = element.outerWidth;
				objTam.h = element.outerHeight;
			}
		} else if (typeof document.documentElement != 'undefined' && typeof document.documentElement.clientWidth != 'undefined' && document.documentElement.clientWidth != 0) {
			// IE; no encontré manera de medir la ventana completa.
			var element  = (document.documentElement) ? document.documentElement : document.body;
			if(!completa) {
				objTam.w = element.clientWidth;
				objTam.h = element.clientHeight;
			} else {
				objTam.w = element.clientWidth;
				objTam.h = element.clientHeight;
			}
		} else {
			var element  = document.getElementsByTagName('body')[0];
			if(!completa) {
				objTam.w = element.clientWidth;
				objTam.h = element.clientHeight;
			} else {
				objTam.w = element.clientWidth;
				objTam.h = element.clientHeight;
			}
		}
		return objTam;
	}
		
	
	
	function GetWindowInfo() {
		// No todas las propiedades son reconocidas por todos los navegadores. Existen otras propiedades, pero son utilizadas generalmente
		// por el método window.open como parámetros.
		var InfoWindowObj = {
			nombre        : window.name,             // Nombre de la ventana; generalemente cuando se usa window.open y se indica el nombre, sino "".
			opener        : window.opener,           // La ventana que abrió la actual; generalemente cuando se usa window.open y se indica el nombre, sino undefined o null.
			innerWidth    : this.DimVentana().w,     // Ancho "neto" interior de la ventana del navegador, contando la barra de scroll si la hubiese.
			innerHeight   : this.DimVentana().h,     // Alto "neto" interior de la ventana del navegador, contando la barra de scroll si la hubiese.
			outerWidth    : this.DimVentana(true).w, // Ancho total interior de la ventana del navegador.
			outerHeight   : this.DimVentana(true).h, // Alto total interior de la ventana del navegador.
			parent        : window.parent,           // Idem top.
			self          : window.self,             // Ventana o frame actual.
			status        : window.status,           // Texto de la barra de estado.
			top           : window.top,              // Hace referencia a la ventana donde está situada el frame donde estamos trabajando. Como la propiedad parent.
			frames        : window.frames,           // Contiene todos los frames de la página. Se accede por su índice a partir de 0.
			frames_len    : window.length,           // Numero de frames de la ventana.
			location      : window.location,         // Devuelve la ruta absoluta del documento actual.
			history       : window.history,          // Objeto historial de páginas visitadas.
			screenLeft    : window.screenLeft,       // Distancia del borde izquierdo de la pantalla.
			screenTop     : window.screenTop         // Distancia del borde superior de la pantalla.
		}
		return InfoWindowObj;
	}
	
	// Ver esto: http://discerning.com/hacks/js/plugin_detect.js
	if (this.isIE && this.isWin && !this.isOpera) {
		document.writeln('<script language="VBscript">');
		document.writeln('detectableWithVB = False');
		document.writeln('If ScriptEngineMajorVersion >= 2 then');
		document.writeln('	detectableWithVB = True');
		document.writeln('End If');
			
		document.writeln('Function detectActiveXControl(activeXControlName)');
		document.writeln('	on error resume next');
		document.writeln('	Dim theObject, StrReturn');
		document.writeln('	detectActiveXControl = False');
		document.writeln('	If detectableWithVB Then');
		document.writeln('		Set theObject = CreateObject(activeXControlName)');
		document.writeln('		If(IsObject(theObject)) Then');
		document.writeln('			If(isEmpty(theObject.GetVariable("$version"))) Then');
		
		document.writeln('				If(isEmpty(theObject.versionInfo)) Then');
		document.writeln('					detectActiveXControl = true');
		document.writeln('				Else');
		document.writeln('					detectActiveXControl = left(theObject.versionInfo, theObject.versionInfo)'); // -> WMP, testaeado en la versión 10;
		document.writeln('				End If');
		
		document.writeln('			Else');
		document.writeln('				detectActiveXControl = theObject.GetVariable("$version")'); // -> Flash ;
		document.writeln('			End If');
		document.writeln('		End If');
		document.writeln('	End If');
		document.writeln('End Function');

		document.writeln('Function detectQuickTimeActiveXControl()');
		document.writeln('	on error resume next');
		document.writeln('	detectQuickTimeActiveXControl = False');
		document.writeln('	If detectableWithVB Then');
		document.writeln('		detectQuickTimeActiveXControl = False');
		document.writeln('		hasQuickTimeChecker = false');
		document.writeln('		Set hasQuickTimeChecker = CreateObject("QuickTimeCheckObject.QuickTimeCheck.1")');
		document.writeln('		If IsObject(hasQuickTimeChecker) Then');
		document.writeln('			If hasQuickTimeChecker.IsQuickTimeAvailable(0) Then ');
		document.writeln('				detectQuickTimeActiveXControl = CInt(Hex(hasQuickTimeChecker.QuickTimeVersion) / 1000000)');
		document.writeln('			End If');
		document.writeln('		End If');
		document.writeln('	End If');
		document.writeln('End Function');
		
		document.writeln('</scr' + 'ipt>');
	}
	// Devuelve un objeto conteniendo información sobre un plugin o false si no lo encuentra. Los browsers que no soportan esta función
	// ejecutan la que está más arriba en vbscript, salvo que sean muy viejos.
	function PluginVersion(nombre, descripcion) {
		var matches = /[\d\.]+/.exec(nombre);
		if (matches) {
			return matches[0];
		}
		matches     = /[\d\.]+/.exec(descripcion);
		return matches ? matches[0] : 'unknown';
	}
	
	function GetPluginInfo(nombrePlugin) {
		var nombrePlugin                    = nombrePlugin.toLowerCase();
		var existe                          = false;
		var infoPlugin                      = {};
		var objPlugins                      = navigator.plugins;
		if (objPlugins != null && objPlugins.length>0) {
			for(var i in objPlugins) {
				var objPlug                 = objPlugins[i];
				for(var j in objPlug) {
					var plug                = objPlug[j];
					var nombre              = (plug.name != undefined)           ? plug.name           : objPlug.name;
					var descripcion         = (objPlug.description != undefined) ? objPlug.description : plug.description;
					var archivo             = (plug.filename != undefined)       ? plug.filename       : objPlug.filename;
					var tipoMime            = (plug.type != undefined)           ? plug.type           : objPlug.type;
					nombre                  = nombre.toLowerCase();
					if(typeof(descripcion) == 'string') {
						descripcion             = descripcion.toLowerCase();
					}
					if (nombre             != undefined) {
						existe              = (nombre.indexOf(nombrePlugin) != -1)      ? true : false;
					} else if (descripcion != undefined) {
						existe              = (descripcion.indexOf(nombrePlugin) != -1) ? true : false;
					}
					if(existe == true) {
						infoPlugin      = {
							nombre      : nombre,
							descripcion : descripcion,
							archivo     : archivo,
							tipoMime    : tipoMime,
							version     : PluginVersion(nombre, descripcion)
						};
						return infoPlugin;
					}
				}
			}
			return false;
		}
		return false;
	}
	
}

