/// @param obj referencia al objeto SELECT
/// @return valor seleccionado
function getValorSelect(obj) {
    if (!obj) {
        alert('No existe el objeto');
    } else if (obj.selectedIndex == -1) {
        alert('No hay ninguna opción seleccionada');
    } else {
        return obj.options[obj.selectedIndex].value;
    }
    return false;
}




// ***************************************************************
//                                VALIDACIONES
// ***************************************************************

// Valida que se ingrese un valor
// Para <select> no funciona
function validaRequerido(obj, nombre) {
    //-- Valido que se ingrese algo ---------------
    if (obj.value.length == 0) {
        obj.focus();
        alert("You must insert '" + nombre + "'");
        return false;
    } else {
        return true;
    }
}



// Valida el ingreso de un string
function validaLargo(obj, nombre, requerido, min, max) {
    //-- Valido que se ingrese algo ---------------
    if (obj.value.length == 0 && requerido) {
        obj.focus();
        alert("You must insert '" + nombre + "'");
        return false;
    }
    //-- Valido el largo minimo ---------------
    if (obj.value.length != 0 && obj.value.length < min) {
        obj.focus();
        alert("'" + nombre + "' must be bigger than  " + min + " chars.\nActualy the size is " + obj.value.length);
        return false;
    }
    //-- Valido el largo maximo ---------------
    if (max && obj.value.length > max) {
        obj.focus();
        alert("'" + nombre + "' the max size is" + max + " chars.\nActualy the size is " + obj.value.length);
        return false;
    }
    return true;
}



// Valida el ingreso de un email
function validaEmail(obj, nombre) {
    // Valida la sintaxis correcta del email
    // si el largo es 0 se considera que la sintaxis es correcta
    if (obj.value.length > 0 && (obj.value.indexOf('@') == -1 || obj.value.indexOf('.') == -1)) {
        obj.focus();
        alert("'" + nombre + "' must be like this  user@host.domain");
        return false;
    } else {
        return true;
    }
}


 
// Valida el ingreso de un valor en el select
function validaSelect(obj, nombre) {
    if (!obj) {
        alert("Select value '" + nombre + "'");
        return false;
    }
    if (obj.disabled) {
        return true;
    }
    if (obj.selectedIndex == -1 || getValorSelect(obj) == 'NULL') {
        obj.focus();
        alert("Select Value '" + nombre + "'");
        return false;
    }
    return true;
}




// Verifica que el archivo especificado (formulario: obj), tenga alguna de 
// las extensiones espeficicadas. Es case insensitive
function validaExtensiones(obj, nombre, extensiones) {
    // Si no hay archivo especificado, retorno true
    if (obj.value.length == 0)
        return true;

    // Flag que especifica si la extension es aceptada
    correcto = false;

    // Obtengo la extension del archivo
    ultimoPunto = obj.value.lastIndexOf('.');
    extension = obj.value.substr(ultimoPunto).toUpperCase();

    // Itero por todas las extensiones validas
    // verificando si la extensión del arrchivo corresponde
    for (i = 0; i < extensiones.length; i++)
        {
        if (extension == extensiones[i].toUpperCase())
            correcto = true;
        }

    if (!correcto)
        {
        obj.focus();
        if (extensiones.length == 1)
            alert("'" + nombre + "' debe tener la extensión " + extensiones[0]);
        else
            alert("'" + nombre + "' debe tener alguna de las extensiones: " + extensiones);

        return false;
        }
    else
        return true;
    }



// Busca si el valor de obj está en el select objSelect.
// Si se encuentra, se selecciona el select y se borra el campo
// de texto. Para la búsqueda del valor en el select, se ignoran
// los espacios iniciales y finales de ambos strings a comparar (trim)
function validaNoEnSelect(obj, nombre, objSelect) {
    if (obj.value == '') {
        return true;
    }
    pos = buscaTextoEnSelect(objSelect, obj.value);
    if (pos != -1) {
        alert("Ya existe '" + obj.value + "' en '" + nombre + "'.\nSe seleccionará dicha opción.");
        obj.value = '';
        objSelect.selectedIndex = pos;
        objSelect.focus();
        return false;
    } else {
        return true;
    }
}



/**
 * Realiza la comparación de 2 password, si no son iguales, borra
 * su valor y muestra un alert
 * @param p1 Referencia al objeto 1
 * @param p2 Referencia al objeto 2
 * @param nombre String con el nombre del campo
 *
 * @return true o false de acuerdo a si son iguales o distintos
 */
function comparaPassword(p1, p2, nombre, largoMin)
    {
    // Caso especial en que no se verifica password
    // Normalmente sucede al realizar una edición en que no se
    // muestra el valor original del password
    if (p1.value == '********' && p2.value == '********')
        return true;


    $ok = true;
    if ($ok) { $ok = validaLargo(p1, nombre, largoMin); }
    if ($ok) { $ok = validaLargo(p2, nombre + ' 2', largoMin); }

    if ($ok)
        {
        if (p1.value != p2.value)
            {
            p1.value = "";
            p2.value = "";
            p1.focus();
            alert("'" + nombre + "' no coincide, ingreselo nuevamente");
            return false;
            }
        return true;
        }
    return false;
    }



/**
 * valida que el valor del objeto sea un número entero
 * @param obj Referencia al objeto
 * @param nombre String con el nombre del campo
 *
 * @return true/false
 */
function validaInt(obj, nombre) {
    if (obj.value == '') {
        return true;
    }
    numero = parseInt(obj.value, 10);
    if (' ' + numero != ' ' + obj.value) { // Comparación de strings
        obj.focus();
        alert("'" + nombre + "' debe ser un número entero");
        return false;
    } else {
        return true;
    }
}



/**
 * valida que el valor del objeto sea un número real
 * @param obj Referencia al objeto
 * @param nombre String con el nombre del campo
 *
 * @return true/false
 */
function validaFloat(obj, nombre) {
    if (obj.value == '') {
        return true;
    }
    numero = parseFloat(obj.value, 10);
    if (' ' + numero != ' ' + obj.value) { // Comparación de strings
        obj.focus();
        alert("'" + nombre + "' debe ser un número");
        return false;
    } else {
        return true;
    }
}



/**
 * valida que el valor del objeto no sea mayor que 'max'
 * @param obj Referencia al objeto
 * @param nombre String con el nombre del campo
 * @param max valor máximo que puede tener el objeto
 *
 * @return true/false
 */
function validaValorMax(obj, nombre, max) {
    if (obj.value == '') {
        return true;
    }
    numero = parseFloat(obj.value, 10);
    obj.value = numero;
    if (numero > max) {
        obj.focus();
        alert("'" + nombre + "' debe ser menor o igual a " + max);
        return false;
    } else {
        return true;
    }
}



/**
 * valida que el valor del objeto no sea menor que 'min'
 * @param obj Referencia al objeto
 * @param nombre String con el nombre del campo
 * @param min valor mínimo que puede tener el objeto
 *
 * @return true/false
 */
function validaValorMin(obj, nombre, min) {
    if (obj.value == '') {
        return true;
    }
    numero = parseFloat(obj.value, 10);
    obj.value = numero;
    if (numero < min) {
        obj.focus();
        alert("'" + nombre + "' debe ser mayor o igual a " + min);
        return false;
    } else {
        return true;
    }
}






// MES entre 1 y 12. Valida una fecha
/**
 * Valida que una fecha sea válida
 * Si esUNIX es true, se validará que el año pertenezca a [1902 - 2037]
 * 
 * FALTA:
 * Si esUNIX=false, acepta un rango mayor de fechas, debe definirse correctamente
 * el rango de años válidos a aceptar
 */
function validaFecha(nombre, objDia, objMes, objAno, esUNIX) {
    ano = objAno.value;
    mes = getValorSelect(objMes);
    dia = objDia.value;

    // Si es fecha UNIX valido que sea entre 1902-2037
    if (esUNIX)
        esUNIX = true;
    else
        esUNIX = false;

    var mesModifi=parseInt(mes,10)- 1;

    if(ano.length+mes.length+dia.length>0) {
        var newDateObj = new Date(parseInt(ano,10), parseInt(mesModifi,10),parseInt(dia,10));
        if (ano.length == 0 && dia.length == 0 && parseInt(mes, 10) == 1) {
            objDia.focus();
            alert("Debe ingresar '" + nombre + "'");
            return false;
        }
        if(esUNIX && parseInt(ano,10) < 1902) {
            objAno.focus();
            alert("'" + nombre + "' debe ser igual o superior al año 1902");
            return false;
        }
        if(esUNIX && parseInt(ano,10) > 2037) {
            objAno.focus();
            alert("'" + nombre + "' no debe ser superior al año 2037");
            return false;
        }
        if(isNaN(newDateObj) || parseInt(ano,10) < 1902 || parseInt(newDateObj.getFullYear(),10)!=parseInt(ano,10) || (parseInt(newDateObj.getMonth(),10))!=parseInt(mesModifi,10) || parseInt(newDateObj.getDate(),10)!=parseInt(dia,10)) {
            objDia.focus();
            alert("La fecha: " + dia + "/" + mes + "/" + ano + " (" + nombre + ") es inválida\nVerifique que el año tenga 4 digitos y que\nel día y mes pertenezcan a un rango válido");
            return false;
        }
    }
    return true;
}





// ***************************************************************
//                        MANEJO DE STRINGS
// ***************************************************************

// Transforma el valor del objeto a un número entero
function soloNumeros(obj) {
    numero = parseInt(obj.value, 10);
    if (! numero > 0)
        numero = 0;
    obj.value = numero;
}



// Transforma el valor del objeto a un número con decimales
function soloFloat(obj) {

    // Reemplazo las comas por puntos
    numero = '';
    tope = obj.value.length;
    for (i = 0; i < tope; i++) {
        c = obj.value.charAt(i);
        if (c == ',')
            numero = numero + '.';
        else
            numero = numero + c;
    }

    numero = parseFloat(numero, 10);
    if (! numero > 0)
       numero = 0;
    obj.value = numero;
}



// Le quita los puntos a un string
function quitaPuntos(obj) {
    tope = obj.value.length;
    numero = '';

    for (i = 0; i < tope; i++) {
        c = obj.value.charAt(i);
        if (c != '.')
            numero = numero + c;
    }
    obj.value = numero;
}



// Quita los espacios anteriores y finales
function myTrim(string) {
    var i;
    var str;
    var tope;
    var c;

    str = '';
    tope = string.length;
    saca = true;
    for (i = 0; i < tope; i++) {
        c = string.charAt(i);
        if (!(c == ' ' && saca)) {
            str = str + c;
            saca = false;
        }
    }
    string = str;
    str = '';

    tope = string.length;
    saca = true;
    for (i = tope-1; i >= 0; i--) {
        c = string.charAt(i);
        if (!(c == ' ' && saca)) {
            str = c + str;
            saca = false;
        }
    }

    return str;
}



// ***************************************************************
//                     ACTIVACION DE CAMPOS
// ***************************************************************


function inactiva(obj) {
   obj.disabled=true;
   if (obj.style)
      obj.style.backgroundColor="dddddd";
}


function activa(obj) {
   obj.disabled=false;
   if (obj.style)
      obj.style.backgroundColor="ffffff";
}




// ***************************************************************
//                                NAVEGACION
// ***************************************************************

 
/// Carga la URL especificada en el documento actual.
/// A la URL se le agrega una porció aleatoria para no tener
/// problemas con caches
function cargaPagina(url) {
    urlExtra = "basura_" + Math.random() + "=1";
    if (url.indexOf("?") != -1)
        url = url + "&" + urlExtra;
    else
        url = url + "?" + urlExtra;
    document.location = url;
}



/// Carga la URL especificada en el documento actual.
/// A la URL se le agrega una porció aleatoria para no tener
/// problemas con caches. Recibe un segundo parámetro
/// en el que se especifica el frame o ventana en que se cargará
/// 
function cargaPaginaEn(url, target) {
    urlExtra = "basura_" + Math.random() + "=1";
    if (url.indexOf("?") != -1)
        url = url + "&" + urlExtra;
    else
        url = url + "?" + urlExtra;
    target.location = url;
}





// ***************************************************************
//                           OTROS
// ***************************************************************

 
// Busca si el valor 'valor' está en el select
function buscaTextoEnSelect(obj, valor) {
    var tope;
    var txt;
    var i;

    tope = obj.options.length;
    valor = myTrim(valor);
    for (i = 0; i < tope; i++) {
        txt = myTrim(obj.options[i].text);
        if (valor.toUpperCase() == txt.toUpperCase()) {
            return i;
        }
    }
    return -1;
}



// Recibe los componentes (objetos) de 2 fechas y verifica que la
// primera sea menor o igual a la segunda.
// Sirve para validar rangos de fecha
function validaIntervaloFechas(dI, mI, aI, dF, mF, aF) {

    DI = parseInt(dI.value, 10);
    MI = parseInt(mI.value, 10);
    AI = parseInt(aI.value, 10);
    DF = parseInt(dF.value, 10);
    MF = parseInt(mF.value, 10);
    AF = parseInt(aF.value, 10);
    if ( (AF < AI)
      || (AF == AI && MF < MI)
      || (AF == AI && MF == MI && DF < DI) ){
        alert("La fecha de inicio es mayor que la de término");
        dI.focus();
        return false;
    }
    return true;
}


//document.onmousedown=click;
// Impide usar el segundo botón para ver el codigo fuente
function click(e) {
   if (event.button == 2) {
      alert(message);
      return false;
   }
}



// Transforma el valor del objeto a un número entero
function soloNumeros(obj) {
   numero = parseInt(obj.value, 10);
   if (! numero > 0)
      numero = 0;
   obj.value = numero;
}


// Transforma el valor del objeto a un número con decimales
function soloFloat(obj) {
   numero = parseFloat(obj.value, 10);
   if (! numero > 0)
      numero = 0;
   obj.value = numero;
}



// Si obj.value es vacío le asigno otro valor
function copiaSiEsVacio(nombre, obj, valor, largoMax) {
    if (obj.value == '') {
        if (valor.length > largoMax)
            obj.value = valor.substr(valor, largoMax - 3) + '...';
        else
            obj.value = valor;
    }
    return true;
}




/*
 * Para manejo de layers (HTML dinámico)
 */

// Veo si utiliza layers (netscape) o si es explorer
ns4 = (document.layers)? true:false
ie4 = (document.all)? true:false

// Muestra un layer
function muestraLayer(obj) {
    if (ns4)
        obj.visibility = 'show';
    else if (ie4)
        obj.visibility = 'visible';
}

// Oculta un layer
function ocultaLayer(obj) {
    if (ns4)
        obj.visibility = 'hide';
    else if (ie4)
        obj.visibility = 'hidden';
}
