<!--script type="text/javascript"-->
/*tomado de : http://emilio.aesinformatica.com/2008/10/31/obtener-navegador-y-sistema-operativo-con-javascript/*/
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"
		},
		{
			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.platform,
			subString: "Linux",
			identity: "Linux"
		}
	]

};
BrowserDetect.init();

function restarFechas(fechaInicio,fechaFin)
{
	var diferencia = fechaFin.getTime() - fechaInicio.getTime();
	var dias = Math.round(diferencia / (1000 * 60 * 60 * 24));
	return dias;
}

function htmlspecialchars_decode(string, quote_style) {
	var histogram = {}, symbol = '', tmp_str = '', entity = '';
	tmp_str = string.toString();
	if (false === (histogram = get_html_translation_table('HTML_SPECIALCHARS', quote_style))) {
		return false;
	}
	delete(histogram['&']);
		histogram['&'] = '&amp;';
	for (symbol in histogram) {
		entity = histogram[symbol];
		tmp_str = tmp_str.split(entity).join(symbol);
	}
	return tmp_str;
}

function get_html_translation_table(table, quote_style) {
    var entities = {}, histogram = {}, decimal = 0, symbol = '';
    var constMappingTable = {}, constMappingQuoteStyle = {};
    var useTable = {}, useQuoteStyle = {};
    
    useTable      = (table ? table.toUpperCase() : 'HTML_SPECIALCHARS');
    useQuoteStyle = (quote_style ? quote_style.toUpperCase() : 'ENT_COMPAT');
    
    // Translate arguments
    constMappingTable[0]      = 'HTML_SPECIALCHARS';
    constMappingTable[1]      = 'HTML_ENTITIES';
    constMappingQuoteStyle[0] = 'ENT_NOQUOTES';
    constMappingQuoteStyle[2] = 'ENT_COMPAT';
    constMappingQuoteStyle[3] = 'ENT_QUOTES';
    
    // Map numbers to strings for compatibilty with PHP constants
    if (!isNaN(useTable)) {
        useTable = constMappingTable[useTable];
    }
    if (!isNaN(useQuoteStyle)) {
        useQuoteStyle = constMappingQuoteStyle[useQuoteStyle];
    }

    if (useTable == 'HTML_SPECIALCHARS') {
        // ascii decimals for better compatibility
        entities['38'] = '&amp;';
        if (useQuoteStyle != 'ENT_NOQUOTES') {
            entities['34'] = '&quot;';
        }
        if (useQuoteStyle == 'ENT_QUOTES') {
            entities['39'] = '&#039;';
        }
        entities['60'] = '&lt;';
        entities['62'] = '&gt;';
    } else if (useTable == 'HTML_ENTITIES') {
        // ascii decimals for better compatibility
	    entities['38']  = '&amp;';
        if (useQuoteStyle != 'ENT_NOQUOTES') {
            entities['34'] = '&quot;';
        }
        if (useQuoteStyle == 'ENT_QUOTES') {
            entities['39'] = '&#039;';
        }
	    entities['60']  = '&lt;';
	    entities['62']  = '&gt;';
	    entities['160'] = '&nbsp;';
	    entities['161'] = '&iexcl;';
	    entities['162'] = '&cent;';
	    entities['163'] = '&pound;';
	    entities['164'] = '&curren;';
	    entities['165'] = '&yen;';
	    entities['166'] = '&brvbar;';
	    entities['167'] = '&sect;';
	    entities['168'] = '&uml;';
	    entities['169'] = '&copy;';
	    entities['170'] = '&ordf;';
	    entities['171'] = '&laquo;';
	    entities['172'] = '&not;';
	    entities['173'] = '&shy;';
	    entities['174'] = '&reg;';
	    entities['175'] = '&macr;';
	    entities['176'] = '&deg;';
	    entities['177'] = '&plusmn;';
	    entities['178'] = '&sup2;';
	    entities['179'] = '&sup3;';
	    entities['180'] = '&acute;';
	    entities['181'] = '&micro;';
	    entities['182'] = '&para;';
	    entities['183'] = '&middot;';
	    entities['184'] = '&cedil;';
	    entities['185'] = '&sup1;';
	    entities['186'] = '&ordm;';
	    entities['187'] = '&raquo;';
	    entities['188'] = '&frac14;';
	    entities['189'] = '&frac12;';
	    entities['190'] = '&frac34;';
	    entities['191'] = '&iquest;';
	    entities['192'] = '&Agrave;';
	    entities['193'] = '&Aacute;';
	    entities['194'] = '&Acirc;';
	    entities['195'] = '&Atilde;';
	    entities['196'] = '&Auml;';
	    entities['197'] = '&Aring;';
	    entities['198'] = '&AElig;';
	    entities['199'] = '&Ccedil;';
	    entities['200'] = '&Egrave;';
	    entities['201'] = '&Eacute;';
	    entities['202'] = '&Ecirc;';
	    entities['203'] = '&Euml;';
	    entities['204'] = '&Igrave;';
	    entities['205'] = '&Iacute;';
	    entities['206'] = '&Icirc;';
	    entities['207'] = '&Iuml;';
	    entities['208'] = '&ETH;';
	    entities['209'] = '&Ntilde;';
	    entities['210'] = '&Ograve;';
	    entities['211'] = '&Oacute;';
	    entities['212'] = '&Ocirc;';
	    entities['213'] = '&Otilde;';
	    entities['214'] = '&Ouml;';
	    entities['215'] = '&times;';
	    entities['216'] = '&Oslash;';
	    entities['217'] = '&Ugrave;';
	    entities['218'] = '&Uacute;';
	    entities['219'] = '&Ucirc;';
	    entities['220'] = '&Uuml;';
	    entities['221'] = '&Yacute;';
	    entities['222'] = '&THORN;';
	    entities['223'] = '&szlig;';
	    entities['224'] = '&agrave;';
	    entities['225'] = '&aacute;';
	    entities['226'] = '&acirc;';
	    entities['227'] = '&atilde;';
	    entities['228'] = '&auml;';
	    entities['229'] = '&aring;';
	    entities['230'] = '&aelig;';
	    entities['231'] = '&ccedil;';
	    entities['232'] = '&egrave;';
	    entities['233'] = '&eacute;';
	    entities['234'] = '&ecirc;';
	    entities['235'] = '&euml;';
	    entities['236'] = '&igrave;';
	    entities['237'] = '&iacute;';
	    entities['238'] = '&icirc;';
	    entities['239'] = '&iuml;';
	    entities['240'] = '&eth;';
	    entities['241'] = '&ntilde;';
	    entities['242'] = '&ograve;';
	    entities['243'] = '&oacute;';
	    entities['244'] = '&ocirc;';
	    entities['245'] = '&otilde;';
	    entities['246'] = '&ouml;';
	    entities['247'] = '&divide;';
	    entities['248'] = '&oslash;';
	    entities['249'] = '&ugrave;';
	    entities['250'] = '&uacute;';
	    entities['251'] = '&ucirc;';
	    entities['252'] = '&uuml;';
	    entities['253'] = '&yacute;';
	    entities['254'] = '&thorn;';
	    entities['255'] = '&yuml;';
    } else {
        throw Error("Table: "+useTable+' not supported');
        return false;
    }
    
    // ascii decimals to real symbols
    for (decimal in entities) {
        symbol = String.fromCharCode(decimal);
        histogram[symbol] = entities[decimal];
    }
    
    return histogram;
}

function google_analytics(){
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
try {
var pageTracker = _gat._getTracker("UA-3383703-4");
pageTracker._trackPageview();
} catch(err) {}
}

function tipo_alfanumerico(obj){//Retorna False si no es una cadena de caracteres o tiene comillas.
 //Expresion regular para alfanumericos y espacios en blanco
 if(comillas(obj)){//Retorna False, ya que tiene comillas.
  return false;
 }
 //var exp_reg =/(^\w)((((\w)|(\s))*)$)/;
 var exp_reg =/(^\D)((((\w)|(\.)|(\s)){1,})$)/;
 if (obj.match(exp_reg))
   return true;
 else
   return false;
}

function tipo_alfa(obj){//Retorna False si no es una cadena o tiene comillas
 if(comillas(obj)){//Retorna False, ya que tiene comillas.
  return false;
 }
 var exp_reg =/([(a-z)(A-Z)(á-ú)(Á-Ú)]{3,})+/
  if (obj.match(exp_reg))
   return true;
  else
    return false;
}

function tipo_titulo(obj){//Retorna False si no es una cadena o tiene comillas
 if(comillas(obj)){//Retorna False, ya que tiene comillas.
  return false;
 }
 //var exp_reg =/^([(a-z)(A-Z)]{3,})+/
 //var exp_reg =/^([(\w|\,)]{3,})+/
 var exp_reg =/^([(a-z)(A-Z)(á-ú)(0-9)(Á-Ú)])+/
  if (obj.match(exp_reg))
   return true;
  else
    return false;
}

function tipo_login(obj){//Retorna False si no es una cadena de caracteres o tiene comillas.
 //Expresion regular para alfanumericos y espacios en blanco
 if(comillas(obj)){//Retorna False, ya que tiene comillas.
  return false;
 }
 //var exp_reg =/(^\w)((((\w)|(\s))*)$)/;
 var exp_reg =/(^\D)((((\w)|(\.)){5,})$)/;
 if (obj.match(exp_reg))
   return true;
 else
   return false;
}

function tipo_password(obj){
 if(comillas(obj)){//Retorna False, ya que tiene comillas.
  return false;
 }
 //var exp_reg =/(^\w)((((\w)|(\s))*)$)/;
 var exp_reg =/(^(((\w)|(\.)){6,})$)/;
 if (obj.match(exp_reg))
   return true;
 else
   return false;
}

function comillas(string)//Recibe como parametro una cadena de caracteres
{//Retorna true si por lo menos encuentra una de las siguientes comillas: '"
 var str;
 var re = /('|"|,|<|>|;)/;//Comillas, comas, menor que, mayor que: Estos caracteres pueden generar muchos problemas..
 str = string;
 str = str.toString();
  if(!str.match(re)){
   //alert("false");
   return false;
  }
  else{
   //alert("true");
   return true;
  }
}



function isEMailAddr(str){//Valida si se ha digitado un e-mail correctamente. Utilizando expreciones regulares
//Retorna TRUE si el mail digitado esta correcto.
  //var str = elem.value;
  var re = /^[\w-]+(\.[\w-]+)*@([\w-]+\.)+[a-zA-Z]{2,7}$/;//Exprecion Regular
  if (!str.match(re)){return false;}
   else{return true;}
}

function esDigito(sChr){
 var sCod = sChr.charCodeAt(0);
 return ((sCod > 47) && (sCod < 58));
}

function finMes(oTxt){
 var nMes = parseInt(oTxt.value.substr(5, 7), 10);//obtengo el mes
 var nRes = 0;
 switch (nMes){
  case 1: nRes = 31; break;
  case 2: nRes = 28; break;
  case 3: nRes = 31; break;
  case 4: nRes = 30; break;
  case 5: nRes = 31; break;
  case 6: nRes = 30; break;
  case 7: nRes = 31; break;
  case 8: nRes = 31; break;
  case 9: nRes = 30; break;
  case 10: nRes = 31; break;
  case 11: nRes = 30; break;
  case 12: nRes = 31; break;
 }
 return nRes;
}

function valDia(oTxt){
 var bOk = false;
 var nDia = parseInt(oTxt.value.substr(8, 10), 10);//obtiene el dia
 bOk = bOk || ((nDia >= 1) && (nDia <= finMes(oTxt)));//valida que el dia seleccionado está dentro del limite de dias del mes
 return bOk;
}

function valMes(oTxt){
 var bOk = false;
 var nMes = parseInt(oTxt.value.substr(5, 7), 10);//obtiene el mes
 bOk = bOk || ((nMes >= 1) && (nMes <= 12));//verifica que el mes esté entre 1 y 12.
 return bOk;
}

function valAno(oTxt){
 var bOk = true;
 var nAno = oTxt.value.substr(0,4);//obtiene el año de la fecha.
 bOk = bOk && ((nAno.length == 2) || (nAno.length == 4));
 if (bOk){
  for (var i = 0; i < nAno.length; i++){
   bOk = bOk && esDigito(nAno.charAt(i));//valida que el año sea numerico, que no contenga letras.
  }
}
 return bOk;
}

function valFecha(oTxt){
 var bOk = true;
 if (oTxt != ""){
  bOk = bOk && (valAno(oTxt));
  bOk = bOk && (valMes(oTxt));
  bOk = bOk && (valDia(oTxt));
  bOk = bOk && (valSep(oTxt));
  if (!bOk){
   return false;
   //oTxt.value = "";
   //oTxt.focus();
  }
   return true;
 }
}

function valSep(oTxt){
 var bOk = false;
 bOk = bOk || ((oTxt.value.charAt(4) == "-") && (oTxt.value.charAt(7) == "-"));
 bOk = bOk || ((oTxt.value.charAt(4) == "/") && (oTxt.value.charAt(7) == "/"));
 return bOk;
}

<!--/script-->