
	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 = "Masterlex";
	
	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.
//*******************************************************************************************
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.
//******************************************************************************************
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.
//****************************************************************************************
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.
//****************************************************************************
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.
//*********************************************************************
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
//************************************************************************
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
//Fecha:	28/12/200
//*******************************************************************
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.
//*******************************************************************
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.
//*******************************************************************
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
//**********************************************************************
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)
//Fecha:	Abril 2001
//***************************************************************************************
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)
//Fecha:	Junio 2001
//*****************************************************************************
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)
//Fecha.	Junio 2001
//*****************************************************************************************
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)
//Fecha:	Junio 2001
//***********************************************************************************************
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)
//Fecha:	Junio 2001
//********************************************************************************************
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:	window_onload
//Objetivo:	Esta función pone el focus en el primer campo de texto que exista en un formulario. Revisa
//			simpre el segundo formulario del asp, puesto que el primer formulario lo ocupa el menù de la
//			izquierda. Este funcionamiento es para hacer un poco más práctico el uso del sistema al usuario.
//			Esta función tiene en cuenta que en un asp pueden existir varios forms, por eso nunca hace
//			referencia al nombre del form sino a la posición de éste en el documento.
//Autor:	Christian Sandoval Moya (S-COM)
//Fecha:	Julio 2001
//***********************************************************************************************************
function window_onload()
{
	if(document.forms[0] == null)
		return false;
	var frmForm = document.forms[0];
	var nI = 0;
	for (nI = 0; nI < frmForm.length; nI++)
	{
		if((frmForm.item(nI).type == "text") && (frmForm.item(nI).readOnly == false) && (frmForm.item(nI).disabled == false))
		{
			frmForm.item(nI).focus();
			break;
		}
	}
}


//************************************************************************
//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)
//Fecha:	Agosto 2001
//************************************************************************
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:	ayuda_onclick
//Objetivo:	Esta función hace visible un bloque de texto en la pantalla. Dicho bloque debe tener un id 
//			llamada Indicacion. Además debe ser un DIV. Para algunas pantallas es bueno poner indicaciones
//			o ayuda al usuario, pero a veces, el usuario no quiere ver ese texto. Por lo tanto, se pone un
//			texto dentro de un SPAN que dice "ver indicaciones" y cuando hace click en él, se despliega el
//			texto que se encuentra del DIV indicación y luego cambia el texto del SPAN a "ocultar indicaciones"
//			Hace uso de dos imágenes (arw03dn y arw03up).
//Autor:	Christian Sandoval Moya (S-COM)
//Fecha:	Julio 2001
//**************************************************************************************************************
function ayuda_onclick()
{	
	var objAyuda, strNombre;
	
	strNombre = "Indicacion";
	//Tomamos referencia al control llamado Indicacion
	objAyuda = document.all(strNombre);
	//Si el texto no está desplegado
	if(objAyuda.style.display == "none")
	{
		//Lo desplegamos 
		objAyuda.style.display = "";
		//Y cambiamos el texto del SPAN a ocultar indicaciones
		mensaje.outerHTML = "<LABEL id=mensaje>Ocultar Indicaciones <IMG src=images/moveprevious2.gif style='HEIGHT: 20px; WIDTH: 20px'></LABEL>";
	}
	else
	{
		//Estaba desplegado y lo ocultamos
		objAyuda.style.display = "none";
		//El SPAN debe cambiar su título a "Ver Indicaciones"
		mensaje.outerHTML = "<LABEL id=mensaje>Ver Indicaciones <IMG src=images/movenext2.gif style= 'HEIGHT: 20px; WIDTH: 20px'></LABEL>"
	}
}