/*
        validarCampo():
                Valida que el contenido de un campo de formulario.

        Entrada:
                [campo] objeto de formulario a validar.
                [tipo] posibles valores:
                                - "c" -> alfabético.
                                - "n" -> numérico.
                                - "cn" -> alfanumérico.
                                - "nom" -> nombre, alfapuntuación (igual que "c" + ' ' + '.' y '-').
                                - "nif" -> NIF.
                                - "dni" -> DNI.
                                - "cif" -> CIF.
                                - "nie" -> NIE.
                                - "email" -> E-mail.
                                - "fecha" -> fecha.
                [separador] opcional, sólo usado si el tipo es fecha, por defecto '/'.

        Retorno:
                true si el campo cumple la condición, false si no la cumple.
*/
function validarCampo(campo, tipo, separador)
{
        var retorno = true;
        var longitud_dni = 8;
        var longitud_nif = 9;
        var longitud = campo.value.length;
        var ultimo,primeros;

        if(separador == null || separador == "")
        {
                separador = new String("/");
        }

        switch(tipo)
        {
                case "dni":
                        retorno = esDNI(campo.value);
                        if(retorno)
                        {
                                // Rellenar con ceros por la izquierda hasta longitud total
                                for (var i=1; i<longitud_dni-longitud+1; i++)
                                { campo.value = "0" + campo.value; }
                        }
                        break;
                case "nif":
                        retorno = esNIF(campo.value);
                        if(retorno)
                        {
                                // Rellenar con ceros por la izquierda hasta longitud total
                                for (var i=1; i<longitud_nif-longitud+1; i++)
                                { campo.value = "0" + campo.value; }
                                 campo.value= campo.value.toUpperCase();
                        }
                        break;

                case "cif":
                        // Rellenar con ceros por la izquierda hasta longitud total
                        for (var i=1; i<longitud_nif-longitud+1; i++)
                        {
                                campo.value = campo.value.charAt(0) + "0" + campo.value.substring(1, campo.value.length);
                        }
                        campo.value= campo.value.toUpperCase();
                        retorno = esCIF(campo.value);
                        break;
                case "nie":
                        retorno = esNIE(campo.value);
                        if(retorno)
                        {
                                // Rellenar con ceros por la izquierda hasta longitud total
                                for (var i=1; i<longitud_nif-longitud+1; i++)
                                { campo.value = campo.value.charAt(0) + "0" + campo.value.substring(1, campo.length); }
                        }
                        campo.value= campo.value.toUpperCase();
                        break;

                case "email":
                        retorno = esEmail(campo.value);
                        break;
                case "fecha":
                        retorno = esFecha(campo.value, separador);
                        break;
                case "c":
                        retorno = esAlfabetico(campo.value);
                        break;
                case "n":
                        retorno = esNumerico(campo.value);
                        break;
                case "cn":
                        retorno = esAlfaNumerico(campo.value);
                        break;
                case "nom":
                        retorno = esNombre(campo.value);
                        break;
        }
        return retorno;
}

function esVacio(campo)
{
		
        var retorno = true;
        for(var cont = 0; cont < campo.value.length && retorno == true; cont++)
        {
                        if(campo.value.charAt(cont) != ' ')
                        {
                                retorno = false;
                        }
        }
        return retorno;
}

function esNumerico(cadena2)
{
		cadena = cadena2.value;
		
        var retorno = true;
        retorno = (cadena.length > 0);
        for(var cont = 0; cont < cadena.length && retorno==true; cont++)
        {
                if(cadena.charAt(cont) < "0" || cadena.charAt(cont) > "9")
                {
                        retorno = false;
                }
        }
        return retorno;
}

function esAlfabetico(cadena)
{
        var retorno =  true;
        retorno = (cadena.length > 0);
        for(var cont = 0; cont < cadena.length && retorno==true; cont++)
        {
                        if((cadena.charAt(cont) < "A" || cadena.charAt(cont) > "z")
                         && cadena.charAt(cont) != "ñ" && cadena.charAt(cont) != "Ñ")
                        {
                                retorno = false;
                        }
        }
        return retorno;
}


function esNombre(cadena)
{
        var retorno =  true;
        retorno = (cadena.length > 0);
        for(var cont = 0; cont < cadena.length && retorno==true; cont++)
        {
                        if((cadena.charAt(cont) < "A" || cadena.charAt(cont) > "z")
                         && cadena.charAt(cont) != "ñ" && cadena.charAt(cont) != "Ñ" && cadena.charAt(cont) != " "
                         && cadena.charAt(cont) != "-" && cadena.charAt(cont) != "."
						 
						 && cadena.charAt(cont) != "á" && cadena.charAt(cont) != "Á"
 						 && cadena.charAt(cont) != "é" && cadena.charAt(cont) != "É"
						 && cadena.charAt(cont) != "í" && cadena.charAt(cont) != "Í"
						 && cadena.charAt(cont) != "ó" && cadena.charAt(cont) != "Ó"
						 && cadena.charAt(cont) != "ú" && cadena.charAt(cont) != "Ú"
						 
						 && cadena.charAt(cont) != "ª" && cadena.charAt(cont) != "º")
                        {
                                retorno = false;
                        }
        }
        return retorno;
}

function esAlfaNumerico(cadena)
{
        var retorno =  true;
        retorno = (cadena.length > 0);
        for(var cont = 0; cont < cadena.length && retorno==true; cont++)
        {
                        if((cadena.charAt(cont) < "A" || cadena.charAt(cont) > "z")
                         && cadena.charAt(cont) != "ñ" && cadena.charAt(cont) != "Ñ"
                         && (cadena.charAt(cont) < "0" || cadena.charAt(cont) > "9"))
                        {
                                retorno = false;
                        }
        }
        return retorno;
}

function esAlfaPuntuacion(cadena)
{
        var retorno =  true;
        retorno = (cadena.length > 0);
        for(var cont = 0; cont < cadena.length && retorno==true; cont++)
        {
                        if((cadena.charAt(cont) < "A" || cadena.charAt(cont) > "z")
                         && cadena.charAt(cont) != "ñ" && cadena.charAt(cont) != "Ñ"
                         && (cadena.charAt(cont) != " " && cadena.charAt(cont) != "." && cadena.charAt(cont) != "-"))
                        {
                                retorno = false;
                        }
        }
        return retorno;
}

function esDNI(cadena)
{
        var retorno = true;
        var longitud=cadena.length;
        // Comprobar no vació y que todo son caracteres numéricos
        retorno = (longitud > 0 && esNumerico(cadena));
        return retorno;
}

function esNIF(cadena)
{
        var retorno = true;
        var longitud=cadena.length;
        var parte_numerica = cadena.substring(0,longitud-1);
        var ultimo_caracter=cadena.substring(longitud-1,longitud);

        // Comprobar no vació
        if(longitud > 0 && parte_numerica.length > 0)
        {        // Comprobar que el último caracter es alfabético y el primero (al menos) es numérico
                if(esNumerico(parte_numerica) && esAlfabetico(ultimo_caracter))
                {
                        // Comprobar letra del nif
                        retorno = (ultimo_caracter.toUpperCase() == letra_NIF_NIE(parte_numerica).toUpperCase());
                }
                else
                {
                        retorno = false;
                }
        }
        else
        {
                retorno = false;
          }
        return retorno;
}

function esNIE(cadena)
{
        var retorno = true;
        var longitud=cadena.length;
        var parte_numerica = cadena.substring(1,longitud-1);
        var primer_caracter=cadena.substring(0,1);
        var ultimo_caracter=cadena.substring(longitud-1,longitud);

        // Comprobar no vació
        if(longitud > 0 && parte_numerica.length > 0)
        {        // Comprobar que el último caracter es alfabético y el primero (al menos) es numérico
                if(esNumerico(parte_numerica) && esAlfabetico(ultimo_caracter) && esAlfabetico(primer_caracter))
                {
                        // Comprobar letra del nif
                        retorno = (ultimo_caracter.toUpperCase() == letra_NIF_NIE(parte_numerica).toUpperCase());
                }
                else
                {
                        retorno = false;
                }
        }
        else
        {
                retorno = false;
          }
        return retorno;
}


function esCIF(cadena)
{
        var retorno = true;
        var largo=cadena.length;
        var letra = cadena.substring(0,1);
        var parte_numerica = cadena.substring(1,largo-1);
        var digito_control = cadena.substring(largo-1,largo);

        // Comprobar no vació
        if(largo > 0 && parte_numerica.length > 0)
        {        // Comprobar que el primer caracter es alfabético, 2-8 son numéricos y el último es alfanúmerico
                if(esAlfabetico(letra) && esNumerico(parte_numerica) && esAlfaNumerico(digito_control))
                {
                        // Comprobar letra del Cif
                        retorno = (digito_control.toUpperCase() == String(letraCIF(cadena)).toUpperCase());
                }
                else
                {
                        retorno = false;
                }
        }
        else
        {
                retorno = false;
          }
        return retorno;
}


function letra_NIF_NIE(dni)
{
        var letras = new Array();
        var resto = (dni % 23)+1;

        letras[1] = 'T';
        letras[2] = 'R';
        letras[3] = 'W';
        letras[4] = 'A';
        letras[5] = 'G';
        letras[6] = 'M';
        letras[7] = 'Y';
        letras[8] = 'F';
        letras[9] = 'P';
        letras[10] = 'D';
        letras[11] = 'X';
        letras[12] = 'B';
        letras[13] = 'N';
        letras[14] = 'J';
        letras[15] = 'Z';
        letras[16] = 'S';
        letras[17] = 'Q';
        letras[18] = 'V';
        letras[19] = 'H';
        letras[20] = 'L';
        letras[21] = 'C';
        letras[22] = 'K';
        letras[23] = 'E';

        return letras[resto];
}


function letraCIF(cadena)
{
        var letra = cadena.substring(0,1);
        var suma1, suma2, prod1, prod2, prod3, prod4, resto, digito_control;
        var letras = new Array();
        letras[1] = 'J';
        letras[2] = 'A';
        letras[3] = 'B';
        letras[4] = 'C';
        letras[5] = 'D';
        letras[6] = 'E';
        letras[7] = 'F';
        letras[8] = 'G';
        letras[9] = 'H';
        letras[10] = 'I';

        suma1 = Number(cadena.charAt(2)) + Number(cadena.charAt(4)) + Number(cadena.charAt(6));

        prod1 = Number(cadena.charAt(1)) * 2;
        prod2 = Number(cadena.charAt(3)) * 2;
        prod3 = Number(cadena.charAt(5)) * 2;
        prod4 = Number(cadena.charAt(7)) * 2;

        if(prod1 > 9)
        { prod1 = Number(String(prod1).charAt(0)) + Number(String(prod1).charAt(1)); }
        if(prod2 > 9)
        { prod2 = Number(String(prod2).charAt(0)) + Number(String(prod2).charAt(1)); }
        if(prod3 > 9)
        { prod3 = Number(String(prod3).charAt(0)) + Number(String(prod3).charAt(1)); }
        if(prod4 > 9)
        { prod4 = Number(String(prod4).charAt(0)) + Number(String(prod4).charAt(1)); }

        suma2 = suma1 + prod1 + prod2 + prod3 + prod4;
        resto = suma2 % 10;
        if(resto == 0)
        { resto = 10; }

        digito_control = 10 - resto;

         // Empresa privada
        if(letra.toUpperCase() >= "A" && letra.toUpperCase() <= "H")
        {
                retorno = digito_control;

        }// Empresa pública
        else if(letra.toUpperCase() == "S" ||  letra.toUpperCase() == "P" ||  letra.toUpperCase() == "Q")
        {
                retorno = letras[digito_control+1];
        }
        else
        {
                retorno = false;
        }

        return retorno;
}


function esEmail(email)
{
        var caracteresInvalidos = " /:,;";
        if(email == "")
        {
                return false;
        }
        for(var i=0; i < caracteresInvalidos.length; i++)
        {
                caracterMalo = caracteresInvalidos.charAt(i);
                if(email.indexOf(caracterMalo, 0) > -1)
                {
                        return false;
                }
        }
        var pos = email.indexOf("@",1);
        if(pos == -1)
        {
                return false;
        }
        if(email.indexOf("@", pos+1) > -1)
        {
                return false;
        }
        var posPunto = email.indexOf(".", pos)
        if(posPunto == -1)
        {
                return false;
        }
        if(posPunto+3 > email.length)
        {
                return false;
        }
        return true;
}

// Esta función recibe un campo conteniendo una fecha y
// devuelve un valor booleano indicando si la fecha es correcta en el
// formato dd<SEP>mm<SEP>aaaa.
function esFecha(fecha, sep)
{
		
        // Validamos la fecha
        var diasEn = new Array(12);
        diasEn[1] = 31;
        diasEn[2] = 29;
        diasEn[3] = 31;
        diasEn[4] = 30;
        diasEn[5] = 31;
        diasEn[6] = 30;
        diasEn[7] = 31;
        diasEn[8] = 31;
        diasEn[9] = 30;
        diasEn[10] = 31;
        diasEn[11] = 30;
        diasEn[12] = 31;

        var s = new String(fecha.value);
        var a = s.indexOf(sep,0);
        var b = s.indexOf(sep,a+1);
        if (a != 2 || b != 5)
        {
                return false;
        }
        var longitud = s.length;
        var dia = s.substring(0,a);
        var mes = s.substring(a+1,b);
        mes = mes - 0; // Pasamos el mes de tipo cadena a entero (obligatorio para funcionar bien).
        var ano = s.substring(b+1,longitud);

//**** Comprobar que mes, día y año son números
        for(var cont = 0; cont < dia.length; cont++)
        {
                if(dia.charAt(cont) < "0" || dia.charAt(cont) > "9")
                {
                        return false;
                }
        }
        for(var cont = 0; cont < mes.length; cont++)
        {
                if(mes.charAt(cont) < "0" || mes.charAt(cont) > "9")
                {
                        return false;
                }
        }
        for(var cont = 0; cont < ano.length; cont++)
        {
                if(ano.charAt(cont) < "0" || ano.charAt(cont) > "9")
                {
                        return false;
                }
        }
//****
        if(ano > 2100 || ano < 1800)
        {
                return false;
        }
        if(mes > 12)
        {
                return false;
    }
    if(mes == 2)
        {
                var DiasFebrero=(((ano % 4 == 0) && ( (!(ano % 100 == 0)) || (ano % 400 == 0) ) ) ? 29 : 28 );;
        if(dia > DiasFebrero)
                {
                        return false;
                }
    }
        else
        {
                if(dia > diasEn[mes])
                {
                        return false;
                }
        }
        return true;
}


// Esta función recibe un campo conteniendo una hora y
// devuelve un valor booleano indicando si la hora es correcta en el
// formato hh<SEP>mm.
function esHora(hora, sep)
{
	var s = new String(hora);
	var a = s.indexOf(sep,0);
	if (a != 2)
	{
		return false;
	}
	
	var longitud = s.length;
	var horas = s.substring(0,a);
	var minutos = s.substring(a+1,longitud);

//**** Comprobar que la hora y minutos son correctos

	if(horas.length !=2)
	{
		return false;
	}
	if(minutos.length !=2)
	{
		return false;
	}

	for(var cont = 0; cont < horas.length; cont++)
	{
		if(horas.charAt(cont) < "0" || horas.charAt(cont) > "9")
		{
			return false;
		}
	}
	for(var cont = 0; cont < minutos.length; cont++)
	{
		if(minutos.charAt(cont) < "0" || minutos.charAt(cont) > "9")
		{
			return false;
		}
	}
	
//****
	if(horas > 23|| horas < 0)
	{
		return false;
	}
	if(minutos > 59 || horas < 0)
	{
		return false;
	}
	return true;
}

// Comprobar que el valor introducido por el usuario es un valor válido en Euros
// y arreglarlo en caso de:
//    - El separador decimal debe ser '.' si es ',' se cambia
//    - No se han escrito las dos cifras decimales
function ajustarValorEuros(campo)
{
        if(campo.value == "")
        {
                return true;
        }
// REEMPLAZA EL CARACTER ',' POR '.'
        var re = /\,/;
        campo.value = campo.value.replace(re, '.');

// CUANTAS OCURRENCIAS DEL CARACTER '.' HAY
        var pos = -1;
        var cuantos_puntos = 0;
        while((pos = campo.value.indexOf(".", pos+1)) != -1)
        {
                cuantos_puntos++;
        }
        switch(cuantos_puntos)
        {
// ESTABA ESCRITO SIN DECIMALES, AÑADE 2 CIFRAS DECIMALES
                case 0:
                        campo.value = campo.value + ".00";
                        break;
        // HAY UNA COMA
                case 1:
                        switch(campo.value.length - campo.value.indexOf(".", 0))
                        {
                                case 3:
                                        break;
                // ESTABA ESCRITO CON 1 DECIMAL, AÑADE 1 CIFRA DECIMAL
                                case 2:
                                        campo.value = campo.value + "0";
                                        break;
                // ESTABA ESCRITO SIN DECIMALES, AÑADE 2 CIFRAS DECIMALES
                                case 1:
                                        campo.value = campo.value + "00";
                                        break;
                // ESTABA ESCRITO CON MÁS DE 2 DECIMALES, LO RECORTA A 2
                                default:
//                                        campo.value = campo.value.substr(0, campo.value.indexOf(".", 0)+3);
                                        campo.value = round(Number(campo.value.substr(0,campo.value.indexOf(".", 0))) + round(Number(campo.value.substr(campo.value.indexOf(".", 0),campo.value.length - campo.value.indexOf(".", 0))),2));
//                                         Si despues de redondear, el último dígito es un cero, se pierde (por operar con números) y hay que reponerlo
                                        if(campo.value.length - campo.value.indexOf(".", 0) == 2)
                                        {
                                                        campo.value = campo.value + "0";
                                        }
                                        break;
                        }
                        break;
        // HAY MAS DE UNA COMA --> ERROR
                default:
                        campo.value = "";
                        campo.focus();
                        return false;
                        break;
        }
// COMPRUEBA QUE TODOS LOS CARACTERES MENOS LA COMA SON NÚMEROS, SINO ERROR
        var cont = 0;
        while(cont < campo.value.length)
        {
                if(campo.value.charAt(cont) != "." && (campo.value.charAt(cont) < "0" || campo.value.charAt(cont) > "9"))
                {
                        campo.value = "";
                        campo.focus();
                        return false;
                }
                cont++;
        }

// COMPRUEBA QUE LA PARTE ENTERA Y LA PARTE DECIMAL SON DISTINTAS DE "", SINO ERROR
        pos = campo.value.indexOf(".", 0);
        var parte_entera = campo.value.substr(0, pos);
        var parte_decimal = campo.value.substr(pos+1 , campo.value.length);
        if(parte_entera == "" || parte_decimal == "")
        {
                        campo.value = "";
                        campo.focus();
                        return false;
        }
        return true;
}

//
// Redondea un número a X dígidos decimales, por defecto 2
//
function round(num, X)
{
        var y;
    X = (!X ? 2 : X);
    y = Math.round(num*Math.pow(10,X))/Math.pow(10,X);
        return y;
}

// Comprobar que el valor introducido por el usuario es un porcentaje con hasta 2 cifras decimales
// y arreglarlo en caso de:
//    - El separador decimal debe ser '.' si es ',' se cambia
//    - No se han escrito las dos cifras decimales
function ajustarPorcentaje(campo)
{
        if(campo.value == "")
        {
                return true;
        }
// REEMPLAZA EL CARACTER ',' POR '.'
        var re = /\,/;
        campo.value = campo.value.replace(re, '.');

// CUANTAS OCURRENCIAS DEL CARACTER '.' HAY
        var pos = -1;
        var cuantos_puntos = 0;
        while((pos = campo.value.indexOf(".", pos+1)) != -1)
        {
                cuantos_puntos++;
        }
        switch(cuantos_puntos)
        {
// ESTABA ESCRITO SIN DECIMALES, AÑADE 2 CIFRAS DECIMALES
                case 0:
                        campo.value = campo.value + ".00";
                        break;
        // HAY UNA COMA
                case 1:
                        switch(campo.value.length - campo.value.indexOf(".", 0))
                        {
                                case 3:
                                        break;
                // ESTABA ESCRITO CON 1 DECIMAL, AÑADE 1 CIFRA DECIMAL
                                case 2:
                                        campo.value = campo.value + "0";
                                        break;
                // ESTABA ESCRITO SIN DECIMALES, AÑADE 2 CIFRAS DECIMALES
                                case 1:
                                        campo.value = campo.value + "00";
                                        break;
                // ESTABA ESCRITO CON MÁS DE 2 DECIMALES, LO RECORTA A 2
                                default:
//                                        campo.value = campo.value.substr(0, campo.value.indexOf(".", 0)+3);
                                        campo.value = Number(campo.value.substr(0,campo.value.indexOf(".", 0))) + round(Number(campo.value.substr(campo.value.indexOf(".", 0),campo.value.length - campo.value.indexOf(".", 0))),2);
//                                         Si despues de redondear, el último dígito es un cero, se pierde (por operar con números) y hay que reponerlo
                                        if(campo.value.length - campo.value.indexOf(".", 0) == 2)
                                        {
                                                        campo.value = campo.value + "0";
                                        }
                                        break;
                        }
                        break;
        // HAY MAS DE UNA COMA --> ERROR
                default:
                        campo.value = "";
                        campo.focus();
                        return false;
                        break;
        }
// COMPRUEBA QUE TODOS LOS CARACTERES MENOS LA COMA SON NÚMEROS, SINO ERROR
        var cont = 0;
        while(cont < campo.value.length)
        {
                if(campo.value.charAt(cont) != "." && (campo.value.charAt(cont) < "0" || campo.value.charAt(cont) > "9"))
                {
                        campo.value = "";
                        campo.focus();
                        return false;
                }
                cont++;
        }

// COMPRUEBA QUE LA PARTE ENTERA Y LA PARTE DECIMAL SON DISTINTAS DE "", SINO ERROR
        pos = campo.value.indexOf(".", 0);
        var parte_entera = campo.value.substr(0, pos);
        var parte_decimal = campo.value.substr(pos+1 , campo.value.length);
        if(parte_entera == "" || parte_decimal == "" || Number(campo.value) > 100.00 || Number(campo.value) <= 0.00)
        {
                        campo.value = "";
                        campo.focus();
                        return false;
        }
        return true;
}


//ELIMINA BLANCOS DE IZDA Y DCHA
function trim( str ) 
{
	var resultStr = "";
	
	resultStr = trimLeft(str);
	resultStr = trimRight(resultStr);
	
	return resultStr;
}

//ELIMINA BLANCOS DE IZDA
function trimLeft( str ) 
{
	var resultStr = "";
	var i = len = 0;
	// Return immediately if an invalid value was passed in
	if (str+"" == "undefined" || str == null) 
	return null;
	// Make sure the argument is a string
	str += "";
	if (str.length == 0) 
	resultStr = "";
	else { 
	// Loop through string starting at the beginning as long as there
	// are spaces.
	// len = str.length - 1;
	len = str.length;
	
	while ((i <= len) && (str.charAt(i) == " "))
	i++;
	// When the loop is done, we're sitting at the first non-space char,
	// so return that char plus the remaining chars of the string.
	resultStr = str.substring(i, len);
	}
	return resultStr;
}

//ELIMINA BLANCOS DE DERECHA
function trimRight( str ) 
{
	var resultStr = "";
	var i = 0;
	// Return immediately if an invalid value was passed in
	if (str+"" == "undefined" || str == null) 
	return null;
	// Make sure the argument is a string
	str += "";
	
	if (str.length == 0) 
	resultStr = "";
	else {
	// Loop through string starting at the end as long as there
	// are spaces.
	i = str.length - 1;
	while ((i >= 0) && (str.charAt(i) == " "))
	i--;
	
	// When the loop is done, we're sitting at the last non-space char,
	// so return that char plus all previous chars of the string.
	resultStr = str.substring(0, i + 1);
	}
	
	return resultStr; 
}

function esTelefono(cadena)
{
        var retorno = false;
        var tam=cadena.length;
       
        if(tam == 9 && esNumerico(cadena))
        {        
                
           retorno = true;
                
        }     
        return retorno;
}
