function valida_nif_cif_nie(a) {
	var temp=a.toUpperCase();
	var cadenadni='TRWAGMYFPDXBNJZSQVHLCKE';
	
	if (temp!==''){
		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.charAt(2))+parseInt(a.charAt(4))+parseInt(a.charAt(6));

		for (i = 1; i < 8; i += 2) {
			temp1 = 2 * parseInt(a.charAt(i));
			temp1 += '';
			temp1 = temp1.substring(0,1);
			temp2 = 2 * parseInt(a.charAt(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.charAt(8) == String.fromCharCode(64 + n)) {
				return 1;
			} else {
				return -1;
			}
		}
		//comprobacion de CIFs
		if (/^[ABCDEFGHJNPQRSUVW]{1}/.test(temp)) {
			temp = n + '';
			if (a.charAt(8) == String.fromCharCode(64 + n) || a.charAt(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.charAt(8) == /^[T]{1}[A-Z0-9]{8}$/.test(temp)) {
				return 3;
			} else {
				return -3;
			}
		}
	
		//XYZ
		if (/^[XYZ]{1}/.test(temp)) {
		
			temp = temp.replace('X','0')
			temp = temp.replace('Y','1')
			temp = temp.replace('Z','2')
			pos = temp.substring(0, 8) % 23;
			
			if (a.charAt(8) == cadenadni.substring(pos, pos + 1)) {
				return 3;
			} else {
				return -3;
			}
		}
	}
	return 0;
}
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 compruebaIdentificacion (type,str) {
	switch(type) {
		case 'cif':
			if(valida_nif_cif_nie(str) != 2) {
				//alert("false");
				return false;
			} else {
				//alert("true");
				return true;
			}
		break;
		case 'nif-nie':
			//alert(valida_nif_cif_nie(str));
			if((valida_nif_cif_nie(str) != 1) && (valida_nif_cif_nie(str) != 3)) {
				//alert("false");
				return false;
			} else {
				//alert("true");
				return true;
			}
		break;
		case 'both':
			if(valida_nif_cif_nie(str) <= 0) {
				//alert("false");
				return false;
			} else {
				//alert("true");
				return true;
			}
		break;
	}
}
