// ---------------------------------------------------------------------- //
//                                VARIABLES                               //
// ---------------------------------------------------------------------- //

// Esta variable indica si está bien dejar las casillas
// en blanco como regla general
var defaultEmptyOK = false;

var blnComillas = true;

// listas de caracteres

var carDigitos = "0123456789";
var carMinusculas = "abcdefghijklmnopqrstuvwxyzáéíóúñü";
var carMayusculas = "ABCDEFGHIJKLMNOPQRSTUVWXYZÁÉÍÓÚÑ";
var carBlancos = " \t\n\r";

// caracteres admitidos en nos de telefono
var carTelefono = "()-+ ";

// ---------------------------------------------------------------------- //
//                     TEXTOS PARA LOS MENSAJES                           //
// ---------------------------------------------------------------------- //

var txtError = "Error: Debe rellener los campos"

var txtPrompt = "Error: ";
var txtNULL = "Debe rellenar este campo"
var txtAlfanumerico = "ingrese un texto que contenga solo letras y/o numeros";
var txtTexto   = "ingrese un texto que contenga solo letras";
var txtEntero = "ingrese un numero entero";
var txtNumero = "Debe añadir un número sin letras.";
var txtDecimal = "ingrese valores enteros o decimales con comas";
var txtTelefono = "ingrese un número de teléfono";
var txtEmail = "ingrese una dirección de correo electrónico válida";
var txtNombre = "ingrese un texto que contenga solo letras, numeros o espacios";
var txtComillas = "no puede utilizar comillas aqui";
var txtNif = "debe introducir un NIF valido";
var txtFecha = "debe introducir una Fecha valida";
var txtMinimo = "";

// ---------------------------------------------------------------------- //
//                  CODIGO PARA FUNCIONES BASICAS                         //
// ---------------------------------------------------------------------- //



//CADENA VACIA O DE LONGITUD CERO
function esVacio(cad)
{   
return ((cad == null) || (cad.length == 0));
}

//ESPACIO EN BLANCO O CADENA DE ESPACIOS EN BLANCO
function esEspacioBlanco (cad)
{   var i;
    if (esVacio(cad)) return true;
    for (i = 0; i < cad.length; i++)
    {   
        var c = cad.charAt(i);
        if (carBlancos.indexOf(c) == -1) return false;
    }
    return true;
}


//ELIMINA LOS CARACTERES QUE APARECEN EN UN PATRON DE LA CADENA
function eliminaCarCadena (cad, patron)
{   var i;
    var returnString = "";
	    
    for (i = 0; i < cad.length; i++)
    {   var c = cad.charAt(i);
        if (patron.indexOf(c) == -1) returnString += c;
    }
    return returnString;
}


//ELIMINA LOS CARACTERES DE UNA CADENA QUE NO APARECEN EN EL PATRON
function eliminaCarNoCadena (cad, patron)
{   var i;
    var returnString = "";
    for (i = 0; i < cad.length; i++)
    {   
        var c = cad.charAt(i);
        if (patron.indexOf(c) != -1) returnString += c;
    }

    return returnString;
}


// ELIMINA TODOS LOS ESPACIOS EN BLANCO DE UNA CADENA
function eliminaEspaciosBlanco (cad)
{   return eliminaCarCadena (cad, carBlancos);
}



// INDICA SI EL CARACTER ES UNA LETRA
function esLetra (car)
{
    return( ( carMinusculas.indexOf( car ) != -1 ) ||
            ( carMayusculas.indexOf( car ) != -1 ) );
}


// INDICA SI EL CARACTER ES UN DIGITO
function esDigito (car)
{   return ((car >= "0") && (car <= "9"));
}

// INDICA SI EL CARACTER ES DIGITO O LETRA
function esLetraDigito (car)
{   return (esLetra(car) || esDigito(car));
}


// ---------------------------------------------------------------------- //
//                          NUMEROS                                       //
// ---------------------------------------------------------------------- //

function esEntero (val)
{   var i;
    if (esVacio(val)) 
       if (esEntero.arguments.length == 1) return defaultEmptyOK;
       else return (esEntero.arguments[1] == true);
    
    for (i = 0; i < val.length; i++)
    {   
        var c = val.charAt(i);
        //if( i != 0 ) {
            if (!esDigito(c)) 
				return false;
        //} else { 
            if (!esDigito(c) && ((c == "-") || (c == "+"))) 
				return false;
        //}
    }
    return true;
}

function esMinimo (val)
{   var i;
    if (esVacio(val)) 
       if (esEntero.arguments.length == 1) return defaultEmptyOK;
       else return (esEntero.arguments[1] == true);
    
    for (i = 0; i < val.length; i++)
    {   
        var c = val.charAt(i);
		var n = Number(val);
        //if( i != 0 ) {
            if (!esDigito(c)) 
				return false;
        //} else { 
            if (!esDigito(c) && ((c == "-") || (c == "+"))) 
				return false;
        //}
			if (n < 10)
				return false;
    }
    return true;
}


// INDICA SI EL VALOR ES NUMERICO (ENTERO O FLOTANTE CON O SIN SIGNO)

function esNumero (val)
{   var i;
    var punto;
    punto = false;
    if (esVacio(val)) 
       if (esNumero.arguments.length == 1) return defaultEmptyOK;
       else return (esNumero.arguments[1] == true);
    
    for (i = 0; i < val.length; i++)
    {   
        var c = val.charAt(i);
        if( i != 0 ) {
            if ( c == "." ) {
                if( !punto )
                    punto = true;
                else
                    return false;
            } else     
                if (!esDigito(c)) 
					return false;
        } else { 
            if ( c == "." ) {
                if( !punto )
                    punto = true;
                else
                    return false;
            } else     
                if (!esDigito(c) && (c != "-") || (c == "+")) 
					return false;
        }
    }
    return true;
}


// INDICA SI EL VALOR ES NUMERICO Y/O DECIMAL
function esDecimal (val)
{   var i;
    var punto;
	var numDecimales=0;
    punto = false;
    if (esVacio(val)) 
       if (esDecimal.arguments.length == 1) return defaultEmptyOK;
       else return (esDecimal.arguments[1] == true);
    
    for (i = 0; i < val.length; i++)
    {   
        var c = val.charAt(i);
        if( i != 0 ) {
            if ( c == "," ) {
                if( !punto )
                    punto = true;
                else
                    return false;
            } else     
                if (!esDigito(c)) 
					return false;
        } else { 
            if ( c == "," ) {
                if( !punto )
                    punto = true;
                else
                    return false;
            } else     
                if (!esDigito(c) && (c == "-") || (c == "+")) 
					return false;
        }
		if (punto) 
		{
			if (numDecimales > 2)
				return false;
			else
				numDecimales++;	
		}
    }
	numDecimales--;
	//alert(numDecimales);
    return true;
}

// ---------------------------------------------------------------------- //
//                        STRINGS SIMPLES                                 //
// ---------------------------------------------------------------------- //


//INDICA SI LA CADENA ES VACIA O NULL
function esNULL (txt)
{   
  if (esVacio(eliminaEspaciosBlanco(txt))) 
     return false;
  else
	 return true;
}

// INDICA SI LA CADENA UNICAMENTE CONTIENE TEXTO
function esTexto (txt)
{   
	var i;

    if (esVacio(txt)) 
       if (esTexto.arguments.length == 1) return defaultEmptyOK;
       else return (esTexto.arguments[1] == true);
    for (i = 0; i < txt.length; i++)
    {   
        var c = txt.charAt(i);
        if (!esLetra(c))
        	return false;
    }
    return true;
}

// INDICA SI LA CADENA ES ALFANUMERICA (LETRAS Y NUMEROS)
function esAlfanumerico (txt)
{   var i;

    if (esVacio(txt)) 
       if (esAlfanumerico.arguments.length == 1) return defaultEmptyOK;
       else return (esAlfanumerico.arguments[1] == true);

    for (i = 0; i < txt.length; i++)
    {   
        var c = txt.charAt(i);
        if (! (esLetra(c) || esDigito(c) ) )
        return false;
    }

    return true;
}

//INDICA SI SOLO CONTIENE LETRAS, DIGITOS O ESPACIOS EN BLANCO
function esNombre (txt)
{
    if (esVacio(txt)) 
       if (esNombre.arguments.length == 1) return defaultEmptyOK;
       else return (esNombre.arguments[1] == true);
    
    return(esAlfanumerico(eliminaCarCadena(txt,carBlancos)));
}

// ---------------------------------------------------------------------- //
//                     TELEFONO , EMAIL o NIF                             //
// ---------------------------------------------------------------------- //


//INDICA SI LA CADENA CONTIENE UN NIF CORRECTO
function esNif (txt)
{   var modString;
	var contGuion=0;
	var contLetra=0;
    if (esVacio(txt)) 
       if (esNif.arguments.length == 1) return defaultEmptyOK;
       else return (esNif.arguments[1] == true);
 
    for (i = 0; i < txt.length; i++)
    {   
        var c = txt.charAt(i);
        if (esLetra(c) || esDigito(c) || c == "-") 
		{
	        //return false;
			if ( esLetra(c) )
				contLetra ++;
			if ( c == "-" )
				contGuion ++;
		}
		else return false;
    }

	if ( contGuion > 1 || contLetra > 1 || contLetra < 1) 
		return false;
    return true;
}

function valSep(Txt)
{
	var bOk = false;
	bOk = (Txt.charAt(2) == "/") && (Txt.charAt(5) == "/");
	return bOk;
}

function finMes(Txt)
{
	var nMes = parseInt(Txt.substr(3, 2), 10);
	var nRes = 0;
	switch (nMes)
	{
		case 1: nRes = 31; break;
		case 2: nRes = 29; break;
		case 3: nRes = 31; break;
		case 4: nRes = 30; break;
		case 5: nRes = 31; break;
		case 6: nRes = 30; break;
		case 7: nRes = 31; break;
		case 8: nRes = 31; break;
		case 9: nRes = 30; break;
		case 10: nRes = 31; break;
		case 11: nRes = 30; break;
		case 12: nRes = 31; break;
	}
	return nRes;
}

function valDia(Txt)
{
	var bOk = false;
	var nDia = parseInt(Txt.substr(0, 2), 10);
	bOk = bOk || ((nDia >= 1) && (nDia <= finMes(Txt)));
	return bOk;
}

function valMes(Txt)
{
	var bOk = false;
	var nMes = parseInt(Txt.substr(3, 2), 10);
	bOk = bOk || ((nMes >= 1) && (nMes <= 12));
	return bOk;
}

function valAno(Txt)
{
	var bOk = true;
	var nAno = Txt.substr(6);
	bOk = bOk && ((nAno.length == 2) || (nAno.length == 4));
	if (bOk)
	{
		for (var i = 0; i < nAno.length; i++)
		{
			bOk = bOk && esDigito(nAno.charAt(i));
		}
	}
	return bOk;
}

function esFecha(txt)
{
	var bOk = true;
	if (txt != "")
	{
		bOk = bOk && (valAno(txt));
		bOk = bOk && (valMes(txt));
		bOk = bOk && (valDia(txt));
		bOk = bOk && (valSep(txt));
	}
	return bOk;
}


//INDICA SI LA CADENA CONTIENE UNA FECHA CORRECTA
function esFecha2(txt)
{   
	var modString;
	var contBarra=0;
	alert("holaaaa");
    if (esVacio(txt)) 
       if (esFecha.arguments.length == 1) 
	   		return defaultEmptyOK;
       else 
	   		return (esFecha.arguments[1] == true);
 
    for (i = 0; i < txt.length; i++)
    {   
        var c = txt.charAt(i);
        if (esDigito(c) || c == "/") 
		{
	        //return false;
			if ( c == "/" )
				contBarra ++;
		}
		else return false;
    }

	if ( contBarra > 2 || contBarra < 2) 
		return false;
    return true;
}


//INDICA SI LA CADENA CONTIENE UN NUMERO DE TELEFONO O DE FAX
function esTelefono (txt)
{   var modString;
    if (esVacio(txt)) 
       if (esTelefono.arguments.length == 1) return defaultEmptyOK;
       else return (esTelefono.arguments[1] == true);
 
    modString = eliminaCarCadena ( txt, carTelefono );
    return (esEntero(modString))
}

//INDICA SI LA CADENA CONTIENE UNA DIRECCION DE CORREO VALIDA
function esEmail (txt)
{
    if (esVacio(txt)) 
       if (esEmail.arguments.length == 1) return defaultEmptyOK;
       else return (esEmail.arguments[1] == true);

    if (esEspacioBlanco(txt)) 
		return false;
    var i = 1;
    var sLength = txt.length;

    while ((i < sLength) && (txt.charAt(i) != "@"))
    { 
		i++;
    }

    if ((i >= sLength) || (txt.charAt(i) != "@")) 
		return false;
    else 
		i += 2;

    while ((i < sLength) && (txt.charAt(i) != "."))
    { 
		i++;
    }

    if ((i >= sLength - 1) || (txt.charAt(i) != ".")) 
		return false;
    else 
		return true;
}


//INDICA SI EL TEXTO CONTIENE COMILLAS
function sinComillas(txt)
{
        var i = 1;
        var sLength = txt.length;
        var b = 1;
        while(i<sLength) {
                if( (txt.charAt(i) == "\"") || (txt.charAt(i) == "'" ) ) b = 0;
                i++;
        }
        return b;
}

// ---------------------------------------------------------------------- //
//                           MENSAJES AL USUARIO                             //
// ---------------------------------------------------------------------- //

//MUESTRA UN TEXTO EN LA BARRA DE ESTADO
function txtBarraEstado (txt)
{   
	window.status = txt;
}


//NOTIFICA QUE EL CAMPO ES VACIO
function msgCampoVacio (src)
{   
	src.focus();
    alert(txtError);
    txtBarraEstado(txtError);
    return false;
}

function msgCampoInvalido (src, txt)
{   
	src.focus();
    src.select();
	//alert(src.name);
    alert(txt);
    txtBarraEstado(txtPrompt + txt);
    return false;
}

// ---------------------------------------------------------------------- //
//                           FUNCION RAIZ                                //
// ---------------------------------------------------------------------- //


function verifica(src, funcion, emptyOK, txt)
{   
    var msg;
	
    if (verifica.arguments.length < 3) emptyOK = defaultEmptyOK;
    if (verifica.arguments.length == 4) 
	{
        alert(txt);
		msg = txt;
    } 
	else 
	{
        if( funcion == esTexto ) msg = txtTexto;
        if( funcion == esAlfanumerico ) msg = txtAlfanumerico;
        if( funcion == esEntero ) msg = txtEntero;
        if( funcion == esNumero ) msg = txtNumero;
		if( funcion == esDecimal ) msg = txtDecimal;
        if( funcion == esEmail ) msg = txtEmail;
        if( funcion == esTelefono) msg = txtTelefono;
        if( funcion == esNombre) msg = txtNombre;
		if( funcion == esNif) msg = txtNif;
		if( funcion == esNULL) msg = txtNULL;
		if( funcion == esFecha) msg = txtFecha;
		if( funcion == esMinimo) msg = txtMinimo;
    }
    
    if ((emptyOK == true) && (esVacio(src.value))) return true;

    if ((emptyOK == false) && (esVacio(src.value))) 
        return msgCampoVacio(src);

    if ( blnComillas && !sinComillas(src.value))
        return msgCampoInvalido(src, txtComillas);

    if (funcion(src.value) == true) 
        return true;
    else
        return msgCampoInvalido(src,msg);

}


