/**
 * Funciones generales para la validacion de campos
 * Creado por: Daniel Aguirre M.
 * Fecha: 25/11/2009
 */

/**
 * Uso:
 * 1. Se incluye la libreria en la pagina
 * 2. En un archivo Javascript con el mismo nombre de la página
 *    se invoca al registro de los elementos que se ocuparan:
 *    - validaDefineAreaMensajes: Establece el area de despliegue de mensajes
 *          * parDivMensajesId: Id del contenedor (div)
 *    - validaDefineFormulario: Establece el area de despliegue de mensajes
 *          * parFormularioId: Id del formulario (form)
 *    - validaAgregarCampo: Agrega un campo a la validacion
 *          * parId: Id del campo
 *          * parNombre: Nombre que se desplegara al usuario
 *          * parTipo: Tipo de validacion a realizar
 *          * parPermiteVacio: Indica si puede estar vacio (true/false)
 *    - validaAgregarCampoRelacionado: Agrega un campo a la validacion,
 *      en conjunto con otro campo con el cual tiene una validacion relacionada
 *          * parId: Id del campo
 *          * parNombre: Nombre que se desplegara al usuario
 *          * parTipo: Tipo de validacion a realizar
 *          * parPermiteVacio: Indica si puede estar vacio (true/false)
 *          * parIdCampoRel: Id del campo relacionado
 *          * parNombreCampoRel: Nombre campo rel. que se desplegara al usuario
 *          * parTipoRelacion: Tipo de validacion a realizar nen la relacion
 * 3. En el lugar que se requiera se puede invocar una de estas funciones:
 *    - validaEnviaForm(): valida el formulario, y si es valido lo envia.
 *    - valida(): Retorna un valor de verdad (true/false)
 *      si el formulario completo es valido. Si hay errores, tambien depliega
 *      los mensajes de error en el lugar asignado.
 * 4. Los tipos de validacion se muestran abajo.
 */

// Constantes publicas para los tipos de validaciones
var VAL_TIPO_CUALQUIERA = 0;// No se realiza validacion de tipo de dato
var VAL_TIPO_NUMERO = 1;// Solo se pueden ingresar digitos
var VAL_TIPO_EMAIL = 2;// El valor ingresado tiene que tener el formato de mail
var VAL_TIPO_CARACTER = 12;// El valor ingresado tiene que tener el formato de mail

var VAL_TIPO_RUT = 3;// El valor debe tener el formato definido para RUT
var VAL_TIPO_MONTO = 4;// El valor ingresado solo puede tener numeros (solo o con 2 decimales?)
var VAL_TIPO_FECHA = 5;// La fecha debe venir en el formato dd/mm/aaaa
var VAL_TIPO_FECHA2 = 11;// La fecha debe venir en el formato dd/mm/aaaa
var VAL_TIPO_SELECT= 6; //El valor de un select debe ser > 0
var VAL_CUSTOM_ERROR= 7; //Error personalizado
var VAL_TIPO_PORCENTAJE= 8; //El valor de un select debe ser > 0
var VAL_TIPO_NUMERO_POSITIVO = 9; //Numeros positivos
var VAL_TIPO_NUMERO_POSITIVO_MAYOR_CERO = 11; //Numeros positivos
var VAL_ERROR_CUSTOM= 10; //Error personalizado. Reemplaza al error Nro 7, pero este no se borra pues puede estar implementado en otra pantalla
// Constantes publicas para los tipos de validacion en una relacion
var VAL_TIPO_REL_NINGUNA = 0;// No se realiza validacion de relacion
var VAL_TIPO_REL_IGUALES = 1;// Valida que ambos valores sean iguales
var VAL_TIPO_REL_DISTINTOS = 2;// Valida que ambos valores sean distintos
var VAL_TIPO_REL_RUT = 3;// Valida que ambos campos esten en la relacion RUT-DV
var VAL_TIPO_REL_FECHA_MENOR = 4;// Valida 2 fechas, que la primera sea menor que la segunda
var VAL_TIPO_REL_FECHA_MENOR2 = 5;// Valida 2 fechas, que la primera sea menor que la segunda
// --------------------------------------
var validaArrCamposValidar = new Array();
var validaDivMensajesId = "";
var validaDivMensajes = null;
var validaFormularioId = "";

// Constantes privadas para los campos
var VAL_INDICE_ID = 0;
var VAL_INDICE_NOMBRE = 1;
var VAL_INDICE_CAMPO = 2;
var VAL_INDICE_TIPO = 3;
var VAL_INDICE_VACIO = 4;
var VAL_INDICE_REL_ID = 5;
var VAL_INDICE_REL_NOMBRE = 6;
var VAL_INDICE_REL_CAMPO = 7;
var VAL_INDICE_REL_TIPO = 8;
var VAL_INDICE_ACCION_APLICA = 9; // Acciones para las cuales aplica la validacion

// Constantes para el despliegue de mensajes con el resultado de la validacion
var DESPLIEGUE_HTML = 1;
var DESPLIEGUE_JAVASCRIPT = 2;

// Funcion que define el area de mensajes (div)
function validaDefineAreaMensajes(parDivMensajesId) {
    validaDivMensajesId = parDivMensajesId;
}

// Funcion que define el formulario con que se trabajara
function validaDefineFormulario(parFormularioId) {
    validaFormularioId = parFormularioId;
}

// Funcion que ingresa un campo que se debera validar, en cualquier caso
function validaAgregarCampo(parId, parNombre, parTipo, parPermiteVacio) {
    validaArrCamposValidar.push(new Array(parId, parNombre, null, parTipo, parPermiteVacio, "", "", null, VAL_TIPO_REL_NINGUNA, ""));
}

// Funcion que ingresa un campo que se debera validar, para determinadas acciones solamente
function validaAgregarCampoAccion(parId, parNombre, parTipo, parPermiteVacio, parAccion) {
    validaArrCamposValidar.push(new Array(parId, parNombre, null, parTipo, parPermiteVacio, "", "", null, VAL_TIPO_REL_NINGUNA, parAccion));
}
function validaRemoverCampoAccion(parId, parNombre, parTipo, parPermiteVacio, parAccion) {
    for(i in validaArrCamposValidar){
       
        if(validaArrCamposValidar[i][0]==parId &&
           validaArrCamposValidar[i][1]==parNombre &&
           validaArrCamposValidar[i][3]==parTipo &&
           validaArrCamposValidar[i][4]==parPermiteVacio &&
           validaArrCamposValidar[i][9]==parAccion){
            // alert(validaArrCamposValidar[i][1]);
              validaArrCamposValidar.splice(i, i);
           }
    }
}

function validaRemoverCampoAccionCustom(parId, parMensaje, parTipo, parPermiteVacio, parAccion) {

    for(i in validaArrCamposValidar){
       
        if(validaArrCamposValidar[i][0]==parId &&
           validaArrCamposValidar[i][1]==parMensaje &&
           validaArrCamposValidar[i][3]==parTipo &&
           validaArrCamposValidar[i][4]==parPermiteVacio &&
           validaArrCamposValidar[i][9]==parAccion){
            // alert(validaArrCamposValidar[i][1]);
              validaArrCamposValidar.splice(i, i);
           }
    }
}

function validaRemoverCampoRelacionadoAccion(parId, parNombre, parTipo, parPermiteVacio, parIdCampoRel, parNombreCampoRel, parTipoRelacion, parAccion) {
    for(i in validaArrCamposValidar){
       
        if(validaArrCamposValidar[i][0]==parId &&
           validaArrCamposValidar[i][1]==parNombre &&
           validaArrCamposValidar[i][3]==parTipo &&
           validaArrCamposValidar[i][4]==parPermiteVacio &&
           validaArrCamposValidar[i][5]==parIdCampoRel &&
           validaArrCamposValidar[i][6]==parNombreCampoRel &&
           validaArrCamposValidar[i][8]==parTipoRelacion &&
           validaArrCamposValidar[i][9]==parAccion){
            // alert(validaArrCamposValidar[i][1]);
              validaArrCamposValidar.splice(i, i);
           }
    }
}
// Funcion que ingresa un campo que se debera validar, para determinadas acciones solamente. Tiene el mensaje personalizado
function validaAgregarCampoAccionCustom(parId, parMensaje, parTipo, parPermiteVacio, parAccion) {
    var existe = false;
    for(i in validaArrCamposValidar){
       
        if((validaArrCamposValidar[i][0]==parId &&
           validaArrCamposValidar[i][1]==parMensaje &&
           validaArrCamposValidar[i][3]==parTipo &&
           validaArrCamposValidar[i][4]==parPermiteVacio &&
           validaArrCamposValidar[i][9]==parAccion) ){
            existe = true;
            break;
           }
    }
    if(!existe){
        validaArrCamposValidar.push(new Array(parId, parMensaje, null, parTipo, parPermiteVacio, "", "", null, VAL_TIPO_REL_NINGUNA, parAccion));
    } 
   // validaArrCamposValidar.push(new Array(parId, parMensaje, null, parTipo, parPermiteVacio, "", "", null, VAL_TIPO_REL_NINGUNA, parAccion));
}
// Funcion que ingresa un campo que se debera validar, en cualquier caso
function validaAgregarCampoRelacionado(parId, parNombre, parTipo, parPermiteVacio, parIdCampoRel, parNombreCampoRel, parTipoRelacion) {
    validaArrCamposValidar.push(new Array(parId, parNombre, null, parTipo, parPermiteVacio, parIdCampoRel, parNombreCampoRel, null, parTipoRelacion, ""));
}

// Funcion que ingresa un campo que se debera validar, para determinadas acciones solamente
function validaAgregarCampoRelacionadoAccion(parId, parNombre, parTipo, parPermiteVacio, parIdCampoRel, parNombreCampoRel, parTipoRelacion, parAccion) {
    validaArrCamposValidar.push(new Array(parId, parNombre, null, parTipo, parPermiteVacio, parIdCampoRel, parNombreCampoRel, null, parTipoRelacion, parAccion));
}

// Funcion que agrega en el onload de la pagina la funcion que crea los campos
// (Es en el onload porque antes no existen los campos)
var onloadOld = window.onload;
window.onload = function () {
    if (onloadOld && (typeof onloadOld == 'function')) {
        onloadOld();
    }
    validaDivMensajes = document.getElementById(validaDivMensajesId);
    if (!validaDivMensajes) {
        alert("No se encuentra el area de mensajes");
        return;
    }
    validaFormulario = document.getElementById(validaFormularioId);
    if (!validaFormulario) {
        //alert("No se encuentra el formulario");
        return;
    }
    var txtCamposFaltantes = "";
    for (i = 0;i < validaArrCamposValidar.length;i++) {
        var campoVal = validaArrCamposValidar[i];
        campoVal[VAL_INDICE_CAMPO] = document.getElementById(campoVal[VAL_INDICE_ID]);
        // Ahora no valida, porque si no lo encuentra ahora, lo busca despues
        if (false && !campoVal[VAL_INDICE_CAMPO]) {
            if (txtCamposFaltantes == "")
                txtCamposFaltantes += campoVal[VAL_INDICE_NOMBRE];
            else 
                txtCamposFaltantes += ", " + campoVal[VAL_INDICE_NOMBRE];
        }
        // Campo relacionado si existe
        
        if (campoVal[VAL_INDICE_REL_TIPO] != VAL_TIPO_REL_NINGUNA ) {
            campoVal[VAL_INDICE_REL_CAMPO] = document.getElementById(campoVal[VAL_INDICE_REL_ID]);
            if (!campoVal[VAL_INDICE_REL_CAMPO] && campoVal[VAL_INDICE_REL_TIPO] != VAL_TIPO_REL_FECHA_MENOR2) {
                if (txtCamposFaltantes == "")
                    txtCamposFaltantes += campoVal[VAL_INDICE_REL_NOMBRE];
                else 
                    txtCamposFaltantes += ", " + campoVal[VAL_INDICE_REL_NOMBRE];
            }
        }
    }
    if (txtCamposFaltantes != "")
        alert("No se encuentran los campos " + txtCamposFaltantes + ".");
}

// Funcion que lo unico que hace es enviar el formulario solo si es valido
function validaEnviaForm() {
    var retorno = valida();
    if (retorno) {
        validaFormulario.submit();
    }
    return retorno;
}

function validaEnviaFormBloqueo() {
    var retorno = valida();
    if (retorno) {
        bloqueoPagina();
        valDobleSubmit();
        validaFormulario.submit();
    }
    return retorno;
}
// Funcion que lo unico que hace es enviar el formulario solo si es valido, para
function validaEnviaFormAccion(accion) {

    var retorno = validaAccionDespliegue(accion, DESPLIEGUE_HTML);
    if (retorno) {
        validaFormulario.submit();
    }
    return retorno;
}

function validaEnviaFormAccionBloqueo(accion) {
    var retorno = validaAccionDespliegue(accion, DESPLIEGUE_HTML);
    if (retorno) {
        bloqueoPagina();
        valDobleSubmit();
        validaFormulario.submit();
    }
    return retorno;
}
// Funcion que lo unico que hace es enviar el formulario solo si es valido, para
function validaEnviaFormAccionDespliegue(accion, despliegue) {
    var retorno = validaAccionDespliegue(accion, despliegue);
    if (retorno) {
        validaFormulario.submit();
    }
    return retorno;
}
function validaEnviaFormAccionDespliegueBloqueo(accion, despliegue) {
   
    var retorno = validaAccionDespliegue(accion, despliegue);
    if (retorno) {
        bloqueoPagina();
        valDobleSubmit();
        validaFormulario.submit();
    }
    return retorno;
}
// Funcion que valida
var validaEsValido;
var validaEsValidoCampoActual;
var validaTextoHTMLMensajes;
var validaTextoJavascriptMensajes;
var validaIFocus;
var validaComenzoValidacion = false;

function validaComienzaValidacion() {
    validaEsValido = true;
    validaTextoHTMLMensajes = "";
    validaTextoJavascriptMensajes = "";
    validaComenzoValidacion = true;
}

function valida() {
    return validaAccionDespliegue("", DESPLIEGUE_HTML);
}

function validaAccionDespliegue(accion, despliegue) {
    if(!validaComenzoValidacion) {
        validaEsValido = true;
        validaTextoHTMLMensajes = "";
        validaTextoJavascriptMensajes = "";
    }
    validaIFocus =  - 1;
    validaComenzoValidacion = false;

    for (i = 0;i < validaArrCamposValidar.length;i++) {
        validaEsValidoCampoActual = true;
        var campoVal = validaArrCamposValidar[i];
        var boolAplicaAccion = true;
        
        // Primero valida que el campo aplique a esta accion
        if (accion != "") {
            var txtAccion = campoVal[VAL_INDICE_ACCION_APLICA];
            if(txtAccion == null)
                boolAplicaAccion = false;
            else if(txtAccion != "" && txtAccion != accion)
                boolAplicaAccion = false;
        }
        
        // Si no lo habia encontrado al agregarlo, lo busca ahora
        if(!campoVal[VAL_INDICE_CAMPO])
            campoVal[VAL_INDICE_CAMPO] = document.getElementById(campoVal[VAL_INDICE_ID]);
        
        // Si no lo encuentra, envia error
        if(boolAplicaAccion && !campoVal[VAL_INDICE_CAMPO]) {
            validaAplicaError("No se encuentra el campo '" + campoVal[VAL_INDICE_NOMBRE] + "'.", i);
            boolAplicaAccion = false;
        }
        
        // Realiza la validacion solo si aplica para la accion solicitada
        if(boolAplicaAccion) {
            // Primero valida que no este vacio
            if (campoVal[VAL_INDICE_VACIO] == false) {
                  
                if (validaEsVacio(campoVal[VAL_INDICE_CAMPO].value) && campoVal[VAL_INDICE_TIPO]!=VAL_ERROR_CUSTOM) {
                    validaAplicaError("El campo '" + campoVal[VAL_INDICE_NOMBRE] + "' no puede estar vacío.", i);
                } else if (validaEsVacio(campoVal[VAL_INDICE_CAMPO].value) && campoVal[VAL_INDICE_TIPO]==VAL_ERROR_CUSTOM) {
                    validaAplicaError(campoVal[VAL_INDICE_NOMBRE], i);
                }
            }
           
            // Si NO esta vacio, efectua las validaciones de tipo
            if (validaEsValidoCampoActual) {
                if (campoVal[VAL_INDICE_TIPO] == VAL_TIPO_NUMERO) {
                    if (!validaEsNumero(campoVal[VAL_INDICE_CAMPO].value)) {
                        validaAplicaError("El campo '" + campoVal[VAL_INDICE_NOMBRE] + "' debe ser un número.", i);
                    }
                }
                else if (campoVal[VAL_INDICE_TIPO] == VAL_TIPO_NUMERO_POSITIVO) {
                    if (!validaEsNumero(campoVal[VAL_INDICE_CAMPO].value)) {
                        validaAplicaError("El campo '" + campoVal[VAL_INDICE_NOMBRE] + "' debe ser un número mayor que 0.", i);
                    }
                }
                 else if (campoVal[VAL_INDICE_TIPO] == VAL_TIPO_NUMERO_POSITIVO_MAYOR_CERO) {
                    if (validaEsMontoPositivo(campoVal[VAL_INDICE_CAMPO].value)) {
                        validaAplicaError("El campo '" + campoVal[VAL_INDICE_NOMBRE] + "' debe ser un número mayor que 0.", i);
                    } 
                }
                
                else if (campoVal[VAL_INDICE_TIPO] == VAL_TIPO_EMAIL) {
                   if (!validaEsVacio(campoVal[VAL_INDICE_CAMPO].value)) {
                       if (!validaEsEmail(campoVal[VAL_INDICE_CAMPO].value)) {
                        validaAplicaError("El campo '" + campoVal[VAL_INDICE_NOMBRE] + "' debe ser una dirección de e-mail válida.", i);
                       }
                   }    
                }
            else if (campoVal[VAL_INDICE_TIPO] == VAL_TIPO_CARACTER) {
                var mensajeCaracter="";
                       if ((mensajeCaracter= caracteresRaros(campoVal[VAL_INDICE_CAMPO].value)) !="") {
                        validaAplicaError("El campo '" + campoVal[VAL_INDICE_NOMBRE] + "' tiene los siguientes caracteres no válidos: "+mensajeCaracter +".", i);
                   }    
                }
                
                else if (campoVal[VAL_INDICE_TIPO] == VAL_TIPO_RUT) {
                    if (campoVal[VAL_INDICE_REL_TIPO] == VAL_TIPO_REL_NINGUNA) {
                        if (!validaEsRUTCompleto(campoVal[VAL_INDICE_CAMPO].value)) {
                        //var msg1 = "debe ser un RUT válido con más de 7 caracteres. Ingrese sólo números y guión (ejemplo: 12345678-9).";
                        //var msg1 = "debe ser un RUT válido (ejemplo: 12345678-9).";
                          var msg1 = "ingresado es incorrecto, ingrese uno nuevamente.";
                            validaAplicaError("El '" + campoVal[VAL_INDICE_NOMBRE] + "' "+msg1, i);
                        }
                    }
                    else {
                        if (!validaEsRUT(campoVal[VAL_INDICE_CAMPO].value)) {
                            validaAplicaError("El campo '" + campoVal[VAL_INDICE_NOMBRE] + "' debe tener la estructura de un RUT válido.", i);
                        }
                    }
                }
                else if (campoVal[VAL_INDICE_TIPO] == VAL_TIPO_MONTO) {
                    if (!validaEsMonto(campoVal[VAL_INDICE_CAMPO].value)) {
                        validaAplicaError("El campo '" + campoVal[VAL_INDICE_NOMBRE] + "' debe ser un monto válido.", i);
                    }
                }
                else if (campoVal[VAL_INDICE_TIPO] == VAL_TIPO_FECHA) {
                    // Ya valido que este vacio, asi que una fecha nula tambien es valida
                    if (campoVal[VAL_INDICE_CAMPO].value != "" && (mensaje = validaEsFecha(campoVal[VAL_INDICE_CAMPO].value)) != "") {
                        validaAplicaError("En el campo '" + campoVal[VAL_INDICE_NOMBRE] + "': " + mensaje + ".", i);
                    }
                }else if (campoVal[VAL_INDICE_TIPO] == VAL_TIPO_FECHA2) {
                    if (campoVal[VAL_INDICE_CAMPO].value != "" && !validaEsFecha2(campoVal[VAL_INDICE_CAMPO].value)) {
                        validaAplicaError("El campo '" + campoVal[VAL_INDICE_NOMBRE] + "' debe ser una fecha con formato dd/mm/aaaa.", i);
                    }
                }



                else if (campoVal[VAL_INDICE_TIPO] == VAL_TIPO_SELECT) {
                    if( !validaSelectedSelect(campoVal[VAL_INDICE_ID]) )
                        validaAplicaError("El campo '"+campoVal[VAL_INDICE_NOMBRE]+"' no es válido", i);
                }   
                 else if (campoVal[VAL_INDICE_TIPO] == VAL_TIPO_PORCENTAJE) {
                    if( !validaEsPorcentaje(campoVal[VAL_INDICE_CAMPO].value))
                        validaAplicaError("El campo '"+campoVal[VAL_INDICE_NOMBRE]+"' no es válido", i);
                }  
                 else if (campoVal[VAL_INDICE_TIPO] == VAL_ERROR_CUSTOM) {
                     validaAplicaError(campoVal[VAL_INDICE_NOMBRE], i);
                }
                else {
                }                 
               
            }
            // Ahora, si NO ha habido error, valida las relaciones
            if (validaEsValidoCampoActual) {
      // alert(campoVal[VAL_INDICE_REL_TIPO] );
       //alert(campoVal[VAL_TIPO_REL_FECHA_MENOR] );
                if (campoVal[VAL_INDICE_REL_TIPO] == VAL_TIPO_REL_RUT) {
                    if (!validaRelacionRUTEsValida(campoVal[VAL_INDICE_CAMPO].value, campoVal[VAL_INDICE_REL_CAMPO].value)) {
                        validaAplicaError("El campo '" + campoVal[VAL_INDICE_NOMBRE] + "' debe ser un RUT válido.", i);
                    }
                }
                else if (campoVal[VAL_INDICE_REL_TIPO] == VAL_TIPO_REL_IGUALES) {
                    if (campoVal[VAL_INDICE_CAMPO].value != campoVal[VAL_INDICE_REL_CAMPO].value) {
                        validaAplicaError("El campo '" + campoVal[VAL_INDICE_NOMBRE] + "' debe ser igual al campo '" + campoVal[VAL_INDICE_REL_NOMBRE] + "'.", i);
                    }
                }
                else if (campoVal[VAL_INDICE_REL_TIPO] == VAL_TIPO_REL_DISTINTOS) {
                    if (campoVal[VAL_INDICE_CAMPO].value == campoVal[VAL_INDICE_REL_CAMPO].value) {
                        validaAplicaError("El campo '" + campoVal[VAL_INDICE_NOMBRE] + "' debe ser distinto al campo '" + campoVal[VAL_INDICE_REL_NOMBRE] + "'.", i);
                    }
                }
                else if (campoVal[VAL_INDICE_REL_TIPO] == VAL_TIPO_REL_FECHA_MENOR) {
                    if (comparaFecha(campoVal[VAL_INDICE_CAMPO].value, campoVal[VAL_INDICE_REL_CAMPO].value) >= 0) {
                        validaAplicaError("La fecha '" + campoVal[VAL_INDICE_NOMBRE] + "' debe ser menor a la fecha '" + campoVal[VAL_INDICE_REL_NOMBRE] + "'.", i);
                    }
                }
                else if (campoVal[VAL_INDICE_REL_TIPO] == VAL_TIPO_REL_FECHA_MENOR2) {
                    if(campoVal[VAL_INDICE_CAMPO].value != "" && campoVal[VAL_INDICE_REL_CAMPO].value != ""){
                        if (comparaFecha2(campoVal[VAL_INDICE_CAMPO].value, campoVal[VAL_INDICE_REL_CAMPO].value) >= 0) {
                            validaAplicaError("La fecha '" + campoVal[VAL_INDICE_NOMBRE] + "' debe ser menor a la fecha '" + campoVal[VAL_INDICE_REL_NOMBRE] + "'.", i);
                        }
                    }
                }
            }
            if (VAL_CUSTOM_ERROR.length>0) {
                validaAplicaError(VAL_CUSTOM_ERROR, i);
                VAL_CUSTOM_ERROR="";
            }             
        }
    }

    if (!validaEsValido) {
        // Pone el foco solo si esta visible el campo
        try {
            validaArrCamposValidar[validaIFocus][VAL_INDICE_CAMPO].focus();
        }catch(e){
            ;
        }
        if(despliegue == DESPLIEGUE_JAVASCRIPT) {
            validaTextoJavascriptMensajes = "Resultado validación:" + validaTextoJavascriptMensajes;
            alert(validaTextoJavascriptMensajes);
            validaTextoJavascriptMensajes= "" ;
            validaTextoHTMLMensajes="";
        }
        else{
            validaTextoHTMLMensajes = "<ul>" + validaTextoHTMLMensajes + "<\/ul>";
            validaDivMensajes.innerHTML = validaTextoHTMLMensajes;
        }
    }
    return validaEsValido;
}

// Fancion que solo actualiza las variables al recorrer
function validaAplicaError(textoHTMLMensajes, iActual) {
    validaEsValido = false;
    validaEsValidoCampoActual = false;
    validaTextoHTMLMensajes = validaTextoHTMLMensajes + "<li>" + textoHTMLMensajes + "<\/li>";
    validaTextoJavascriptMensajes = validaTextoJavascriptMensajes + "\n" + textoHTMLMensajes;
    if (validaIFocus < 0 && iActual >= 0)
        validaIFocus = iActual;
}

// -----------------------
// Funciones de validacion
// Funcion que simula trim
function validaTrim(texto) {
    return texto.replace(/^\s*|\s*$/g, "");
}

// Funcion que valida si esta vacio
function validaEsVacio(texto) {
    return (validaTrim(texto) == "");
    //var validaTexto = validaTrim(texto);
    // Falta validar "-1" para select
}

// Funcion que valida que sea numerico
function validaEsNumero(numero) {
    return (/^([0-9])*$/.test(numero));
}

function validaEsMontoPositivo(numero) {
   
    if(numero != "" && numero == 0)
    return true;
    else return false
}

// Funcion que valida que sea numerico pero valor para moneda
function validaEsMonto(numero) {
    return (/^([0-9])*(\,([0-9]){1,2})?$/.test(numero));
}



function validaEsPorcentaje(numero) {

 if (validaEsNumero(numero)) {
  
     if(numero >= 0 || numero <= 100 ){
        return true;
      }
      else{
        return false;
      }
 }
 else{
    return false;
}
}


// Funcion que valida que sea email
function validaEsEmail(email) {
    re = /^[_A-Za-z0-9-]+(.[_A-Za-z0-9-]+)*@[_A-Za-z0-9-]+(.[A-Za-z0-9-]+)*[.]([A-Za-z]{2,3})$/;
     if (!re.exec(email) &&  email != '') {
      //  rw= /^[Ww]{3}[.][_A-Za-z0-9-]+([.][A-Za-z0-9-]+)*[.]([A-Za-z]{2,3})$/;
      //  if(!rw.exec(email)){
             return false;
      //  }else return true;
    }
    else {
        return true;
    }
}

// Funcion que valida que sea rut, pero dentro de una relacion
function validaEsRUT(rut) {
    if (!validaEsNumero(rut)) {
        return false;
    }
    else if (validaEsVacio(rut)) {
        return false;
    }
    return true;
}

// Funcion que valida que sea rut en un solo campo
function validaEsRUTCompleto(rut) {
    var largo = rut.length;
    // Primero valida el largo
    // El rut no debe tener menos de 7 caracteres, asi evitamos el ingreso del rut 4444-8
    if (largo < 7) {
        return false;
    }
    // Luego, separa el número del dígito verificador y realiza
    // las mismas validaciones que para los ruts en 2 campos
    var rutNumero = rut.substring(0, largo - 2);
    var rutGuion = rut.substring(largo - 2, largo - 1);
    var rutDV = rut.substring(largo - 1);
    // Valida que haya un guion, en cualquier otro caso, error
    if (rutGuion != "-") {
        return false;
    }
    if (!validaEsRUT(rutNumero)) {
        return false;
    }
    return validaRelacionRUTEsValida(rutNumero, rutDV);
}

/**
 * DHTML date validation script. Based on courtesy of SmartWebby.com (http://www.smartwebby.com/dhtml/)
 */

// Declaring valid date character, minimum year and maximum year
var dtCh = "/";
var minYear = 1900;
var maxYear = 2100;

// Funcion que valida que sea fecha
function validaEsFecha(fecha) {
    re = /^([0-9]{1,2}\/[0-9]{1,2}\/[0-9]{4})?$/;
    var separar = fecha.split("\/");
    if (!re.exec(fecha) || separar.length!=3 ) {
        return "Debe venir en formato de fecha (dd/mm/aaaa)";
    }
    else {
        var daysInMonth = DaysArray(12);
        var pos1 = fecha.indexOf(dtCh);
        var pos2 = fecha.indexOf(dtCh, pos1 + 1);
        var strDay = fecha.substring(0, pos1);
        var strMonth = fecha.substring(pos1 + 1, pos2);
        var strYear = fecha.substring(pos2 + 1);
        strYr = strYear;
        if (strDay.charAt(0) == "0" && strDay.length > 1)
            strDay = strDay.substring(1);
        if (strMonth.charAt(0) == "0" && strMonth.length > 1)
            strMonth = strMonth.substring(1);
        for (var i = 1;i <= 3;i++) {
            if (strYr.charAt(0) == "0" && strYr.length > 1)
                strYr = strYr.substring(1);
        }
        month = parseInt(strMonth);
        day = parseInt(strDay);
        year = parseInt(strYr);

        if (strDay.length < 1 || day < 1 || day > 31 || (month == 2 && day > daysInFebruary(year)) || day > daysInMonth[month]) {
            return "Por favor, ingrese un día válido";
        }
        if (strMonth.length < 1 || month < 1 || month > 12) {
            return "Por favor, ingrese un mes válido";
        }
        if (strYear.length != 4 || year == 0 || year < minYear || year > maxYear) {
            return "Por favor, ingrese un año de 4 dígitos válido entre " + minYear + " y " + maxYear;
        }
        return "";
    }
}

function isInteger(s) {
    var i;
    for (i = 0;i < s.length;i++) {
        // Check that current character is number.
        var c = s.charAt(i);
        if (((c < "0") || (c > "9")))
            return false;
    }
    // All characters are numbers.
    return true;
}

function daysInFebruary(year) {
    // February has 29 days in any year evenly divisible by four,
    // EXCEPT for centurial years which are not also divisible by 400.
    return (((year % 4 == 0) && ((!(year % 100 == 0)) || (year % 400 == 0))) ? 29 : 28);
}

function DaysArray(n) {
    for (var i = 1;i <= n;i++) {
        this[i] = 31
        if (i == 4 || i == 6 || i == 9 || i == 11) {
            this[i] = 30
        }
        if (i == 2) {
            this[i] = 29
        }
    }
    return this
}

// Validaciones de relaciones
// --------------------------
// Funcion que valida que sea rut, junto con DV
function validaRelacionRUTEsValida(rut, dv) {
    var dvr = '0';
    var suma = 0;
    var mul = 2;

    for (iRut = rut.length - 1;iRut >= 0;iRut--) {
        suma = suma + rut.charAt(iRut) * 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 + "";
    }

    return dvr == dv.toLowerCase();
}
function validaSelectedSelect(elementId){
    //if( parseInt($("#"+elementId+"").val())>0 ){
    if( $("#"+elementId+"").val()>0 ){
        return true;
    } else return false;
}


function enviar()
{
    if (event.keyCode == 13)
        validaEnviaForm();
}

// Instala validacion de si algun campo del formulario ha sido modificado
function instalaChequeoEstaModificado(campoDirty)
{
    $("input[type=text]").change(
            function(){
                $("#" + campoDirty).val("true");
            });
    $("textarea").change(
            function(){
                $("#" + campoDirty).val("true");
            });
    $("checkbox").change(
            function(){
                $("#" + campoDirty).val("true");
            });
}

// Valida si algun campo del formulario ha sido modificado
function chequeaEstaModificado(campoDirty)
{
    return ($("#" + campoDirty).val() == "true");
}

function validacionCustom(MessageFieldElement,textoHTMLMensajes){
    $(idMessageField).html(validaTextoHTMLMensajes + "<li>" + textoHTMLMensajes + "<\/li>");
}

function cleanValidaciones(){
    $("#mensajes").html("");
    validaArrCamposValidar = new Array();
}

function comparaFecha(fecha,fecha1){
    var IANO = 2;
    var IMES = 1;
    var IDIA = 0;
    fec=fecha.split("-");
    fec1=fecha1.split("-");
    
    if(fec[IANO]>fec1[IANO])
    {
        return 1;
    }
    else if(fec[IANO]<fec1[IANO])
    {
        return -1;
    }
    else
    {
        if(fec[IMES]>fec1[IMES])
        {
            return 1;
        }
            else if(fec[IMES]<fec1[IMES])
            {
                return -1;
            }
            else
            {
                if(fec[IDIA]>fec1[IDIA])
                {
                    return 1;
                }
                else if(fec[IDIA]<fec1[IDIA])
                {
                    return -1;
                }
                else
                {
                    return 0;
                }
            }
    }
    
} 

function comparaFecha2(fecha,fecha1){
    var IANO = 2;
    var IMES = 1;
    var IDIA = 0;
    fec=fecha.split("-");
    fec1=fecha1.split("-");
   
     if(fec[IANO]==fec1[IANO] && fec[IMES]==fec1[IMES] && fec[IDIA]==fec1[IDIA] ){
          
         return -1;
        
    }
    if(fec[IANO]>fec1[IANO])
    {
        return 1;
    }
    else if(fec[IANO]<fec1[IANO])
    {
        return -1;
    }
    else
    {
        if(fec[IMES]>fec1[IMES])
        {
            return 1;
        }
            else if(fec[IMES]<fec1[IMES])
            {
                return -1;
            }
            else
            {
                if(fec[IDIA]>fec1[IDIA])
                {
                    return 1;
                }
                else if(fec[IDIA]<fec1[IDIA])
                {
                    return -1;
                }
                else
                {
                    return 0;
                }
            }
    }
    
} 




// Funcion que valida que sea fecha
function validaEsFecha2(fecha) {
    re = /^([0-9]{1,2}\/[0-9]{1,2}\/[0-9]{4})?$/;
    if (!re.exec(fecha)) {
        return false;//"Debe venir en formato de fecha (dd/mm/aaaa)";
    }
    else {
        var daysInMonth = DaysArray(12);
        var pos1 = fecha.indexOf(dtCh);
        var pos2 = fecha.indexOf(dtCh, pos1 + 1);
        var strDay = fecha.substring(0, pos1);
        var strMonth = fecha.substring(pos1 + 1, pos2);
        var strYear = fecha.substring(pos2 + 1);
        strYr = strYear;
        if (strDay.charAt(0) == "0" && strDay.length > 1)
            strDay = strDay.substring(1);
        if (strMonth.charAt(0) == "0" && strMonth.length > 1)
            strMonth = strMonth.substring(1);
        for (var i = 1;i <= 3;i++) {
            if (strYr.charAt(0) == "0" && strYr.length > 1)
                strYr = strYr.substring(1);
        }
        month = parseInt(strMonth);
        day = parseInt(strDay);
        year = parseInt(strYr);

        if (strDay.length < 1 || day < 1 || day > 31 || (month == 2 && day > daysInFebruary(year)) || day > daysInMonth[month]) {
            return false;//"Por favor, ingrese un día válido";
        }
        if (strMonth.length < 1 || month < 1 || month > 12) {
            return false;//"Por favor, ingrese un mes válido";
        }
        if (strYear.length != 4 || year == 0 || year < minYear || year > maxYear) {
            return false;//"Por favor, ingrese un año de 4 dígitos válido entre " + minYear + " y " + maxYear;
        }
        return true;
    }
}  
  function caracteresRaros(texto){
    var i; var mensaje="";
    for (i = 0;i < texto.length;i++) {
        // Check that current character is number.
        var c = texto.charCodeAt(i);
        var t=texto.charAt(i);
      if (c >255 ){
            if (mensaje=="")
                mensaje= "" +
                "["+t+"]";
            else
                mensaje  = mensaje+" , ["+t+"]";
      }    
    }
   // All characters are numbers.
    return mensaje;
}


