/***************************************************
 Funcion que elimina los espacios en Blanco a la 
 Izquierda y a la Derecha del texto.
***************************************************/
function AllTrim(sTexto)
{
    return RTrim(LTrim(sTexto));
}

/***************************************************
 Funcion que elimina los espacios en Blanco a la 
 Izquierda del texto.
***************************************************/
function LTrim(sTexto)
{
    var i, iLargo;
    for (i = 0, iLargo = sTexto.length; i < iLargo; i++)
    {
        if (sTexto.charAt(i) != " ")
        {
            break;
        }
    }
    
    if (i == 0)
    {
        return sTexto;
    }
    
    if (i < iLargo)
    {
        return sTexto.substr(i);
    }
    
    return "";
}

/***************************************************
 Funcion que elimina los espacios en Blanco a la 
 Derecha del elemento.
***************************************************/
function RTrim(sTexto)
{
    var i, iLargo;
    
    iLargo = sTexto.length;
    for (i = iLargo - 1; i >= 0; i--)
    {
        if (sTexto.charAt(i) != " ")
        {
            break;
        }
    }
    
    if (i == iLargo - 1)
    {
        return sTexto;
    }
    
    if (i >= 0)
    {
        return sTexto.substring(0, i + 1);
    }
    
    return "";
}


/***************************************************
 Funcion que Valida que un Texto no sea vacio.
***************************************************/
function validaTextoEnBlanco(field)
{
    if (field.type == "text" || field.type == "textarea") {
        if (field.value == "" || AllTrim(field.value).length == 0)
        {
            alert(String.fromCharCode(161) + "Ingreso inv" + String.fromCharCode(225) + "lido! El texto no puede estar vac" + String.fromCharCode(237) + "o");
            field.focus();
            field.select();
            return false;
        }
    }
    return true;
}

/***************************************************
 Funcion que valida si un campo de tipo Texto
 tiene el largo indicado.
***************************************************/
function validaLargoTexto(field, minimo, maximo) {

    var iLargo = AllTrim(field.value).length;
    
    if (iLargo < minimo) {
        alert(String.fromCharCode(161) + "Ingreso inv" + String.fromCharCode(225) + "lido! El largo m" + String.fromCharCode(237) + "nimo del texto es "
            + minimo.toString(10) + " caracteres");
        field.focus();
        field.select();
        return false;
    }
    else if (iLargo > maximo) {
        alert(String.fromCharCode(161) + "Ingreso inv" + String.fromCharCode(225) + "lido! El largo m" + String.fromCharCode(225) + "ximo del texto es "
            + maximo.toString(10) + " caracteres");
        field.focus();
        field.select();
        return false;
    }
    
    return true;
}

/***************************************************
 Funcion que valida si un campo de tipo Texto
 tiene caracteres permitidos o no.
 Retorna true si son validos, false en caso contrario
***************************************************/
function validaCaracteres(sValor, sValid)
{
    var valido = true;
    var iLargo = sValor.length;

    for (var i = 0; i < iLargo; i++) {
        if (sValid.indexOf(sValor.charAt(i)) == -1)
        {
            valido = false;
            break;
        }
    }
    
    return valido;
}


/***************************************************
 Funcion que valida si un campo de tipo Texto
 tiene caracteres permitidos o no.
***************************************************/
function validaCaracterTexto(field) {
	var sValid = "ABCDEFGHIJKLMN" + String.fromCharCode(209) + "OPQRSTUVWXYZ"
		    + "abcdefghijklmn" + String.fromCharCode(241) + "opqrstuvwxyz"
		    + " 0123456789"
		    + String.fromCharCode(225, 193, 233, 201, 237, 205, 243, 211, 250, 218, 246, 228,
		    252, 196, 214, 220)
		    + "$" + String.fromCharCode(186) + "()/" + String.fromCharCode(191) + "?!" + String.fromCharCode(161) + "%#@_-+*"
		    + String.fromCharCode(126) + ":;'.&,";

    if (!validaCaracteres(field.value, sValid)) {
        alert(String.fromCharCode(161) + "Ingreso inv" + String.fromCharCode(225) + "lido! Se han ingresado caracteres no permitidos");
        field.focus();
        field.select();
        return false;
    }
    else {
        field.value = RTrim(field.value.toUpperCase());
    }
    
    return true;
}

/***************************************************
 Funcion que valida si un campo de tipo Texto
 tiene caracteres permitidos o no. 
 No realizar el UpperCase del texto
***************************************************/
function validaCaracterTextoSinUpper(field) {
	var sValid = "ABCDEFGHIJKLMN" + String.fromCharCode(209) + "OPQRSTUVWXYZ"
		    + "abcdefghijklmn" + String.fromCharCode(241) + "opqrstuvwxyz"
		    + " 0123456789"
		    + String.fromCharCode(225, 193, 233, 201, 237, 205, 243, 211, 250, 218, 246, 228,
		    252, 196, 214, 220)
		    + "$" + String.fromCharCode(186) + "()/" + String.fromCharCode(191) + "?!" + String.fromCharCode(161) + "%#@_-+*"
		    + String.fromCharCode(126) + ":;'.&,";

    if (!validaCaracteres(field.value, sValid)) {
        alert(String.fromCharCode(161) + "Ingreso inv" + String.fromCharCode(225) + "lido! Se han ingresado caracteres no permitidos");
        field.focus();
        field.select();
        return false;
    }
    else {
        field.value = RTrim(field.value);
    }
    
    return true;
}

/***************************************************
 Funcion que valida si un numero telefonico
 tiene caracteres permitidos o no.
***************************************************/
function validaCaracterTelefono(field) {
	var sValid = " 0123456789";

    if (!validaCaracteres(field.value, sValid)) {
		alert(String.fromCharCode(161) + "Ingreso inv" + String.fromCharCode(225) + "lido! Se han ingresado caracteres no permitidos");
		field.focus();
		field.select();
		return false;
	}
	
	return true;
}

/***************************************************
 Funcion que valida si un numero
 tiene caracteres permitidos o no.
***************************************************/
function validaCaracterNumero(field) {
	var sValid = " 0123456789-.";

    if (!validaCaracteres(field.value, sValid)) {
		alert(String.fromCharCode(161) + "Ingreso inv" + String.fromCharCode(225) + "lido! Se han ingresado caracteres no permitidos");
		field.focus();
		field.select();
		return false;
	}
	
	return true;
}

/***************************************************
 Funcion que valida el campo contenga solo digitos.
***************************************************/
function validaCaracterDigitos(field) {
	var sValid = "0123456789";

    if (!validaCaracteres(field.value, sValid)) {
		alert(String.fromCharCode(161) + "Ingreso inv" + String.fromCharCode(225) + "lido! Solo puede ingresar d" + String.fromCharCode(237) + "gitos");
		field.focus();
		field.select();
		return false;
	}
	
	return true;
}

/***************************************************
 Funcion que valida si un numero
 tiene caracteres permitidos o no.
***************************************************/
function validaNumero(field, minimo, maximo) {
    field.value = AllTrim(field.value);
    if (field.value.length>0) {
        if (validaCaracterNumero(field)){
            var numero = parseInt(dejaSoloNumeros(field.value),10);
            if (numero < minimo) {
                alert(String.fromCharCode(161) + "Ingreso inv" + String.fromCharCode(225) + "lido! El n" + String.fromCharCode(250) + "mero ingresado no puede ser menor que "
                    + formatearNumero(minimo.toString(10)));
            }
            if (numero > maximo) {
                alert(String.fromCharCode(161) + "Ingreso inv" + String.fromCharCode(225) + "lido! El n" + String.fromCharCode(250) + "mero ingresado no puede ser mayor que "
                    + formatearNumero(maximo.toString(10)));
            }
            if ((numero < minimo) || (numero > maximo)) {
                field.focus();
                field.select();
                return false;
            }
            field.value = formatearNumero(numero.toString(10));
        }
        else {
            return false;
        }
    }
    
    return true;
}

/***************************************************
 Funcion que valida si un numero de anno
 tiene caracteres permitidos o no.
***************************************************/
function validaNumeroAnno(field, minimo, maximo) {
    field.value = AllTrim(field.value);
    if (field.value.length>0) {
        if (validaCaracterNumero(field)){
            var numero = parseInt(dejaSoloNumeros(field.value),10);
            if (numero < minimo) {
                alert(String.fromCharCode(161) + "Ingreso inv" + String.fromCharCode(225) + "lido! El n" + String.fromCharCode(250) + "mero ingresado no puede ser menor que "
                    + formatearNumero(minimo.toString(10)));
            }
            if (numero > maximo) {
                alert(String.fromCharCode(161) + "Ingreso inv" + String.fromCharCode(225) + "lido! El n" + String.fromCharCode(250) + "mero ingresado no puede ser mayor que "
                    + formatearNumero(maximo.toString(10)));
            }
            if ((numero < minimo) || (numero > maximo)) {
                field.focus();
                field.select();
                return false;
            }
            field.value = numero.toString(10);
        }
        else {
            return false;
        }
    }
    
    return true;
}


/***************************************************
 Funcion que valida si un rut
 tiene caracteres permitidos o no.
***************************************************/
function validaCaracterRUT(field) {
	var sValid = " 0123456789.,";

    if (!validaCaracteres(field.value, sValid)) {
		alert(String.fromCharCode(161) + "Ingreso inv" + String.fromCharCode(225) + "lido! Se han ingresado caracteres no permitidos");
		field.focus();
		field.select();
		return false;
	}

    if (field.value.length > field.maxLength)
    {
		alert(String.fromCharCode(161) + "Ingreso inv" + String.fromCharCode(225) + "lido! El R.U.T es muy largo");
		field.focus();
		field.select();
		return false;
    }
    
	return true;
}

/***************************************************
 Funcion que valida el digito verifivador
 tiene caracteres permitidos o no.
***************************************************/
function validaCaracterDV(field) {
	var sValid = " 0123456789kK";

    if (!validaCaracteres(field.value, sValid)) {
		alert(String.fromCharCode(161) + "Ingreso inv" + String.fromCharCode(225) + "lido! Se han ingresado caracteres no permitidos");
		field.focus();
		field.select();
		return false;
	}
	
	field.value = field.value.toUpperCase();
	
	return true;
}

/***************************************************
 Funcion que valida que el RUT-DV sea correcto.
***************************************************/
function validaCaracterRUTDV(fieldRUT, fieldDV) {
    var dvr = '0';
    var rut = dejaSoloNumeros(fieldRUT.value);
    var dv = fieldDV.value;
	
	if (rut == "" || rut.length == 0) {
        alert(String.fromCharCode(161) + "Ingreso inv" + String.fromCharCode(225) + "lido! El R.U.T. es incorrecto");
        return false;
    }
	
    suma = 0;
    mul  = 2;

    for (i= (rut.length -1) ; i >= 0; i--)
    {
        suma = suma + rut.charAt(i) * mul;
        if (mul == 7) {
            mul = 2;
        } else {
            mul++;
        }
    }

    res = suma % 11;

    if (res==1) {
        dvr = 'k';
    } else if (res==0) {
        dvr = '0';
    } else {
        dvi = 11-res;
        dvr = dvi + "";
    }

    if(dvr != dv.toLowerCase()) {
        alert(String.fromCharCode(161) + "Ingreso inv" + String.fromCharCode(225) + "lido! El R.U.T. es incorrecto");
        return false;
    }

    return true;
}


/***************************************************
 Funcion que valida el e-mail tenga un formato valido
***************************************************/
function validaCaracterEmail(field) {
    var email = AllTrim(field.value);
    var iLargo;
    var iArroba;
    var iUltimoPunto;
    var i;
    var bPuntosSeguidos;
    
    iLargo = email.length;
    if (iLargo == 0)
    {
        return true;
    }
    
    iArroba = email.indexOf("@");
    iUltimoPunto = email.lastIndexOf(".");
    
    bPuntosSeguidos = false;
    for (i = email.indexOf("."); i < iLargo - 1; i++)
    {
        if (email.charAt(i) == '.' && email.charAt(i + 1) == '.')
        {
            bPuntosSeguidos = true;
            break;
        }
    }

    if (iArroba < 1 || iUltimoPunto < iArroba || iUltimoPunto == email.length - 1
        || iArroba != email.lastIndexOf("@") || bPuntosSeguidos)
    {
		alert(String.fromCharCode(161) + "Ingreso inv" + String.fromCharCode(225) + "lido! El e-mail debe tener el formato xx@yy.zz");
		field.focus();
		field.select();
        return false;
    }
    
    return true;
}


/***************************************************
 Funcion que valida un ROL tenga un formato valido
***************************************************/
function validaCaracterROL(field) {
    var rol = AllTrim(field.value);
    var iLargo;
    var iMenos;
	var sValid = "0123456789";

    iLargo = rol.length;
    if (iLargo == 0)
    {
        return true;
    }
    
    iMenos = rol.indexOf("-");
    
    if (iMenos < 1 || iMenos == iLargo - 1)
    {
		alert(String.fromCharCode(161) + "Ingreso inv" + String.fromCharCode(225) + "lido! El Rol debe tener el formato n" + String.fromCharCode(250) + "meros-n" + String.fromCharCode(250) + "meros");
		field.focus();
		field.select();
        return false;
    }

    if (!validaCaracteres(field.value.substr(0, iMenos), sValid)
        || !validaCaracteres(field.value.substr(iMenos + 1), sValid)
    ) {
		alert(String.fromCharCode(161) + "Ingreso inv" + String.fromCharCode(225) + "lido! El Rol debe tener el formato n" + String.fromCharCode(250) + "meros-n" + String.fromCharCode(250) + "meros");
		field.focus();
		field.select();
		return false;
	}

    return true;
}


/***************************************************
 Funcion que valida si una fecha
 tiene caracteres permitidos o no.
***************************************************/
function esBisiesto(intYear) {
    if (intYear % 100 == 0) {
        if (intYear % 400 == 0) { return true; }
    }
    else if ((intYear % 4) == 0) { return true; }
    return false;
}

function validaCaracterFecha(field) {
    var fecha = AllTrim(field.value);
    var sValid = "0123456789";
    var sep1, sep2;

    if (fecha.length == 0)
    {
        return true;
    }

    sep1 = fecha.charAt(2);
    sep2 = fecha.charAt(5);
    if (
        ((sep1 != "/") && (sep1 != "-")) ||
        ((sep2 != "/") && (sep2 != "-"))
       ) {
        alert(String.fromCharCode(161) + "Ingreso inv" + String.fromCharCode(225) + "lido! La fecha debe tener el formato dd/mm/aaaa");
		field.focus();
		field.select();
		return false;
     }

     var sDia = fecha.substr(0, 2);
     var sMes = fecha.substr(3, 2);
     var sAnno = fecha.substr(6);

     var dia = parseInt(sDia, 10);
     var mes = parseInt(sMes, 10);
     var anno = parseInt(sAnno, 10);
     
     if (!validaCaracteres(sDia, sValid)
        || !validaCaracteres(sMes, sValid)
        || !validaCaracteres(sAnno, sValid)
        || isNaN(dia) || isNaN(mes) || isNaN(anno))
     {
		alert(String.fromCharCode(161) + "Ingreso inv" + String.fromCharCode(225) + "lido! La fecha es incorrecta");
		field.focus();
		field.select();
		return false;
     }
     
     if (anno < 1000)
     {
        alert(String.fromCharCode(161) + "Ingreso inv" + String.fromCharCode(225) + "lido! La fecha debe tener el formato dd/mm/aaaa");
		field.focus();
		field.select();
		return false;
     }
     
     if (mes < 1 || 12 < mes) {
		alert(String.fromCharCode(161) + "Ingreso inv" + String.fromCharCode(225) + "lido! El mes de la fecha es incorrecto");
		field.focus();
		field.select();
		return false;
	}

    if (((mes == 1) || (mes == 3) || (mes == 5) || (mes == 7) || (mes == 8) || (mes == 10) || (mes == 12))
            && ((dia < 1) || (31 < dia))) {
        alert(String.fromCharCode(161) + "Ingreso inv" + String.fromCharCode(225) + "lido! El mes no tiene la cantidad de d" + String.fromCharCode(237) + "as se" + String.fromCharCode(241) + "alados");
    	field.focus();
    	field.select();
    	return false;
    }

	if (((mes == 4) || (mes == 6) || (mes == 9) || (mes == 11))
	        && ((dia < 1) || (30 < dia))) {
        alert(String.fromCharCode(161) + "Ingreso inv" + String.fromCharCode(225) + "lido! El mes no tiene la cantidad de d" + String.fromCharCode(237) + "as se" + String.fromCharCode(241) + "alados");
		field.focus();
		field.select();
		return false;
	}

	if (mes == 2) {
		if (dia < 1) {
            alert(String.fromCharCode(161) + "Ingreso inv" + String.fromCharCode(225) + "lido! El mes no tiene la cantidad de d" + String.fromCharCode(237) + "as se" + String.fromCharCode(241) + "alados");
	        field.focus();
	        field.select();
	        return false;
		}
		if (esBisiesto(anno) == true) {
			if (dia > 29) {
                alert(String.fromCharCode(161) + "Ingreso inv" + String.fromCharCode(225) + "lido! El mes no tiene la cantidad de d" + String.fromCharCode(237) + "as se" + String.fromCharCode(241) + "alados");
                field.focus();
                field.select();
                return false;
			}
		}
		else {
			if (dia > 28) {
                alert(String.fromCharCode(161) + "Ingreso inv" + String.fromCharCode(225) + "lido! El mes no tiene la cantidad de d" + String.fromCharCode(237) + "as se" + String.fromCharCode(241) + "alados");
                field.focus();
                field.select();
				return false;	
			}
		}
	}

    field.value = fecha.substr(0, 2) + "/" + fecha.substr(3, 2) + "/" + fecha.substr(6);

    return true;
}


/***************************************************
 Funcion que saca puntos y espacios a un numero
***************************************************/
function dejaSoloNumeros(sNum){
    var tmpstr = "";
    var c;
    
    for (var i=0; i < sNum.length ; i++ )
    {
        c = sNum.charAt(i);
        if ('0' <= c && c <= '9')
        {
            tmpstr = tmpstr + sNum.charAt(i);
        }
    }

    return tmpstr;
}

/***************************************************
 Formatear un Rut Al formato XX.XXX.XXX
***************************************************/
function formatearRUT(sRUT){
  return formatearNumero(sRUT);
}

/***************************************************
 Funcion que formatea un numero en el formato XXX.XXX.XXX
***************************************************/
function formatearNumero(sNum) {
  sNum = dejaSoloNumeros(sNum);

  var iLargo = sNum.length;
  var numInvertido = "";
  var numFormateado = "";

  for(i=(iLargo-1);i>=0;i--)
    numInvertido = numInvertido + sNum.charAt(i);

  for(i=0;i<iLargo;i++) { 
     res = i % 3;
     if ((i!=0) && (res==0)) numFormateado = "." + numFormateado ;
     numFormateado = numInvertido.charAt(i) + numFormateado 
  }
  
  return numFormateado;
}



/***************************************************
 Funcion que setea el valor que indica que ocurrio 
un cambio en la pagina
***************************************************/
var bCambioDatos = false;
function cambioDatos() {
    bCambioDatos = true;
}
function irOtraPagina() {
   if (bCambioDatos) {
      return confirm("No ha guardado los cambios que ha realizado.\n" + String.fromCharCode(191) + "Desea ir de todas formas a la otra p" + String.fromCharCode(225) + "gina?");
   }
   return true;
}



/***************************************************
Funciones para el manejo de comboboxes
***************************************************/
function agregarSelectOption(oSelect, valor, texto, sSelected)
{
    var oOption = document.createElement("OPTION");
    oSelect.options.add(oOption);
    oOption.value = valor;
    oOption.selected = (valor == sSelected);
    oOption.innerText = texto;
}
 
function limpiarSelect(oSelect)
{
    var largo = oSelect.options.length;
    for (var i=0; i < largo; i++)
    {
        oSelect.options.remove(0);
    }
}

function cargarSelect(oSelect, arraySelect, sSelected)
{
    var i, n;

    limpiarSelect(oSelect);

    if (arraySelect != undefined) {
        n = arraySelect.length;
        for (i = 0; i < n; i++) {
            agregarSelectOption(oSelect, arraySelect[i][0], arraySelect[i][1], sSelected);
        }
    }
}
