// **************************************************************
// Libreria form.js
// Autores: Jose Miguel Gosalbez Martinez (2001)
//			Pere Serrano Sempere (2001)	
// --------------------------------------------------------------
// Descripcion: Procesa en el cliente los campos de un formulario
// **************************************************************


// ------------------
// VARIABLES GLOBALES
// ------------------


var espacioEnBlanco = " \t\n\r";
var digitos = "0123456789.";
var signos = "0123456789.-_/";
var minusculas = "abcdefghijklmnopqrstuvwxyzáéíóú"; // alfabeto inglés
var mayusculas = "ABCDEFGHIJKLMNOPQRSTUVWXYZÁÉÍÓÚ"; // alfabeto inglés
var charmail = ".-_"; // caracteres validos para usuario de email y compañia


// -------------------------------------------
//            F U N C I O N E S
// -------------------------------------------


// Indica si el caracter pasado como parametro es una letra (mayuscula o minuscula)

function esLetra(l)
{
    return( ( mayusculas.indexOf( l ) != -1 ) || ( minusculas.indexOf( l ) != -1 ) )
}

// Indica si 'n' es un dígito.

function esNumero(n)
{   
    return (digitos.indexOf(n) != -1 );  

}

// Indica si 'n' es un signo.

function esSigno(n)
{   
    return (signos.indexOf(n) != -1 );  

}

// Indica si el caracter pasado es un caracter especial para usuario de email (usuario)@(compañia).(dominio)

function esCharmail(c)
{
    return  (charmail.indexOf(c) != -1);
}

// Indica si una cadena solo contiene digitos alfanumericos.

function esAlfanumerico(s)
{   
    var i;
 
    for (i = 0; i < s.length; i++)
    {   
        var c = s.charAt(i);
        
        if (! (esLetra(c) || esNumero(c) || esSigno(c) || c==" "))
               return false; 
        
    }

    return true;
}


// Indica si una cadena solo contiene digitos numericos.

function esNumerico(s)
{   
    var i;
 
    for (i = 0; i < s.length; i++)
    {   
        var c = s.charAt(i);
        
        if (! (esNumero(c) || c==" "))
               return false; 
        
    }

    return true;
}




// indica si el usuario (el caracter que va delante de la arroba de un email) es valido.
// para ello solo debe contener caracteres alfanumericos y puntos,guiones y subrayados.

function esCadenaMail(s)

{   
    var i;

    for (i = 0; i < s.length; i++)
    {   
        var c = s.charAt(i);
        if (! (esLetra(c) || esNumero(c) || esCharmail(c)) )
        return false;
    }

    return true;
}

// Indica si la cadena pasada solo contiene caracteres alfabeticos

function esAlfabetico(s)
{   
    var i;
   
	  for (i = 0; i < s.length; i++)
    {   
        var c = s.charAt(i);
        if (!(esLetra(c))) return false;
    }

    return true;
}

function esCampoVacio(campo)
{
	if ((campo==null) || (campo.length == 0)) return(true);	
}


// Procesa la cadena y verifica que sea valida.
// Que no este vacia ni contenga espacios en blanco.
// Y que este compuesta por caracteres y digitos validos del alfabeto ingles.
// Devuelve FALSE si es una cadena valida y TRUE si tiene alguna incorreccion.

function invalida(cadena)
{  
    var i;
		
    // verificamos primero si esta vacia la cadena
		if ((cadena==null) || (cadena.length == 0)) return(true);		
		
		// Si contiene otra cosa que no sean letras del alfabeto ingles o numeros,
		// no es una cadena válida. Devolveremos falso.  
		
		if (!(esAlfanumerico(cadena))) 
		   {
			   return(true);
			 }
  	
		// No debe contener espacios en blanco.
			
		for (i = 0; i < cadena.length; i++)
    {   
        var c = cadena.charAt(i);
        // si el caracter en que estoy no aparece en espacioEnBlanco,
        // entonces devolvemos falso ya que la cadena sera correcta.
        if (espacioEnBlanco.indexOf(c) == -1) return false;
    }
    return true;
}

function esEmail(email)
{

 // Si el campo esta vacio no seguimos procesando.
 
 if ((email==null) || (email.length == 0)) return(false);
 
 // Si tiene espacios en blanco no es email valido.
 
 for (i = 0; i < email.length; i++)
 {   
        var c = email.charAt(i);
				if (espacioEnBlanco.indexOf(c) != -1 ) return false;
 }	

 // -------------------------------------------
 //  Comprobaciones previas sobre la arroba (@) 
 // -------------------------------------------
 
 // El email tiene forzosamente que contener una arroba.
 
 if (email.indexOf("@") == -1) return false;
 
 // Y solamente una. 
 
 if ( email.indexOf("@")  != email.lastIndexOf("@") ) 
 {
   alert("tiene dos o mas arrobas");
	 return false;
 }
 
 // Pero esa arroba no puede estar al principio ni al final.
 
 if ( (email.indexOf("@") == 0) || (email.indexOf("@") == (email.length-1))) return false;
 
 	
 // ----------------------------------------------------------------------------------------------------
 // si hasta aqui todo es valido procesamos la cadena	
 // Dividimos el email en 3 partes (usuario)@(compañia).(dominio)
 // usuario y compañia solo pueden contener letras del alfabeto ingles,puntos,guiones y subrayados.
 // el dominio solo puede contener letras del alfabeto ingles y tener una extension de 2 o 3 caracteres.
 // ----------------------------------------------------------------------------------------------------
 
 // Comprobamos el usuario
 
 // extraemos la cadena del usuario.
 var cadena = email.split("@"); 
 var usuario = cadena[0];
 
 // Si el el usuario contiene caracteres no validos el email es incorrecto.
 
 if (!(esCadenaMail(usuario))) return false;

 // Comprobacion de la compañia y del dominio. 
 // Llegados a este punto trabajamos el resto de la cadena email.
 
 var resto = cadena[1];
 
 // Esta cadena debe contener al menos un punto
  
 if (resto.indexOf(".") == -1) return false;
 
 // y dicho punto no puede estar ni al principio 
  
 if (resto.indexOf(".") == 0 ) return false;
 
 // ni al final de la cadena
 
 if (resto.indexOf(".") == (resto.length-1)) return false;
   
 // Llegados a este punto tenemos un array de N elementos
 // el ultimo elemento es el dominio y los anteriores pertenecen a la compañia
 // aaaaaaaa.bbbbbbbb.ccccccccc.ddd
  
 // Separamos el ultimo elemento.
 // Para ello averiguamos la posicion del ultimo punto
 
  var posPunto = resto.lastIndexOf(".");
	
	// La compañía comprende desde la primera posición del array hasta la posicion del ultimo punto 
  
	var company = resto.substring(0,posPunto);
	
  // Ahora verificamos la compañia del mismo modo que lo hemos hecho con el usuario
	
	if (!(esCadenaMail(company))) return false;
	
	// Extraemos ahora el dominio
		
	var dominio = resto.substring(posPunto+1,resto.length);
	
	// Verificamos ahora que el dominio solo tenga dos o tres caracteres de longitud 
	// o que seal el nuevo dominio .info
	
	if ( !( (dominio.length == 2) || (dominio.length == 3) || (dominio == "info") ) ) return false;
	
	// Y que solo contenga caracteres del alfabeto ingles.
	
	if ( !(esAlfabetico(dominio)) )  return false;
		
 return true;   
 
}


// Indica si el nombre de fichero tiene extension de imagen JPEG

function esJPEG(fichero) {

    var posicion_punto = fichero.lastIndexOf('.');

    if ((fichero != '') &&
       ((fichero.substring(posicion_punto)=='.jpg') ||
       (fichero.substring(posicion_punto)=='.jpeg') ||
       (fichero.substring(posicion_punto)=='.JPG') ||
       (fichero.substring(posicion_punto)=='.JPEG')))
    {
        return true;
    }

	return false;

}


function nif_valido(campo)
{
abc=campo.value
nif=abc.substring(0,abc.length-1)
let=abc.charAt(abc.length-1)
if (!isNaN(let))
 {
  alert('El NIF debe tener 8 dígitos y una letra al final.')
  campo.focus()
  return false
 }
else
 {
  cadena="TRWAGMYFPDXBNJZSQVHLCKET"
  posicion = nif % 23
  letra = cadena.substring(posicion,posicion+1)
  if (letra!=let.toUpperCase())
   {
    alert("NIF incorrecto. Revise la letra y no deje espacios.")
    campo.focus()
    return false
   }
 }

return(true)

}

function trim (string){
	return string.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
} 

function str_replace(search, replace, subject) {
    // http://kevin.vanzonneveld.net
    // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: Gabriel Paderni
    // +   improved by: Philip Peterson
    // +   improved by: Simon Willison (http://simonwillison.net)
    // +    revised by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
    // +   bugfixed by: Anton Ongson
    // +      input by: Onno Marsman
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +    tweaked by: Onno Marsman
    // *     example 1: str_replace(' ', '.', 'Kevin van Zonneveld');
    // *     returns 1: 'Kevin.van.Zonneveld'
    // *     example 2: str_replace(['{name}', 'l'], ['hello', 'm'], '{name}, lars');
    // *     returns 2: 'hemmo, mars'
 
    var f = search, r = replace, s = subject;
    var ra = r instanceof Array, sa = s instanceof Array, f = [].concat(f), r = [].concat(r), i = (s = [].concat(s)).length;
 
    while (j = 0, i--) {
        if (s[i]) {
            while (s[i] = s[i].split(f[j]).join(ra ? r[j] || "" : r[0]), ++j in f){};
        }
    };
 
    return sa ? s : s[0];
}

// Recibe el 'id' del elemento HTML para proceder a la validación, si es correcta devuelve 'true' y sino saca un alert y devuelve 'false'
//Requiere del framework jQuery
function valida_nif_cif_nie(a) {
    var resul = true;
    var temp = trim(jQuery('#'+a).val()).toUpperCase();
    var cadenadni = "TRWAGMYFPDXBNJZSQVHLCKE";
    if (temp !== '') {
        //algoritmo para comprobacion de codigos tipo CIF
        suma = parseInt(temp[2]) + parseInt(temp[4]) + parseInt(temp[6]);
        for (i = 1; i < 8; i += 2) {
            temp1 = 2 * parseInt(temp[i]);
            temp1 += '';
            temp1 = temp1.substring(0,1);
            temp2 = 2 * parseInt(temp[i]);
            temp2 += '';
            temp2 = temp2.substring(1,2);
            if (temp2 == '') {
                temp2 = '0';
            }
            suma += (parseInt(temp1) + parseInt(temp2));
        }
        suma += '';
        n = 10 - parseInt(suma.substring(suma.length-1, suma.length));
        //si no tiene un formato valido devuelve error
        if ((!/^[A-Z]{1}[0-9]{7}[A-Z0-9]{1}$/.test(temp) && !/^[T]{1}[A-Z0-9]{8}$/.test(temp)) && !/^[0-9]{8}[A-Z]{1}$/.test(temp)) {
            if ((temp.length == 9) && (/^[0-9]{9}$/.test(temp))) {
                var posicion = temp.substring(8,0) % 23;
                var letra = cadenadni.charAt(posicion);
                var letradni = temp.charAt(8);
                //alert("La letra del NIF no es correcta. " + letradni + " es diferente a " + letra);
                alert("La letra del NIF no es correcta.");
                //jQuery('#'+a).val(temp.substr(0,8) + letra);
                resul = false;
            } else if (temp.length == 8) {
                if (/^[0-9]{1}/.test(temp)) {
                    var posicion = temp.substring(8,0) % 23;
                    var letra = cadenadni.charAt(posicion);
                    var tipo = 'NIF';
                } else if (/^[KLM]{1}/.test(temp)) {
                    var letra = String.fromCharCode(64 + n);
                    var tipo = 'NIF';
                } else if (/^[ABCDEFGHJNPQRSUVW]{1}/.test(temp)) {
                    var letra = String.fromCharCode(64 + n);
                    var tipo = 'CIF';
                } else if (/^[T]{1}/.test(temp)) {
                    var letra = String.fromCharCode(64 + n);
                    var tipo = 'NIE';
                } else if (/^[XYZ]{1}/.test(temp)) {
                    var pos = str_replace(['X', 'Y', 'Z'], ['0','1','2'], temp).substring(0, 8) % 23;
                    var letra = cadenadni.substring(pos, pos + 1);
                    var tipo = 'NIE';
                }
                if (letra !== '') {
					alert ("El CIF/NIF/NIE tiene que tener 9 caracteres");
                    //alert("Añadido la letra del " + tipo + ": " + letra);
                    //jQuery('#'+a).val(temp + letra);
                } else {
                    alert ("El CIF/NIF/NIE tiene que tener 9 caracteres");
                    jQuery('#'+a).val(temp);
                }
                resul = false;
            } else if (temp.length < 8) {
                alert ("El CIF/NIF/NIE tiene que tener 9 caracteres");
                jQuery('#'+a).val(temp);
                resul = false;
            } else {
                alert ("CIF/NIF/NIE incorrecto");
                jQuery('#'+a).val(temp);
                resul = false;
            }
        }
        //comprobacion de NIFs estandar
        else if (/^[0-9]{8}[A-Z]{1}$/.test(temp)) {
            var posicion = temp.substring(8,0) % 23;
            var letra = cadenadni.charAt(posicion);
            var letradni = temp.charAt(8);
            if (letra == letradni) {
                return 1;
            } else if (letra != letradni) {
                alert("La letra del NIF no es correcta.");
                /*alert("La letra del NIF no es correcta. " + letradni + " es diferente a " + letra);
                jQuery('#'+a).val(temp.substr(0,8) + letra);*/
                resul = false;
            } else {
                alert ("NIF incorrecto");
                jQuery('#'+a).val(temp);
                resul = false;
            }
        }
        //comprobacion de NIFs especiales (se calculan como CIFs)
        else if (/^[KLM]{1}/.test(temp)) {
            if (temp[8] == String.fromCharCode(64 + n)) {
                return 1;
            } else if (temp[8] != String.fromCharCode(64 + n)) {
				alert("La letra del NIF no es correcta.");
                /*alert("La letra del NIF no es correcta. " + temp[8] + " es diferente a " + String.fromCharCode(64 + n));
                jQuery('#'+a).val(temp.substr(0,8) + String.fromCharCode(64 + n));*/
                resul = false;
            } else {
                alert ("NIF incorrecto");
                jQuery('#'+a).val(temp);
                resul = false;
            }
        }
        //comprobacion de CIFs
        else if (/^[ABCDEFGHJNPQRSUVW]{1}/.test(temp)) {
            var temp_n = n + '';
            if (temp[8] == String.fromCharCode(64 + n) || temp[8] == parseInt(temp_n.substring(temp_n.length-1, temp_n.length))) {
                return 2;
            } else if (temp[8] != String.fromCharCode(64 + n)) {
                alert("La letra del CIF no es correcta.");
                /*alert("La letra del CIF no es correcta. " + temp[8] + " es diferente a " + String.fromCharCode(64 + n));
                jQuery('#'+a).val(temp.substr(0,8) + String.fromCharCode(64 + n));*/
                resul = false;
            } else if (temp[8] != parseInt(temp_n.substring(temp_n.length-1, temp_n.length))) {
                alert("La letra del CIF no es correcta.");
                /*alert("La letra del CIF no es correcta. " + temp[8] + " es diferente a " + parseInt(temp_n.substring(temp_n.length-1, temp_n.length)));
                jQuery('#'+a).val(temp.substr(0,8) + parseInt(temp_n.substring(temp_n.length-1, temp_n.length)));*/
                resul = false;
            } else {
                alert ("CIF incorrecto");
                jQuery('#'+a).val(temp);
                resul = false;
            }
        }
        //comprobacion de NIEs
        //T
        else if (/^[T]{1}/.test(temp)) {
            if (temp[8] == /^[T]{1}[A-Z0-9]{8}$/.test(temp)) {
                return 3;
            } else if (temp[8] != /^[T]{1}[A-Z0-9]{8}$/.test(temp)) {
                var letra = String.fromCharCode(64 + n);
                var letranie = temp.charAt(8);
                if (letra != letranie) {
                    alert("La letra del NIE no es correcta.");
                    /*alert("La letra del NIE no es correcta. " + letranie + " es diferente a " + letra);
                    jQuery('#'+a).val(temp.substr(0,8) + letra);*/
                    resul = false;
                } else {
                    alert ("NIE incorrecto");
                    jQuery('#'+a).val(temp);
                    resul = false;
                }
            }
        }
        //XYZ
        else if (/^[XYZ]{1}/.test(temp)) {
            var pos = str_replace(['X', 'Y', 'Z'], ['0','1','2'], temp).substring(0, 8) % 23;
            var letra = cadenadni.substring(pos, pos + 1);
            var letranie = temp.charAt(8);
            if (letranie == letra) {
                return 3;
            } else if (letranie != letra) {
                alert("La letra del NIE no es correcta.");
                /*alert("La letra del NIE no es correcta. " + letranie + " es diferente a " + letra);
                jQuery('#'+a).val(temp.substr(0,8) + letra);*/
                resul = false;
            } else {
                alert ("NIE incorrecto");
                jQuery('#'+a).val(temp);
                resul = false;
            }
        }
    }else{
		alert ("Debe rellenar el NIF/NIE");
        resul = false;
	}
    if (!resul) {      
        jQuery('#'+a).focus();
        return resul;
    }
}

//funcion para evitar que la fecha de fin del curso sea menor a la de inicio
function fecha_menor(form){
	var mydate1 = form.fecha_inicio.value;  // recogemos la fecha de inicio
	mydate1 = mydate1.split("-");			// la dividimos en tres partes

	var anyo1 = mydate1[2];
	var mes1 = mydate1[1]-1;
	var dia1 = mydate1[0];

	var fecha_ini = Date.parse(mes1+"/"+dia1+"/"+anyo1); 	//  la del form y la pasamos a UNIX

	var mydate2 = form.fecha_fin.value;		// hacemos lo mismo con la 
	mydate2 = mydate2.split("-");			// fecha finalizacion del curso

	var anyo2 = mydate2[2];
	var mes2 = mydate2[1]-1;
	var dia2 = mydate2[0];

	var fecha_fn = Date.parse(mes2+"/"+dia2+"/"+anyo2);	// una vez las fechas en Unix hacemos la comparacion

	if (fecha_ini>fecha_fn){
		alert ("La fecha de finalización no puede ser menor a la de inicio");
		return false;
	}
	
	return true;
}
