//*******************************************************************************************
//								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://sjoweb11/scij2/index_pj.asp";
	var PROYECTO_RUTA = "http://sjoweb11/scij2/";
	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."
	
	
//*******************************************************************************************
//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 <= 1960) || (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()
{
	//Se obtiene la referencia al div oculto 
	var divAyuda = top.MainFrame.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';
	//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 desde con el año hasta
	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)
{
	//El formato del año debe incluir 4 dígitos solamente
	var strAnno = /^[0-9]{4}$/i;
	var nAnno = 0;
	//Se crea un objeto fecha
	var dtFecha = new Date();
	var bRetornar;
	
	//Se evalua lo que el usuario digitó con la plantilla o formato esperado
	bRetornar = strAnno.test(str);

	//Si en verdad tiene 4 dígitos, ahora se revisa que...
	if(bRetornar == true)
	{
		nAnno = parseInt(str,10);
		//esté entre el rango de 1800 y el presente año
		if((nAnno > 1800) && (nAnno <= dtFecha.getFullYear()))
			bRetornar = true
		else
			bRetornar = false;
	}
	return bRetornar;
}

//********************************************************************************************
//Function:	AnnoMayorAActual
//Objetivo:	Recibe como parámetro una variable y determina si es un año mayor al actual.
//			Si lo digitado no es un año, o bien es menor al año actual devuelve false,
//			solamente si el año es mayor al actual retorna true.
//Autor:	Christian Sandoval Moya (S-COM)
//********************************************************************************************
function AnnoMayorAActual(str)
{
	//El formato del año debe incluir 4 dígitos solamente
	var strAnno = /^[0-9]{4}$/i;
	var nAnno = 0;
	//Se crea un objeto fecha
	var dtFecha = new Date();
	var bRetornar;
	
	//Se evalua lo que el usuario digitó con la plantilla o formato esperado
	bRetornar = strAnno.test(str);

	//Si en verdad tiene 4 dígitos, ahora se revisa si...
	if(bRetornar == true)
	{
		nAnno = parseInt(str,10);
		//es mayor al presente año
		if(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:	AceptarSoloNumerosGuion()
//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 AceptarSoloNumerosGuion()
{
	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   45 es guion
	
	
	if (parseInt(window.event.keyCode,10) != 45)
	{ 
		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)
{
	window.event.returnValue = false;
	var objEvento;
	//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;
	}
	if(objEvento.tagName.toUpperCase() == "A")
	{
		objEvento = objEvento.parentElement.parentElement;
	}
		
	//Si el usuario hizo clic en el menú actual se cancela el proceso
	//debido a que no hay que refrescar ni página ni menú.
	//if(objEvento == objMenuActual)
	//	return;

	//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; 

	//Se actualiza el frame principal con la ruta que se nos indica
	//window.location = 'index_pgr.asp?url=' + strRuta;
	top.MainFrame.location = strRuta;
}

//---------------------------------------------------------------------
//Function:	MostrarAyudaEspecial
//Objetivo:	Hace visible el div que contiene la ayuda. Se dice que este
//			método muestra ayuda especial por que además de mostrar ese
//			div debe ocultar los combobox de asc/desc. Los otros tipos 
//			de ayuda también pueden ocultar combobox, pero la diferencia
//			radica en que este formulario tiene dos combos con el mismo
//			nombre (uno arriba y otro debajo en la página), entonces hay
//			que ocultar los dos. Cuando el usuario cierra el div de ayuda
//			los dos combobox se hacen visibles otra vez.
//Autor:	Christian Sandoval Moya (S-COM)
//Fecha:	Abril 2003
//---------------------------------------------------------------------
function MostrarAyudaEspecial(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;
		
	//Se obtienen los parámetros que puede recibir esta función
	var objParametros = MostrarAyudaEspecial.arguments;
	var nI = 0;
	//Se recorren execptuando el primero que es el mensaje a mostrar en el div de ayuda
	for(nI = 1; nI <= objParametros.length-1; nI++)
	{
		//Se obtiene la referencia al primer combobox de la pantalla, por eso se utiliza el 0
		var objTemporal = eval('top.MainFrame.window.document.all("' + objParametros[nI].toString() + '",0)');
		//Se obtiene la referencia al segundo combobox de la pantalla
		var objTemporal2 = eval('top.MainFrame.window.document.all("' + objParametros[nI].toString() + '",1)');
		//A los dos controles se les oculta temporalmente
		if(objTemporal != null)
			objTemporal.style.visibility = 'hidden';
		if(objTemporal2 != null)	
			objTemporal2.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;
	//Si el mensaje de ayuda se solicita en la misma página donde está el div de ayuda...
	if(top.MainFrame.window.document == window.document)
		//solo hay que tomar en cuenta el desplazamiento de la misma página
		divAyuda.style.top	= parseInt(window.document.body.scrollTop,10) + y - 5;
	else
		//de lo contrario, hay que tomar en cuetna el scroll de la pantalla principal más que la del buscador
		divAyuda.style.top	= parseInt(top.MainFrame.window.document.body.scrollTop) + 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 de ayuda
	divAyuda.style.visibility = 'visible';
	
}

//---------------------------------------------------------------------
//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)
}








