
	// .: Validacion DNI/NIF :. //

	function JSA_NIFcleaner(v) {
		var permitidos='0123456789abcdefghijklmnopqrstuvwxyz';
		var cadena=v.value.toLowerCase();
		var i, n=cadena.length, ci;
		var limpio='';
		for(i=0;i<n;i++) {
			ci=cadena.charAt(i);
			if (permitidos.indexOf(ci)>-1)
				limpio+=ci;
		}

		v.value=limpio;

	}

	function JSA_checkNIF(v) {
		if (valida_nif_cif_nie(v.value)==1)
			return true;
		else
			return false;	
	}
	 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];
	}

	//Retorna: 1 = NIF ok, 2 = CIF ok, 3 = NIE ok, -1 = NIF error, -2 = CIF error, -3 = NIE error, 0 = ??? error
	function valida_nif_cif_nie(a) 
	{
		var temp=a.toUpperCase();
		var cadenadni="TRWAGMYFPDXBNJZSQVHLCKE";
	 
		if (temp!==''){
			//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))
			{
				return 0;
			}
	 
			//comprobacion de NIFs estandar
			if (/^[0-9]{8}[A-Z]{1}$/.test(temp))
			{
				posicion = a.substring(8,0) % 23;
				letra = cadenadni.charAt(posicion);
				var letradni=temp.charAt(8);
				if (letra == letradni)
				{
					 	return 1;
				}
				else
				{
					return -1;
				}
			}
	 
			//algoritmo para comprobacion de codigos tipo CIF
			suma = parseInt(a[2])+parseInt(a[4])+parseInt(a[6]);
			for (i = 1; i < 8; i += 2)
			{
				temp1 = 2 * parseInt(a[i]);
				temp1 += '';
				temp1 = temp1.substring(0,1);
				temp2 = 2 * parseInt(a[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));
	 
			//comprobacion de NIFs especiales (se calculan como CIFs)
			if (/^[KLM]{1}/.test(temp))
			{
				if (a[8] == String.fromCharCode(64 + n))
				{
					return 1;
				}
				else
				{
					return -1;
				}
			}
	 
			//comprobacion de CIFs
			if (/^[ABCDEFGHJNPQRSUVW]{1}/.test(temp))
			{
				temp = n + '';
				if (a[8] == String.fromCharCode(64 + n) || a[8] == parseInt(temp.substring(temp.length-1, temp.length)))
				{
					return 2;
				}
				else
				{
					return -2;
				}
			}
	 
			//comprobacion de NIEs
			//T
			if (/^[T]{1}/.test(temp))
			{
				if (a[8] == /^[T]{1}[A-Z0-9]{8}$/.test(temp))
				{
					return 3;
				}
				else
				{
					return -3;
				}
			}
	 
			//XYZ
			if (/^[XYZ]{1}/.test(temp))
			{
				pos = str_replace(['X', 'Y', 'Z'], ['0','1','2'], temp).substring(0, 8) % 23;
				if (a[8] == cadenadni.substring(pos, pos + 1))
				{
					return 3;
				}
				else
				{
					return -3;
				}
			}
		}
	 
		return 0;
	}
	


