    //*******************************************************************************************
    //								Constantes en JScript
    //*******************************************************************************************
    
    	var FECHA_CORRECTA = "Lo digitado como fecha no es una fecha correcta y/o válida";
    	var FECHA_MAYOR = "Estimado(a) usuario(a) la primera fecha no puede ser mayor a la segunda";
    	var FECHA_MENOR_HOY = "La fecha 'hasta' debe ser mayor al día de hoy";
    	var TELEFONO_CORRECTO = "Lo digitado en el campo de teléfono no cumple con el formato ###-####";
    	var EMAIL_CORRECTO = "Lo digitado en el campo del correo electrónico no es una dirección de email correcta";
    	var IP_TERMINO_INCORRECTO = "Uno de los términos de la dirección IP es incorrecto (mayor a 254)";
    	var IP_INCORRECTO = "La dirección IP digitada es incorrecta, no cumple con su estándar";
    	var IP_DESCRIPCION = "Por favor, digite la dirección IP asociada a la oficina";
    	var IP_SELECCION = "Por favor seleccione la oficina en la cual pertence";
    	var SELECCION_IP = "Por favor, debe incluir en la lista la(s) dirección(es) IP antes de agregarlas a la base de datos.\nPara agregar la dirección IP a la lista, utilize el botón con el '+'.";
// 	var PROYECTO = "http://poas/scij_nrm_web/index_pgr.asp";
// 	var PROYECTO_RUTA = "http://poas/scij_nrm_web/";
//    	var PROYECTO_NAME = "scij";
 	
	var PROYECTO = "http://www.pgr.go.cr/scij/index_pgr.asp";
 	var PROYECTO_RUTA = "http://www.pgr.go.cr/scij/";


//Minor
//	var PROYECTO = "http://10.60.24.50/scij/index_pgr.asp";
// 	var PROYECTO_RUTA = "http://10.60.24.50/scij/";

    	var PROYECTO_NAME = "scij";
    	
    	var IDS_CLAVE = "Por favor, digite la clave del usuario";
    	var IDS_CONFIRMACION = "La clave y su respectiva confirmación no coinciden";
    	var IDS_FECHA_DESDE = "Por favor, digite la fecha inicial";
    	var IDS_FECHA_HASTA = "Por favor, digite la fecha final";
    	var IDS_NOMBRE = "Por favor, digite el nombre del usuario";
    	var IDS_TIPO = "Por favor, selecione el tipo de usuario";
    	var IDS_USUARIO = "Por favor, digite el login del usuario";
    	var IDS_BORRAR_USUARIO = "Está seguro(a) que desea borrar a: ";
    	var IDS_CONFIR_USUARIO = "Si elimina a ese usuario no podrá reversar los cambios.\nDesea continuar?"
    	var IDS_SELECCIONAR_USUARIO = "Por favor, seleccione un usuario de la lista";
    	var IDS_BORRAR_GRUPO = "Está seguro(a) que desea borrar a: ";
    	var IDS_CONFIR_GRUPO = "Si elimina a ese grupo no podrá reversar los cambios.\nDesea continuar?"
    	var IDS_SELECCIONAR_GRUPO = "Por favor, seleccione un grupo de la lista";
    	var IDS_NO_BORRAR_GRUPO = "Para borrar un grupo, éste NO debe tener usuarios asociados";
    	var IDS_CONCURRENTES_NUMERICO = "Por favor, indique cuantas personas se pueden logear con este usuario.\nEn caso de ser ilimitado digite 0(cero).\nSólo se aceptan datos numéricos."
    	
    	//Para indicarle al usuario en donde está
    	var m_strDondeEstoy = "PGR - SINALEVI >> "
    	
    //*******************************************************************************************
    //Function:	EstaGrupo
    //Objetivo:	Se le pasa por parámetro un listbox, y revisa si en dicho control
    //			se encuentra un item con una descripción idéntica al parámetro
    //			que recibe en valor. Devuelve true si el item ya está incluido.
    //Autor:	Christian Sandoval Moya (S-COM)
    //*******************************************************************************************
    function EstaGrupo(nValor, frmFrame)
    {
    	var nI = 0;
    	var nCuantos = frmFrame.options.length;
    	var bRetornar = false;
    	for(nI = 0; nI < nCuantos; nI++)
    	{
    		if(frmFrame.options[nI].value == nValor)
    			bRetornar = true;
    	}
    	return bRetornar;
    }
    
    
    //******************************************************************************************
    //Function:	SoloBlancos
    //Objetivo:	Devuelve true si la hilera que le pasan por parámetro
    //			solamente está compuesta de espacios en blanco.
    //Autor:	Christian Sandoval Moya (S-COM)
    //******************************************************************************************
    function SoloBlancos(str)
    {
    	var nCuantos = str.length;
    	if(nCuantos == 0)
    		return true;
    	var blancos = /^[\s]+$/;
    	return blancos.test(str);
    }
    
    //*****************************************************************************************
    //Function:	Trim
    //Objetivo:	Trunca los espacios en blanco a la izquierda y a la 
    //			derecha de la hilera que se le pasa por parámetro.
    //			Devuelve la hilera modificada, por lo cual cuando se
    //			invoca esta función se debe asignar a la variable con
    //			que se quiere trabajar.
    //Autor:	Christian Sandoval Moya (S-COM)
    //****************************************************************************************
    function Trim(str)
    {
    	var n = str.length;
    	if(n == 0) 
    		return "";
    	if(SoloBlancos(str))
    		return "";
    	
    	while (str.substr(0,1) == " ")
    	{
    		str = str.substr(1);
    	}
    	n = str.length;
    	
    	while (str.substr(n -1,1) == " ") 
    	{
    		str = str.substr(0,n-1);
    		n = str.length;
    	}
    	return str;
    }
    
    
    //****************************************************************************
    //Function:	ActualizarListBox
    //Objetivo: Cuando el usuario hace click en un list box se borra el item
    //			seleccionado. Esta rutina lo que hace es que acomada el restante
    //			grupo de items en el listbox, es decir, que si el usuario borró
    //			el primer item, pone el segundo en la primera posición, el tercero
    //			en la segunda y así consecutivamente. Es más que todo para presentación.
    //			Nótese que se le pasa el frame, el cual debe incluir el list box
    //			deseado.
    //Autor:	Christian Sandoval Moya (S-COM)
    //****************************************************************************
    function ActualizarListBox(nLugar, frmFrame)
    {
    	var nCuantos = frmFrame.options.length;
    	var nValor;
    	var nI;
    	var strTexto;
    	
    	if(nCuantos == 1) 
    	{
    		//Hay que borrar todo lo que hay, ya que sólo hay un campo
    		frmFrame.options.RemoveAll;
    		frmFrame.options[0].text= "";
    		frmFrame.options.length = 0;
    	}
    	if(nCuantos > 1)
    	{
    		for(nI = nLugar; nI < (nCuantos-1); nI++)
    		{
    			strText = frmFrame.options[nI + 1].text;
    			nValor = frmFrame.options[nI + 1].value;
    			frmFrame.options[nI].text = strText;
    			frmFrame.options[nI].value = nValor;
    		}
    		frmFrame.options.length--;
    	}
    }
    
    
    //*********************************************************************
    //Function:	EsFecha
    //Objetivo:	Verifica que el string que recibe cumpla con la máscara de
    //			una fecha válida. El mes es menor a 12. El día menor a 31.
    //			Y el año está entre 1960 y 2010.
    //Autor:	Christian Sandoval Moya (S-COM)
    //*********************************************************************
    function EsFecha(str)
    {
    	var bRetornar;
    	var nAnno;
    	var nDia;
    	var nMes;
    	var strFecha = /^[0-9]{2}\/[0-9]{2}\/[0-9]{4}$/;
    	bRetornar = strFecha.test(str);
    	if(bRetornar == true)
    	{
    		nDia = parseInt(Trim(str.substring(0,2)),10);
    		nMes = parseInt(Trim(str.substring(3,5)),10);
    		nAnno = parseInt(Trim(str.substring(6,11)),10);
    		if((nAnno <= 1800) || (nMes > 12) || (nDia > 31) ||(nAnno >= 2050))
    		{
    			bRetornar = false;
    		}
    		if((nMes == 2) || (nMes == 4) || (nMes == 6) || (nMes == 9) || (nMes == 11))
    		{
    			//Comprobamos cantidad de dias por mes
    			if(nDia > 30)
    			{
    				bRetornar = false;
    			}
    		}
    		if((nMes == 2) && (nDia > 29))
    		{
    			bRetornar = false;
    		}
    	}
    	return bRetornar;
    }
    
    //************************************************************************
    //Function:	EsTelefono
    //Objetivo:	Verifica que el string que recibe cumpla con la máscara de
    //			un número telefónico, ya sea escrito así: 123-1233 ó 1231233
    //Autor:	Christian Sandoval Moya (S-COM)
    //************************************************************************
    function EsTelefono(str)
    {
    	var strTelefono = /^[0-9]{3}[-][0-9]{4}$/;
    	return strTelefono.test(str);
    }
    
    //*******************************************************************
    //Function:	EstaTelefono
    //Objetivo:	Comprueba que no exista el número de teléfono que se 
    //			intenta agregar al listbox. Se compara con la propiedad
    //			value de cada item del listbox. Recibe como parámetros
    //			el listbox a revisar y el 'nuevo' número de teléfono
    //Autor:	Christian Sandoval Moya (S-COM)
    //*******************************************************************
    function EstaTelefono(strTelefono,frmFrame)
    {
    	var nI = 0;
    	var bRetornar = false;
    	var nCuantos = frmFrame.options.length;
    	for(nI = 0; nI < (nCuantos); nI++)
    	{
    		if(frmFrame.options[nI].value == strTelefono)
    			bRetornar = true;
    	}
    	return bRetornar;
    }
    
    //*******************************************************************
    //Function:	EsEmail
    //Objetivo:	Comprueba que la hilera que se le está pasando como pará-
    //			metro es una posible dirección válida de cuentas email.
    //			Se fija nada más en el formato que se digitó, no en si
    //			la cuenta existe o no.
    //Autor:	Christian Sandoval Moya (S-COM)
    //*******************************************************************
    function EsEmail(str)
    {
    	//Tipo de direccion: nombre@s-com.com
    	var strEmail = /^[a-z][a-z_0-9\.\-]+@[a-z_0-9\.\-]+\.[a-z]{3}$/i
    	if (strEmail.test(str) == false)
    	{
    		//Tipo de direccion: nombre@racsa.co.cr
    		strEmail = /^[a-z][a-z_0-9\.\-]+@[a-z_0-9\.\-]+\.[a-z]{2}\.[a-z]{2}$/i
    		return strEmail.test(str);
    	}
    	else
    		return true;
    }
    
    
    //*******************************************************************
    //Function:	SoloDigitos
    //Objetivo:	Devuelve true si la hilera que está recibiendo contiene
    //			solamente caractéres numéricos. No modifica el string.
    //Autor:	Christian Sandoval Moya (S-COM)
    //*******************************************************************
    function SoloDigitos(str)
    {
    	var strNumerico = /^[\d]+$/
    	return strNumerico.test(str)
    }
    
    //**********************************************************************
    //Function:	EsDoble
    //Objetivo:	Toma la hilera que recibe y examina a ver si trae un dato
    //			numérico que sea de tipo entero o doble. No modifica string
    //Autor:	Christian Sandoval Moya (S-COM)
    //**********************************************************************
    function EsDoble(str)
    {
    	var strDoble = /^[\d]+\.[\d]+$/
    	if(SoloDigitos(str) == true)
    		return true;
    	else
    		return strDoble.test(str)
    }
    
    
    //***************************************************************************************
    //Function:	txtFecha_onkeyup
    //Objetivo:	Cuando el usuario digita una fecha, esta rutina le agrega los '/' en los 
    //			respectivos lugares, para que el usuario no tenga que digitarlos. Recibe 
    //			como parámetro el frame	que hace la invocación, conjuntamente con el campo 
    //			texto de la fecha. No toma en cuenta los entre, backspace, ni las flechas.
    //Autor:	Christian Sandoval Moya (S-COM)
    //***************************************************************************************
    function txtFecha_onkeyup(frmFrame)
    {
    
    	var strFecha= Trim(frmFrame.value);
    	if((event.keyCode == 8) || (event.keyCode == 37) || (event.keyCode == 39) || (event.keyCode == 46) || (event.keyCode == 35) || (event.keyCode == 36))
    		return false;
    	if(strFecha.length == 2) 
    		strFecha += "/";
    	if(strFecha.length == 5) 
    		strFecha += "/";
    	if(strFecha.length == 3)
    		{
    			if(strFecha.substr(2) != "/")
    				{
    					strFecha = strFecha.substr(0,2) + "/" + strFecha.substr(2);
    				}
    		}
    	if(strFecha.length == 6)
    		{
    			if(strFecha.substr(5) != "/")
    				{
    					strFecha = strFecha.substr(0,5) + "/" + strFecha.substr(5);
    				}
    		}
    	frmFrame.value = strFecha;
    }
    
    
    //*****************************************************************************
    //Function: CalcularDiferencia
    //Objetivo:	Toma dos fechas y calcula la diferencia entre ellas. Esta función
    //			es útil cuando se quiere determinar si una fecha es mayor o menor
    //			que otra. Si la primera fecha es menor que la segunda devuelve un
    //			número mayor a cero, en caso contrario, es decir, si la segunda
    //			fecha es menor que la primera devuelve un valor negativo. En caso
    //			de que sean las mismas fechas devuelve un cero. 
    //			Más sencillo aún, esta función devuelve la diferencia de DÍAS 
    //			existentes desde la fecha 2 a la fecha 1.
    //Autor:	Christian Sandoval Moya (S-COM)
    //*****************************************************************************
    function CalcularDiferencia(strFecha1, strFecha2)
    {
    	var nTotal1, nTotal2;
    	var nAnno;
    	var nDia;
    	var nMes;
    
    	nDia = parseInt(Trim(strFecha1.substring(0,2)),10);
    	nMes = parseInt(Trim(strFecha1.substring(3,5)),10);
    	nAnno = parseInt(Trim(strFecha1.substring(6,11)),10);
    	nTotal1 = Date.UTC(parseInt(nAnno),parseInt(nMes),parseInt(nDia));
    	
    	nDia = parseInt(Trim(strFecha2.substring(0,2)),10);
    	nMes = parseInt(Trim(strFecha2.substring(3,5)),10);
    	nAnno = parseInt(Trim(strFecha2.substring(6,11)),10);
    	nTotal2 = Date.UTC(parseInt(nAnno),parseInt(nMes),parseInt(nDia));		
    	
    	nTotal1 = nTotal2 - nTotal1;
    
    	nTotal1 = ((((parseInt(nTotal1) /24) / 60) /60) /1000);
    	
    	return nTotal1;
    }
    
    //*****************************************************************************************
    //Function:	FechaMayorAHoy
    //Objetivo:	Recibe como parámetro una fecha determinada y calcula si es mayor a el día
    //			de hoy o no. En caso de ser mayor a hoy devuelve false.
    //Autor:	Christian Sandoval Moya (S-COM)
    //*****************************************************************************************
    function FechaMayorAHoy(strFecha)
    {
    	var dtFecha, nHoy, nTotal;
    	var nAnno, nDia, nMes;
    	
    	dtFecha = new Date();
    	
    	//Obtenemos la cantidad de milesegundos existentes desde 01/01/1970 hasta hoy
    	//Nótese que getMonth se le suma un 1 ya que la numeración de los meses comienza en cero
    	nHoy = Date.UTC(dtFecha.getYear(),dtFecha.getMonth()+1,dtFecha.getDate());
    	
    	//Obtenemos el año, el mes y el día de la fecha que se recibe como parámetro
    	nDia = parseInt(Trim(strFecha.substring(0,2)),10);
    	nMes = parseInt(Trim(strFecha.substring(3,5)),10);
    	nAnno = parseInt(Trim(strFecha.substring(6,11)),10);
    	
    	//Obtenemos la cantidad de mileegundos existentes desde 01/01/1970 hasta la fecha digitada
    	nTotal = Date.UTC(parseInt(nAnno),parseInt(nMes),parseInt(nDia));
    
    	//Realizamos una resta entre cantidad de milesegundos para determina si la fecha digitada es mayor a hoy
    	if( (parseInt(nHoy) - parseInt(nTotal)) < 0 )
    		return false;
    	else
    		return true;
    
    }
    
    
    //***********************************************************************************************
    //Function:	RevisarFechas
    //Objetivo:	Recibe dos fechas y comprueba que ambas en verdad sean fechas, que la primera
    //			fecha sea menor a la segunda, y que la segunda sea menor o igual al día de hoy.
    //			Esta función es invocada por las rutinas que van a generar reportes, para 
    //			comporbar la validez de las fechas 'desde' y 'hasta'.
    //			Se le debe pasar como parámetros los dos campos del formulario con su respectivos
    //			nombres, debido a que en caso de que exista un error suspende la acción y pone
    //			el focus en el control correspondiente. Devuelve false si encontró algún error.
    //Autor:	Christian Sandoval Moya (S-COM)
    //***********************************************************************************************
    function RevisarFechas(frmFechaDesde, frmFechaHasta)
    {
    	var strFechaDesde = Trim(frmFechaDesde.value);
    	var strFechaHasta = Trim(frmFechaHasta.value);
    	
    		
    	//Se comprueba que se haya digitado la primera fecha
    	if(strFechaDesde == "")
    	{
    		alert(FECHA_DESDE);
    		frmFechaDesde.focus();
    		return false
    	}
    	
    	//Verifica que lo digitado en la fecha inicial en verdad sea una fecha correcta
    	if(EsFecha(strFechaDesde) == false)
    	{
    		alert(FECHA_CORRECTA);
    		frmFechaDesde.focus();
    		return false;
    	}
    	
    	//Se comprueba que se haya digitado la segunda fecha
    	if(strFechaHasta == "")
    	{
    		alert(FECHA_HASTA);
    		frmFechaHasta.focus();
    		return false
    	}
    	
    	//Verifica que lo digitado en la fecha final en verdad sea una fecha correcta
    	if(EsFecha(strFechaHasta) == false)
    	{
    		alert(FECHA_CORRECTA);
    		frmFechaHasta.focus();
    		return false;
    	}
    	
    	//Calculamos que la fecha segunda sea mayor a la primera
    	if(CalcularDiferencia(strFechaDesde,strFechaHasta) < 0) 
    	{
    		alert(FECHA_MAYOR);
    		frmFechaDesde.focus();
    		return false;
    	}
    	
    	//Revisa que la fecha Hasta sea mayor a el día de hoy
    	if(FechaMayorAHoy(strFechaHasta) == true)
    	{
    		alert(FECHA_MENOR_HOY);
    		frmFechaHasta.focus();
    		return false;
    	}
    	
    	return true;
    }
    
    
    //********************************************************************************************
    //Function:	EsHora
    //Objetivo:	Recibe como parámetro una variable y determina si es un hora válida. Para ello
    //			verifica que se cumpla con el formato HH:MM AM|PM. Además revisa que los dos
    //			primeros digitos estén comprendidos entre 01 y 12; los dos digitos de la hora
    //			estén entre 00 y 59.Entre los minutos y el AM o PM pueden haber varios espacios
    //			en blanco. El AM y el PM pueden ser una combinación de mayúsculas y minúsculas.
    //			Retorna true si todo está correcto, de caso contrario devuelve false.
    //Autor:	Christian Sandoval Moya (S-COM)
    //********************************************************************************************
    function EsHora(str)
    {
    	var strHora = /^[0-9]{2}[:][0-9]{2}[\ ]?[P|A]M$/i;
    	var bRetornar;
    	var nHora, nMinutos;
    	bRetornar = strHora.test(str);
    	if(bRetornar == true)
    	{
    		nHora = parseInt(Trim(str.substring(0,2)),10);
    		nMinutos = parseInt(Trim(str.substring(3,5)),10);
    		if((nHora > 12) || (nMinutos > 59) || (nHora < 1))
    		{
    			bRetornar = false;
    		}
    	}
    	return bRetornar;
    }
    
    //************************************************************************
    //Function:	EsDireccionIP
    //Objetivo:	Verifica que el string que recibe cumpla con la máscara de
    //			una dirección IP: 000.000.000.000
    //Autor:	Christian Sandoval Moya (S-COM)
    //************************************************************************
    function EsDireccionIP(str)
    {
    	var strDireccionIP = /^[0-9]{1}[0-9]?[0-9]?\.[0-9]{1}[0-9]?[0-9]?\.[0-9]{1}[0-9]?[0-9]?\.[0-9]{1}[0-9]?[0-9]?$/;
    	var nLugar = 1;
    	var strTermino;
    
    	if(strDireccionIP.test(str) == true)
    	{
    		while(nLugar != -1)
    		{
    			nLugar = str.indexOf(".");
    			if(nLugar == -1)
    				strTermino = str;
    			else
    				strTermino = str.substring(0,nLugar);
    			if(parseInt(strTermino,10) > parseInt("255",10))
    			{
    				alert(IP_TERMINO_INCORRECTO);
    				return false;
    			}
    			str = str.substring(nLugar+1);
    		}
    		return true;
    	}
    	else
    	{
    		alert(IP_INCORRECTO);
    		return false;
    	}
    }
    
    //************************************************************************
    //Function:	MostrarAyuda
    //Objetivo:	Muestra un div con el mensaje que recibe como parámetro. 
    //			El div debe llamarse divAyuda y debe tener posición absoluta
    //			además de estar oculto. También debe tener un <p> llamado 
    //			pTextoAyuda. Muestra el div a la izquierda de donde el usuario
    //			hizo clic.
    //Autor:	Christian Sandoval Moya (S-COM)
    //************************************************************************
    function MostrarAyuda(strAyuda)
    {
    	//Toma la posición de donde el usuario hizo clic
    	var x = event.x;
    	var y = event.y;
    	var strPosicion = '';
    	//Se obtiene la referencia al div oculto 
    	var divAyuda = top.MainFrame.window.divAyuda;
    	var pTextoAyuda = top.MainFrame.window.pTextoAyuda;
    	
    	//En caso de que no haya sido declarado salimos de la función
    	if(divAyuda == null)
    		return;
    		
    	var objParametros = MostrarAyuda.arguments;
    	var nI = 0;
    	
    	for(nI = 1; nI <= objParametros.length-1; nI++)
    	{
    		var objTemporal = eval('top.MainFrame.window.document.all("' + objParametros[nI].toString() + '")');
    		if(objTemporal != null)
    			objTemporal.style.visibility = 'hidden';
    	}
      
    	//Ubicamos el div de acuerdo a la posición donde el usuario hizo clic
    	//además del posible scroll que tenga la pantalla y el ancho del div
    	//de ayuda
    	strPosicion = x - parseInt(divAyuda.style.width,10) + window.document.body.scrollLeft - 10;
    	strPosicion = strPosicion.toString();
    	//Si la posición es menor a cero, el div de ayuda se cortaría, por lo que hay que
    	//mostrarlo siempre visible
    	if(strPosicion <= 0)
    		strPosicion = "1";
    
    	divAyuda.style.left = strPosicion;
    	
    	divAyuda.style.top	= parseInt(window.document.body.scrollTop,10) + y - 5;
    	
    	//Queremos que se muestre sobre los otros controles
    	divAyuda.style.zIndex = 1;
    	
    	//Colocamos el mensaje de ayuda que recibimos como parámetro
    	pTextoAyuda.innerHTML = strAyuda;
    	
    	//Hacemos visible el div	
    	divAyuda.style.visibility = 'visible';
    	
    }
    
    //************************************************************************
    //Function:	OcultarAyuda
    //Objetivo:	Simplemente oculta el div de ayuda mostrado con la función
    //			MostrarAyuda
    //Autor:	Christian Sandoval Moya (S-COM)
    //************************************************************************
    function OcultarAyuda(bMostrarCombos)
    {
    	//Se obtiene la referencia al div oculto 
    	var divAyuda = window.divAyuda;
    	
    	//En caso de que no haya sido declarado salimos de la función
    	if(divAyuda == null)
    		return;
    	
    	//Se oculta el div
    	divAyuda.style.visibility = 'hidden';
    	
    	if(bMostrarCombos != false)
    	{
    		//Se obtienen los combo box del formulario 
    		var objSelect = document.all.tags("SELECT");
    		var nI;
    		//Se recorre cada uno de ellos y se hace visible, esto
    		for (nI=0; nI < objSelect.length; nI++) 
    			//porque puede ser que a la hora de mostrar la ayuda
    			//se tuvo que ocultar algún combo box
    			objSelect[nI].style.visibility = 'visible';
    	}
    }
    
    
    //*****************************************************************************************
    //Function:	AnnoMayorActual
    //Objetivo:	Recibe como parámetro un año determinada y calcula si es mayor al actual.
    //			En caso de ser mayor devuelve true, si es menor o igual devuelve false.
    //Autor:	Christian Sandoval Moya (S-COM)
    //*****************************************************************************************
    function AnnoMayorActual(nAnno)
    {
    	var dtFecha;
    	var nAnnoActual;
    	
    	dtFecha = new Date();
    	
    	//Se debe comprobar que lo pasado es un año
    	if(EsAnno(nAnno) == false)
    		return true;
    	
    	//Obtenemos el año actual
    	nAnnoActual = dtFecha.getYear();
    
    	//Compara el año actual con el año recibido como parámetro
    	if(parseInt(nAnno,10) <= parseInt(nAnnoActual,10))
    		return false;
    	else
    		return true;
    
    }
    
    
    //*****************************************************************************************
    //Function:	RevisarAnnos
    //Objetivo:	Revisa si el primer parámetro no es mayor al segundo. En caso de serlo devuelve
    //			false. La idea es que el año desde sea menor al año hasta.
    //Autor:	Christian Sandoval Moya (S-COM)
    //*****************************************************************************************
    function RevisarAnnos(nAnnoDesde, nAnnoHasta)
    {
    	//Compara el año actual con el año recibido como parámetro
    	if(parseInt(nAnnoDesde,10) <= parseInt(nAnnoHasta,10))
    		return true;
    	else
    		return false;
    }
    
    //********************************************************************************************
    //Function:	EsAnno
    //Objetivo:	Recibe como parámetro una variable y determina si es un año válido. Para ello
    //			impone dos restricciones:
    //			- Que sea mayor a 1800 (ya que hay normativa de 1821)
    //			- Que sea menor o igual al año actual (todavía no existe normas ni sentencias del otro año)
    //			Devuelve true si cumple con esas dos condiciones, falso de lo contrario.
    //Autor:	Christian Sandoval Moya (S-COM)
    //********************************************************************************************
    function EsAnno(str)
    {
    
    	var strAnno = /^[0-9]{4}$/i;
    	var nAnno = 0;
    	var dtFecha = new Date();
    	var bRetornar;
    	
    	bRetornar = strAnno.test(str);
    
    	if(bRetornar == true)
    	{
    		nAnno = parseInt(str,10);
    		if((nAnno > 1800) && (nAnno <= dtFecha.getFullYear()))
    			bRetornar = true
    		else
    			bRetornar = false;
    	}
    	return bRetornar;
    }
    
    //--------------------------------------------------------------------
    //Function:	AceptarSoloNumeros
    //Objetivo:	No permite que en el campo donde está el cursor el usuario
    //			ingrese letras que no sean numeros
    //Autor:	Christian Sandoval Moya (S-COM)
    //Fecha:	Marzo 2003
    //-------------------------------------------------------------------
    function AceptarSoloNumeros()
    {
    	if((parseInt(window.event.keyCode,10) == 13) || (parseInt(window.event.keyCode,10) == 8))
    		return true;
    
    	//Se utiliza el objeto event en su propiead keyCode para determinar
    	//que digitó el usuario. Si es menor a 48 (0) o mayor a 57 (9) se 
    	//'cancela' el evento
    	if((parseInt(window.event.keyCode,10) < 48) || (parseInt(window.event.keyCode,10) > 57))
    	{
    		window.event.keyCode = 0;
    	}
    	
    }
    
    
    
    //*****************************************************************************************
    //Function:	Sombrear
    //Objetivo:	Cambia de color el item u opción del menú por el cual pasa o sale el mouse.
    //			Cuando el mouse está sobre una opción del menú, la cambia de color (a celeste),
    //			cuando sale, la restaura. Para ello hace uso de clases definidas en el style sheet.
    //Autor:	Christian Sandoval Moya (S-COM)
    //Fecha:	Marzo 2003
    //*****************************************************************************************
    function Sombrear( tdMenu, bMouseOver ) 
    {
    	//Si el td indicado es el actual no se hace nada, porque es el que es la opción
    	//seleccionada del menú
    	if(tdMenu == objMenuActual)
    		return;
    	
    	//onMouseOver
    	if ( bMouseOver ) 
    	{
    		//Hay que cambiarle de color a la opción del menú
    		tdMenu.parentElement.className = 'OpcionMenuSombra';
    	} 
    	//onMouseOut
    	else 
    	{
    		//Hay que restaurar el color de la opción anterior del menú
    		tdMenu.parentElement.className =  'OpcionMenu';
    	}
    }
    
    //*****************************************************************************************
    //Function:	VolverResultados
    //Objetivo:	Vuelve a la ùltima pàgina de los resultados que visitó el usuario, para ello
    //			se utiliza una variable que se declara en el frame superior (TopFrame) y se 
    //			llama m_lastResultado. Por lo tanto es importante que cuando el usuario seleccione
    //			alguno de los resultados, ademàs de direccionar al usuario a la página del 
    //			pronunciamiento ademàs indique cual es la ùltima pàgina de resultados que visitò.
    //Autor:	Christian Sandoval Moya (S-COM)
    //Fecha:	Marzo 2003
    //*****************************************************************************************
    function VolverResultados(strRuta)
    {
    	//No se acepta rutas nulas
    	if(strRuta == '')
    		return;
    		
    	//Se cambia el contenido del frame principal
    	top.MainFrame.location = strRuta
    		
    	//Se oculta la tabla que contiene el botòn de volver a los resultados
    	scijResultado.style.visibility = 'hidden';
    }
    
    //*****************************************************************************************
    //Function:	CambiarFrames
    //Objetivo:	Cuando el usuario hace clic en alguna opción del menú vertical de la izq. se
    //			deben realizar dos cosas:
    //			1. Cambiar en el frame central (MainFrame) el contenido de la página. Para ello
    //			hace uso de la variable que recibe como parámetro. 
    //			2. Actualizar la opción del menú recién seleccionada y marcarla para distigirla
    //			de las demás. También debe volver la opción de menú anteriormente marcada a normal
    //			Para lograr ese efecto se utiliza clases del style sheet.
    //Autor:	Christian Sandoval Moya (S-COM)
    //Fecha:	Marzo 2003
    //*****************************************************************************************
    function CambiarFrames(strRuta)
    {
    	var objEvento;
    	var strFrame = 'MainFrame';
    	
    	//Se obtiene el elemento actual en el que se hizo click
    	//El objEvento debe apuntar al td y no al div
    	objEvento = window.event.srcElement;
    	if(objEvento.tagName.toUpperCase() == "DIV")
    	{
    		objEvento = objEvento.parentElement;
    	}
    	
    	var objParametros = CambiarFrames.arguments;
    	var nI = 0;
    	for(nI = 1; nI <= objParametros.length-1; nI++)
    	{
    		strFrame = objParametros[nI].toString();
    	}
    
    
    	//El objeto padre es el TR, el cual debe cambiar de clase para
    	//que aparezca marcada en color rojo
    	objEvento.parentElement.className = 'OpcionMenuMarcada';
    
    	//Si el objMenuActual no es nulo, implica que antes había otra opción
    	//del menú seleccionado y hay que cambiarle la clase para volverlo al 
    	//mismo diseño que el resto de opciones
    	if (objMenuActual != null && objMenuActual != objEvento)
    	{
    		//Recuerde que es al TR al que hay que cambiar de clase, no el TD
    		//por eso se utiliza el padre del objeto actual
    		objMenuActual.parentElement.className = "OpcionMenu";
    	}
    	
    	//Se actualiza la variable del menú actual, con la opción recién seleccionada
    	objMenuActual = objEvento; 
    	
    	if(strFrame != '_blank')
    		//Se actualiza el frame principal con la ruta que se nos indica
    		eval('top.'  +  strFrame  + '.location = strRuta');
    	else
    		window.open(strRuta);
    }
    
    
    //---------------------------------------------------------------------
    //Function:	CargarPagina
    //Objetivo:	Recibe una dirección url y la carga en la totalidad de la 
    //			ventana. Esta forma de trabajar habilita la opción de 
    //			guardar esa dirección en el objeto history lo que le 
    //			permite al usuario utilizar libre y correctammente el "back" 
    //			del browser a pesar de cargar páginas en dos frames.
    //Autor:	Christian Sandoval Moya (S-COM)
    //Fecha:	Junio 2003
    //---------------------------------------------------------------------
    function CargarPagina(strUrl)
    {
    	window.event.returnValue = false;
    	top.window.location.assign(strUrl)
    	//top.window.location.href = strUrl;
    }
    
    //---------------------------------------------------------------------
    //Function:	SincronizarFramesAyuda
    //Objetivo:	Cuando se carga la página se hacen las siguientes acciones:
    //			1. Revisar si está dentro de un frame o no
    //			2. Indicar donde está el usuario 
    //			3. Revisar y actualizar menú contextual (frame izquierdo)
    //Nota:		Esta función solo se debe llamar cuando se trate de una página
    //			relacionada con el menú de ayuda (manuales, comentarios, etc).
    //Autor:	Sandra García Salas, S-COM
    //Fecha:	Agosto 2003
    //---------------------------------------------------------------------
    function SincronizarFramesAyuda(strDondeEstoy) 
    {
    	var strRuta = '';
    	var strTemp = '';
    	var nPosicion;
    
    	//Paso 1. Revisar si la página no en el frame, sino se debe ubicar ahí.	
    	if(top == self)
    	{
    		/*//Tomo la ruta (location) de la ventana
    		strRuta = window.location.toString();
    
    		//Busco el ultimo "/", para identificar la página
    		//nPosicion = strRuta.lastIndexOf("/");
    		nPosicion = strRuta.lastIndexOf(PROYECTO_NAME); 
    
    		if(nPosicion != -1)
    		{	
    			//Tomar el nombre del archivo
    			strTemp = strRuta.substr(nPosicion+PROYECTO_NAME.length+1, strRuta.length - nPosicion);
    
    		}
    
    		//llama al asp que contiene los frames, cargando en el principal esta página
    		window.location.href  = PROYECTO + '?url=' + strTemp;
    
    		return false;*/
    		PreInit();	
    		return false;	
    	}
    	
    	//Paso 2: Actualiza la ruta donde está 
    	var objEvento = null;
    	//TBODY - TR - TD
    	//El TR 2 es el que indica donde está el usuario
    	objEvento = top.MapFrame.tblDondeEstoy.childNodes[0].childNodes[0].childNodes[1];
    	if(objEvento != null)
    		objEvento.innerHTML = "<NOBR>" + strDondeEstoy + "</NOBR>";
    	
    	
    	//Paso 3: revisa menú contextual
    	//Se toma el string del URL que se encuentra en el frame del menú
    	strRuta = top.MenuFrame.location.toString();
    
    	//Se busca el html o asp que se encuentra cargado actualmente en el frame del menú
    	var nPosicion = strRuta.lastIndexOf("/");
    	if(nPosicion != -1)
    	{
    		//Se toma el nombre de ese archivo
    		strTemp = strRuta.substr(nPosicion+1, strRuta.length - nPosicion);
    		nPosicion = strTemp.lastIndexOf("?");
    		if(nPosicion != -1)
    			strTemp = strTemp.substr(0,nPosicion);
    	}
    
    	//Si el archivo cargado en ese frame no es menu_pgr entonces...
    	if(strTemp != 'menu_ayuda.htm')
    	{	
    		//alert('Esto no debería suceder. Sincronizar frames ayuda');
    		//Se carga ese asp para sincronizar la página del frame central y el menú contextual
    		top.MenuFrame.location = PROYECTO_RUTA + 'ayuda/menu_ayuda.htm';
    	}
    	else
    	{
    		//Si el menú ya esta cargado se debe quitar cualquier posible opción previamente
    		//seleccionada.
    		top.MenuFrame.ActualizarMenu();
    	}	
    }
    
    //----------------------------------------------------------------------------
    //Function:	SincronizarFramesBusquedasAfuera
    //Objetivo:	Cuando se carga la página se hacen las siguientes acciones:
    //			1. Revisar si está dentro de un frame o no
    //			2. Indicar donde está el usuario 
    //			3. Revisar y actualizar menú contextual (frame izquierdo)
    //Nota:		Esta función solo se debe llamar cuando se trate de una página
    //			que NO muestre algo particular de un pronunciamiento, sino 
    //			algún formulario de búsqueda avanzada de la PGR (no solo dictamenes)
    //Autor:	Sandra García Salas, S-COM
    //Fecha:	Agosto 2003
    //----------------------------------------------------------------------------
    function SincronizarFramesBusquedasAfuera(strDondeEstoy) 
    {
    	var strRuta = '';
    	var strTemp = '';
    	var nPosicion;
    	
    	//Paso 2: Actualiza la ruta donde está 
    	var objEvento = null;
    	//TBODY - TR - TD
    	//El TR 2 es el que indica donde está el usuario
    	objEvento = top.MapFrame.tblDondeEstoy.childNodes[0].childNodes[0].childNodes[1];
    	if(objEvento != null){
    		objEvento.innerHTML = "<NOBR>" + strDondeEstoy + "</NOBR>";
    	}	
    		
    	return false;
    	
    	//Paso 1. Revisar si la página no en el frame, sino se debe ubicar ahí.	
    	if(top == self)
    	{
    		/*//Tomo la ruta (location) de la ventana
    		strRuta = window.location.toString();
    
    		//Busco el ultimo "/", para identificar la página
    		//nPosicion = strRuta.lastIndexOf("/");
    		nPosicion = strRuta.lastIndexOf(PROYECTO_NAME); 
    
    		if(nPosicion != -1)
    		{	
    			//Tomar el nombre del archivo
    			strTemp = strRuta.substr(nPosicion+PROYECTO_NAME.length+1, strRuta.length - nPosicion);
    
    		}
    
    		//llama al asp que contiene los frames, cargando en el principal esta página
    		window.location.href  = PROYECTO + '?url=' + strTemp;*/
    		
    		PreInit();
    		return false;
    	}
    	
    
    	//Paso 3: revisa menú contextual
    	//Se toma el string del URL que se encuentra en el frame del menú
    	strRuta = top.MenuFrame.location.toString();
    
    	//Se busca el html o asp que se encuentra cargado actualmente en el frame del menú
    	var nPosicion = strRuta.lastIndexOf("/");
    	if(nPosicion != -1)
    	{
    		//Se toma el nombre de ese archivo
    		strTemp = strRuta.substr(nPosicion+1, strRuta.length - nPosicion);
    		nPosicion = strTemp.lastIndexOf("?");
    		if(nPosicion != -1)
    			strTemp = strTemp.substr(0,nPosicion);
    	}
    
    	//Si el archivo cargado en ese frame no es menu_pj entonces...
    	if(strTemp != 'menu_sinalevi.htm')
    	{	
    		alert('esto no debería suceder, sincronizar frames busqueda');
    		//Se carga ese asp para sincronizar la página del frame central y el menú contextual
    		top.MenuFrame.location = PROYECTO_RUTA + 'menu_sinalevi.htm';
    	}
    	else
    	{
    		//Si el menú ya esta cargado se debe quitar cualquier posible opción previamente
    		//seleccionada.
    		top.MenuFrame.ActualizarMenu();
    	}	
    }
    
    //<SCRIPT LANGUAGE="JavaScript1.2">
    function PreInit()
    {
        if (top == self)
    	{
// 	    location.replace("http://" + document.domain +"/scij_nrm_web/index_pgr.asp?url=" + //document.URL.substring("http://scij_nrm_web/".length+1 + document.domain.length));
 	    location.replace("http://" + document.domain +"/scij/index_pgr.asp?url=" + document.URL.substring("http://scij/".length+1 + document.domain.length));
        }
        
    }
    //</SCRIPT>
//******************************************************************************
//Function:	AceptarSoloDobles
//Objetivo:	No permite que en el campo donde está el cursor el usuario
//			ingrese letras que no sean numeros y/o punto
//Autor:	Christian Sandoval Moya (S-COM)
//Fecha:	Mayo 2004
//******************************************************************************
function AceptarSoloDobles()
{
	if((parseInt(window.event.keyCode,10) == 13) || (parseInt(window.event.keyCode,10) == 8))
		return true;
			
	//Se utiliza el objeto event en su propiead keyCode para determinar
	//que digitó el usuario. Si es menor a 48 (0) o mayor a 57 (9) se 
	//'cancela' el evento
	if((parseInt(window.event.keyCode,10) < 48) || (parseInt(window.event.keyCode,10) > 57))
	{
		if(parseInt(window.event.keyCode,10) != 46)
			window.event.keyCode = 0;
	}
}
    
