// Añadimos una nueva función nativa al núcleo de javaScript que se encarga de verificar si un valor se encuentra dentro de un Array.
Array.prototype.inArray = function(valor){
    var i;
    for (i = 0; i < this.length; i++) {
        if (this[i] === valor) {
            return true;
        }
    }
    return false;
};
var elementosErr = [];
// Se definen las etiquetas a las que se les pueden aplicar 'clases' para la validación.
etiquetas = ["INPUT", "SELECT", "TEXTAREA", "BUTTON"];
// Se definen las 'clases' aceptadas para la realización de las validaciones (para evitar errores con clases CSS)
validaciones = ["obligatorio", "alfabetico", "numerico", "alfanumerico", "email", "listaobligatoria", "cantidad"];
// Función principal que se encarga de hacer el llamado al resto de funciones
function validar_form(formulario){
    // En la variable elemento se tiene un array con las etiquetas que forman parte del formulario a validar
    var elemento = window.document.forms[formulario].elements;
    // La variable enviar es la que determina si se genera el evento submit al culminar la validacion del formulario
    var enviar = true;
    // La variable cont se encarga llevar el numero de errores hallados en el formulario y determina si el valor de (enviar) cambia
    var cont = 0;
    var longitud = elemento.length;
    // Bucle for para recorrer todos los elementos del formulario
    for (i = 0; i < longitud; i++) {
        // Se verifica que la etiqueta se encuentre entre las aceptadas
        if (etiquetas.inArray(elemento[i].tagName)) {
            // Se extraen las clases que tenga la etiqueta a evaluar
            var clases = extraerClases(elemento[i]);
            // Si tiene clases definidas pasa
            if (clases != "" && clases.length != 0) {
                // Se recorre el array de las clases encontradas                
                for (c = 0; c < clases.length; c++) {
                    // Se verifica que la clase este definida
                    if (validaciones.inArray(clases[c])) {
                        // Se ejecuta la función asociada con la clase y si devuelve false el contador de errores aumenta
                        if (!eval(clases[c] + '(elemento[i].value,"err_" + elemento[i].name)')) {
                            elementosErr.push("err_" + elemento[i].name);
                            cont++;
                        }
                    }
                }
            }
        }
    }
    // Si existe algun error se modifica la variable enviar para que el evento submit no se realice
    if (cont > 0) {
        enviar = false;
    }
    // retornamos el valor al formulario
    return enviar;
}

// Funcion que extrae y devuelve un array con las clases registradas en el elemento recibido
function extraerClases(elemento){
    var clases = elemento.className;
    var listaClases = clases.split(" ");
    return listaClases;
}

// Funcion con la que se verifica que el campo se esté vacío, ni tenga sólo espacios en blanco
function obligatorio(valor, idEtiqueta){
    if (valor == null || valor.length == 0 || /^\s+$/.test(valor)) {
        document.getElementById(idEtiqueta).innerHTML = 'Este campo es obligatorio';
        return false;
    }
    else {
        document.getElementById(idEtiqueta).innerHTML = '&nbsp;';
        return true;
    }
}

// Funcion para verificar que el valor sea únicamente numérico (0-9)
function numerico(valor, idEtiqueta){
    if (obligatorio(valor, idEtiqueta)) {
        if (!(/^[-]?\d+(\.\d+)?$/.test(valor))) {
            document.getElementById(idEtiqueta).innerHTML = 'Introduzca solo valores numericos';
            return false;
        }
        else {
            document.getElementById(idEtiqueta).innerHTML = '&nbsp;';
            return true;
        }
    }
}

// Funcion para verificar que el valor sea únicamente alfabético (a-z, A-Z)
function alfabetico(valor, idEtiqueta){
    if (obligatorio(valor, idEtiqueta)) {
        if (!(/^[a-zA-ZüñÑáéíóúÁÉÍÓÚ\s]+$/.test(valor))) {
            document.getElementById(idEtiqueta).innerHTML = 'Introduzca solo valores alfabeticos';
            return false;
        }
        else {
            document.getElementById(idEtiqueta).innerHTML = '&nbsp;';
            return true;
        }
    }
}

// Funcion para verificar que el valor sea únicamente alfanumerico (a-z, A-Z, 0-9)
function alfanumerico(valor, idEtiqueta){
    if (obligatorio(valor, idEtiqueta)) {
        if (!(/^[a-zA-Z0-9]+$/.test(valor))) {
            document.getElementById(idEtiqueta).innerHTML = 'Introduzca solo valores alfanumericos';
            return false;
        }
        else {
            document.getElementById(idEtiqueta).innerHTML = '&nbsp;';
            return true;
        }
    }
}

// Funcion para verificar un formato de e-mail válido (usuario@empresa.dominio)
function email(valor, idEtiqueta){
    if (obligatorio(valor, idEtiqueta)) {
        if (!(/^([a-zA-Z0-9_\.\-])+(\+[a-zA-Z0-9]+)*\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/.test(valor))) {
            document.getElementById(idEtiqueta).innerHTML = 'El formato de la direccion no es valido';
            return false;
        }
        else {
            document.getElementById(idEtiqueta).innerHTML = '&nbsp;';
            return true;
        }
    }
}

// Funcion para verificar que se seleccione una opcion del comboBox (indice!=0)
function listaobligatoria(valor, idEtiqueta){
    if (valor == null || valor == 0) {
        document.getElementById(idEtiqueta).innerHTML = 'Debe seleccionar una opcion de la lista';
        return false;
    }
    else {
        document.getElementById(idEtiqueta).innerHTML = '&nbsp;';
        return true;
    }
}

// Función para obligar al usuario a escribir una cantidad minima de caracteres 'fija por el momento(6 caracteres)'
function cantidad(valor, idEtiqueta){
    var limite = 6;
    var est = obligatorio(valor, idEtiqueta);
    if (est) {
        //alert('paso');
        if (valor.length < limite) {
            document.getElementById(idEtiqueta).innerHTML = 'Escriba por lo menos 6 caracteres';
            est = false;
        }
        else 
            if (idEtiqueta == 'err_password2' || document.getElementById('err_password1').value == '&nbsp;') {
                est = comparar();
            }
    }
    return est;
}

// Función para comparar 2 valores, aplica para la coincidencias de passwords
function comparar(){
    if (document.getElementById('password1').value != document.getElementById('password2').value) {
        document.getElementById('err_password2').innerHTML = 'Las contraseñas no coinciden';
        return false;
    }
    else {
        return true;
    }
}

// Funcion para borrar los mensajes de error cuando se presione el botón button tipo reset
function borrar_err(){
    var total = elementosErr.length;
    for (var i = 0; i < total; i++) {
        document.getElementById(elementosErr.shift()).innerHTML = '&nbsp;';
    }
}

