/**
 * validador.js
 * 
 * Contiene funciones de validacion de campos de formulario.
 */
 
/**
 * Valida si el valor recibido es numerico o no. Retorna true o false,
 * segun sea el caso.
 */

//Retorna el valor del campo de formulario con id 'id_campo'
function getValue( id_campo ){
    return document.getElementById( id_campo ).value;
}

//Cambia el valor del campo con el id indicado, por el valor indicado. 
function setValue( id_campo, nuevo_valor ){
    document.getElementById( id_campo ).value = nuevo_valor;
}

//Pone el foco sobre el campo con el id indicado.
function focusOn( id_campo ){
    document.getElementById( id_campo ).focus();
}

//Retorna verdadero si el valor recibido es numero. Falso si no lo es.
function esNumero( valor ){
    numRegExp = /^[0-9]+$/
    return numRegExp.test( valor );
}

//Retorna verdadero si el valor es nulo o vacio.
function estaVacio( valor ){
    return !/\S/.test( valor );
}

//Retorna verdadero si el numero (1er parametro) esta entre el
//rango definido por Nmax y Nmin. Si no lo esta, retorna falso.
function numeroEntreRango( numero, Nmax, Nmin ){
    var num = Number( numero );
    if(isNaN(num)){
        return false;
    }
    if(num != Math.round(num)){
        return false;
    }
    return (num >= Nmin && num <= Nmax);
}

//Retorna verdadero si el valor pasado como parametro corresponde a una
//direccion de correo electronico
function esEmail( valor ){
    emailRegExp = /^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.([a-z]){2,4})$/
    return emailRegExp.test( valor );
}

//Retorna verdadero si el 'date' recibido es una fecha, en el formato
//indicado. Los formatos son:
//
//FR = (dd/mm/yyyy)
//SHORTFR = (dd/mm/yy)
//US = (yyyy-mm-dd)
//SHORTUS = (yy-mm-dd)
//dd MMM yyyy (en ingles)
//MMM dd, yyyy (en ingles)
function esFecha( date, format ){
    if(!date) return false;
    if(!format) format = 'US';
    
    switch(format){
        case'FR': RegExpformat = /^(([0-2]\d|[3][0-1])\/([0]\d|[1][0-2])\/([2][0]|[1][9])\d{2})$/; break;
        case'US': RegExpformat = /^([2][0]|[1][9])\d{2}\-([0]\d|[1][0-2])\-([0-2]\d|[3][0-1])$/; break;
        case'SHORTFR': RegExpformat = /^([0-2]\d|[3][0-1])\/([0]\d|[1][0-2])\/\d{2}$/; break;
        case'SHORTUS': RegExpformat = /^\d{2}\-([0]\d|[1][0-2])\-([0-2]\d|[3][0-1])$/; break;
        case'dd MMM yyyy':RegExpformat = /^([0-2]\d|[3][0-1])\s(Jan(vier)?|Fév(rier)?|Mars|Avr(il)?|Mai|Juin|Juil(let)?|Aout|Sep(tembre)?|Oct(obre)?|Nov(ember)?|Dec(embre)?)\s([2][0]|[1][19])\d{2}$/; break;
        case'MMM dd, yyyy':RegExpformat = /^(J(anuary|u(ne|ly))|February|Ma(rch|y)|A(pril|ugust)|(((Sept|Nov|Dec)em)|Octo)ber)\s([0-2]\d|[3][0-1])\,\s([2][0]|[1][9])\d{2}$/; break;
    }
    
    return RegExpformat.test(date);
}

/**
 * Retorna verdadero si la fecha recibida es válida, en cuanto a la fecha como
 * tal. Esta función no se encarga de verificar el contenido de la cadena recibida,
 * así que se supone que es una cadena con formato válido.
 * 
 * Valida, por ejemplo, si la fecha registrada es válida cumpliendo con bisiestos,
 * meses de 30 o 31 días, número de meses de 01 a 12, etc.
 *
 * Solo recibe fechas en formato YYYY-MM-DD
 */
function esFechaValida( date ){
    try{
        dia = date.substr(8, 2);
        mes = date.substr(5, 2);
        anio = date.substr(0, 4);

        if(validarFecha(dia, mes, anio)){
            return false;
        }
    } catch(e){
        return false;
    }
    return true;
}

//Retorna verdadero si el valor recibido es una URL completa válida.
//Debe contener http:// , https:// , ftp:// ó ftps:// 
function esURL( valor ){
    if(!valor) return false;
    valor = valor.toLowerCase();
    urlRegExp = /^(((ht|f)tp(s?))\:\/\/)([0-9a-zA-Z\-]+\.)+[a-zA-Z]{2,6}(\:[0-9]+)?(\/\S*)?$/
    return urlRegExp.test( valor );
}

//Retorna verdadero si la promer fecha es mayor o igual que la segunda.
//Solo funciona para formato 'US' (YYYY-MM-DD).
function fechaMayorOIgualQue(fec0, fec1){
    var bRes = false;

    var sAno0 = fec0.substr(0, 4);
    var sMes0 = fec0.substr(5, 2);
    var sDia0 = fec0.substr(8, 2);
   
    var sAno1 = fec1.substr(0, 4);
    var sMes1 = fec1.substr(5, 2);
    var sDia1 = fec1.substr(8, 2);

    if (sAno0 > sAno1) bRes = true;
    else {
        if (sAno0 == sAno1){
            if (sMes0 > sMes1) bRes = true;
            else {
                if (sMes0 == sMes1)
                    if (sDia0 >= sDia1) bRes = true;
            }
        }
    }
    return bRes;
}


/**
 * Retorna 1 si hay error.
 */
function validarFecha(dia,mes,anio)
{
    var elMes = parseInt(mes);

    if(elMes>12)
        return 1;

    // MES FEBRERO
    if(elMes == 2){
        if(esBisiesto(anio)){
            if(parseInt(dia) > 29){
                return 1;
            }
            else
                return 0;
        }
        else{
            if(parseInt(dia) > 28){
                return 1;
            }
            else
                return 0;
        }
    }

    //RESTO DE MESES
    if(elMes== 4 || elMes==6 || elMes==9 || elMes==11){
        if(parseInt(dia) > 30){
            return 1;
        }
    } else if(elMes == 1 || elMes == 3 || elMes == 5 || elMes == 7 || elMes == 8 || elMes == 10 || elMes == 12){
        if(parseInt(dia) > 31){
            return 1;
        }
    }
    return 0;

}

function esBisiesto(anio)
{
    var BISIESTO;
    if(parseInt(anio)%4==0){
        if(parseInt(anio)%100==0){
            if(parseInt(anio)%400==0){
                BISIESTO=true;
            }
            else{
                BISIESTO=false;
            }
        }
        else{
            BISIESTO=true;
        }
    }
    else
        BISIESTO=false;

    return BISIESTO;
}
