// Valida un NIF o tarjeta de residencia
function validateNIF_NIE(dni, allowblank)
{
	if(dni.length == 9)
	{
		letras = "TRWAGMYFPDXBNJZSQVHLCKE";
		dni = dni.toUpperCase();
		num = (dni[0] == 'X' || dni[0] == 'Y') ? dni.substring(1,8) : dni.substring(0,8);
		letra = dni.substring(8,9);

		if((num*1 == num) && letras.indexOf(letra) != -1)
		{
			numcalc = num % 23;
			return letra == letras.substring(numcalc,numcalc+1); //letras[numcalc];
		}
		return false;
	}
	return (allowblank && dni.length == 0);
}
//Valida un CIF
function validateCIF(cif, allowblank)
{
	if(cif.length == 9)
	{
		var pares = 0;
		var impares = 0;
		var suma;
		var ultima;
		var unumero;
		var uletra = new Array("J", "A", "B", "C", "D", "E", "F", "G", "H", "I");
		var xxx;
		cif = cif.toUpperCase();
		var regular = new RegExp(/^[ABCDEFGHKLMNPQS]\d\d\d\d\d\d\d[0-9,A-J]$/g);
		if(regular.exec(cif))
		{
			ultima = cif.substr(8,1);
			for (var cont = 1 ; cont < 7 ; cont ++){
				xxx = (2 * parseInt(cif.substr(cont++,1))).toString() + "0";
				impares += parseInt(xxx.substr(0,1)) + parseInt(xxx.substr(1,1));
				pares += parseInt(cif.substr(cont,1));
			}
			xxx = (2 * parseInt(cif.substr(cont,1))).toString() + "0";
			impares += parseInt(xxx.substr(0,1)) + parseInt(xxx.substr(1,1));
			suma = (pares + impares).toString();
			unumero = parseInt(suma.substr(suma.length - 1, 1));
			unumero = (10 - unumero).toString();
			if(unumero == 10) unumero = 0;
		 	return (ultima == unumero) || (ultima == uletra[unumero]);
		}
		return false;
	}
	return (allowblank && cif.length == 0);
}
//Valida un CIF, NIF o NIE
function validateCIFNIFNIE(doc, allowblank)
{
	return validateCIF(doc, allowblank) || validateNIF_NIE(doc, allowblank);
}
//Valida (más o menos) un código postal
function validateCP(cp, allowblank)
{
	if(cp.length == 5)
	{
		if(isNaN(parseInt(cp)))
		{
			return false;
		}
		var codprov = cp.substr(0,2);
		return (codprov > 0 && codprov < 53);
	}
	return (allowblank && cp.length == 0);
}
//Valida una número de teléfono
function validatePhone(num, allowblank, extravalidchars)
{
	num = num.replace(' ', '');
	var len = num.length;
	if(len < 9 || len > 20)
		return len == 0 ? allowblank : false;

	if(num.indexOf('+') > 0)
		return false;

	var validChars = "+0123456789" + extravalidchars;
	for(var c=0; c<len; c++)
		if(validChars.indexOf(num.charAt(c)) < 0)
			return false;
	return true;
}
//Valida una hora en formato hh:mm ó h:mm
function validateHourStr(str)
{
	var hora;
	var separador;
	var minuto;
	switch(str.length)
	{
		case 4:
			hora = str.substring(0, 1);
			separador = str.substring(1,2);
			minuto = str.substring(2, 4);
			break;
		case 5:
			hora = str.substring(0, 2);
			separador = str.substring(2,3);
			minuto = str.substring(3, 5);
			break;
		default:
			return false;
	}
	if(separador != ":")
		return false;
	hora = parseInt(hora, 10);
	minuto = parseInt(minuto, 10);
	if(isNaN(hora) || isNaN(minuto))
		return false;

	return (hora >= 0 && hora <= 23 && minuto >= 0 && minuto <= 59);
}
//Valida una fecha en formato yyyy-mm-aa (el carácter separador puede ser cualquiera)
function validateDateStr(date, min_ano, max_ano)
{
	if(date.length != 10)
		return false;
	var ano = date.substring(0, 4);
	var mes = date.substring(5, 7);
	var dia = date.substring(8, 10);

	return validateDate(ano, mes, dia, min_ano, max_ano);
}
//Valida una fecha
function validateDate(ano, mes, dia, min_ano, max_ano)
{
	ano = parseInt(ano, 10);
	mes = parseInt(mes, 10);
	dia = parseInt(dia, 10);

	if(isNaN(ano) || isNaN(mes) || isNaN(dia) || dia < 1 || (min_ano != null && ano < min_ano) || (max_ano != null && ano > max_ano))
		return false;

	switch(mes)
	{
		case 1:
		case 3:
		case 5:
		case 7:
		case 8:
		case 10:
		case 12:
			return dia <= 31;
		case 4:
		case 6:
		case 9:
		case 11:
			return dia <= 30;
		case 2:
			return dia <= (esBisiesto(ano) ? 29 : 28);
		default:
			return false;
	}
}
//Dice si un año es bisiesto
function esBisiesto(ano)
{
	return ((ano%4)==0) && ((ano%100)!=0 || (ano%400)==0);
}
//Valida un email
function validateEmail(addr, allowblank)
{
	if(addr.length == 0)
		return allowblank;

	var invalidChars = '\/\'\\ ";:?!()[]\{\}^|';
	for(i=0; i<invalidChars.length; i++)
		if(addr.indexOf(invalidChars.charAt(i),0) > -1)
			return false;

	for(i=0; i<addr.length; i++)
		if(addr.charCodeAt(i)>127)
			return false;

	var atPos = addr.indexOf('@',0);
	if((atPos == -1)||(atPos == 0)||(addr.indexOf('@', atPos + 1) > - 1)||(addr.indexOf('.', atPos) == -1)||(addr.indexOf('@.',0) != -1)||(addr.indexOf('.@',0) != -1)||(addr.indexOf('..',0) != -1))
		return false;

	var suffix = addr.substring(addr.lastIndexOf('.')+1);
	if(suffix.length != 2 && suffix != 'cat' && suffix != 'com' && suffix != 'net' && suffix != 'org' && suffix != 'edu' && suffix != 'int' && suffix != 'mil' && suffix != 'gov' & suffix != 'arpa' && suffix != 'biz' && suffix != 'aero' && suffix != 'name' && suffix != 'coop' && suffix != 'info' && suffix != 'pro' && suffix != 'museum')
		return false;

	return true;
}
//Valida un nick o clave
function validateStringAsNickOrPass(str)
{
	var len = str.length;
	if(str == null || len < 4 || len > 14)
		return false;

	var validChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
	for(c=0; c<len; c++)
		if(validChars.indexOf(str.charAt(c),0) == -1)
			return false;

	return true;
}