// Enumeración de tipos de contenido de campos de texto.
var TC_ALFABETICO = 0;
var TC_ALFANUMERICO = 1;
var TC_SINTILDE = 2;
var TC_LOGIN = 3;
var TC_PRECIO = 4;
var TC_NUMERICO = 5;
var TC_EMAIL = 6;
var TC_TELEFONO = 7;
var TC_CODPOSTAL = 8;
var TC_FECHA = 9;
var TC_HORA = 10;

////////////////////////////////////////////////////////////////////////////////
// ----- Variables globales -----
////////////////////////////////////////////////////////////////////////////////

// Cada elemento de estos arrays corresponde a un tipo de contenido, así que se debe llenar siguiendo el mismo orden que en la definición de constantes.

// Conjuntos de caracteres válidos. A partir del índice 2 (TC_NUMERICO), los elementos son expresiones regulares.
var caractValidos = new Array( "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzƒŠŒšœŸÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþ'Çç-ºª. \t\r\n\f",
										 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzƒŠŒšœŸÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþ'Çç-ºª. \t\r\n\f",
										 "ABCDEFGHIJKLMNÑOPQRSTUVWXYZÇabcdefghijklmnñopqrstuvwxyzç.- \t\r\n\f",
										 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_.- \t\r\n\f",
										 "[+-]?[0-9]+(\.[0-9]+)?",
										 "^\\d+$",
										 "^\\w(\\.|-|\\w)*@\\w+((\\.|-)\\w+)*\\.\\w{2,3}$",
										 "^(((\\+\\d{2})?[689]\\d{8})|(\\+[0124-9]\\d{2,})|(\\+3[0-35-9]\\d+))$",
										 "^\\d{5}$",
										 "^(\\d+)(/|-)(\\d+)(/|-)(\\d{4})$",
										 "^(\\d+)(:)(\\d+)$");

// Mensajes indicativos de contenido válido.
var contValido = new Array( "sólo letras, otros caracteres especiales y espacios en blanco",
									 "sólo letras, otros caracteres especiales, dígitos y espacios en blanco",
									 "sólo letras, sin tilde",
									 "sólo dígitos y comas, sin espacios",
									 "sólo dígitos, sin espacios",
									 "una dirección de e-mail válida, sin espacios",
									 "una cadena de entre 2 y 25 caracteres, formada por letras minúsculas, dígitos, guiones ( - ), caracteres de subrayado ( _ ) o puntos ( . ), y cuyo primer carácter debe ser una letra minúscula o un dígito",
									 "un prefijo internacional comenzando con '+' (opcional para España) seguido de dígitos (sin espacios; en España, 9 dígitos, el primero de los cuales es un 6 o un 9)",
									 "cinco dígitos (00000 a 99999), sin espacios",
									 "datos del tipo día-mes-año, en dígitos (1 o 2 el día y el mes, 4 el año), separados por '/' o por '-' y sin espacios; por ejemplo, 1/5/2000 o 07-10-1998",
									 "datos del tipo hora:minutos:segundos, en dígitos separados por ':'" );


////////////////////////////////////////////////////////////////////////////////
// ----- Funciones auxiliares -----
////////////////////////////////////////////////////////////////////////////////

														// (Boolean) Indica si la cadena pasada como parámetro es válida según el tipo de contenido especificado.
function cadenaValida(cadena,tipoCont )	// Usa la variable global "caractValidos".
{
	if ( tipoCont <= TC_LOGIN ) {
		for ( var i = 0; i < cadena.length; ++i )
			if ( caractValidos[ tipoCont ].indexOf( cadena.charAt( i ) ) == -1 )
				return false;
		return true;
	} else if ( tipoCont == TC_FECHA ) {
		if ( ( new RegExp( caractValidos[ tipoCont ] ) ).exec( cadena ) != null ) {
			var diasDelMes = new Array( 31, bisiesto( RegExp.$5 ) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 );
			return RegExp.$2 == RegExp.$4 && RegExp.$3 >= 1 && RegExp.$3 <= 12 && RegExp.$1 >= 1 && RegExp.$1 <= diasDelMes[ RegExp.$3 - 1 ];
		} else
			return false;
	} else
		return ( new RegExp( caractValidos[ tipoCont ] ) ).test( cadena );
}


function sinContenido(cadena) 				// (Boolean) Indica si la cadena pasada como parámetro es vacía o sólo contiene espacios en blanco (tabuladores, etc.).
{
	return !( new RegExp( "\\S" ) ).test( cadena );
}


function bisiesto(a) 							// (Boolean) Indica si el año pasado como parámetro es bisiesto.
{
	return ( a % 4 == 0 ) && ( ( a % 100 != 0 ) || ( a % 400 == 0 ) );
}

////////////////////////////////////////////////////////////////////////////////
// ----- Métodos auxiliares -----
////////////////////////////////////////////////////////////////////////////////

function err_msg(msg)							// (Boolean) Muestra un cuadro de diálogo con un mensaje de error y devuelve el enfoque al elemento de formulario que ha invocado el método. Devuelve siempre "false". Debe asignarse a cada elemento del formulario.
{
	sw = 1;
	alert(msg);
	this.focus();
	return false;
}

  
var aLetter = new Array(23); 
aLetter[0] = "T";  aLetter[6] = "Y";  aLetter[12] = "N"; aLetter[18] = "H"; 
aLetter[1] = "R";  aLetter[7] = "F";  aLetter[13] = "J"; aLetter[19] = "L"; 
aLetter[2] = "W";  aLetter[8] = "P";  aLetter[14] = "Z"; aLetter[20] = "C"; 
aLetter[3] = "A";  aLetter[9] = "D";  aLetter[15] = "S"; aLetter[21] = "K"; 
aLetter[4] = "G";  aLetter[10] = "X"; aLetter[16] = "Q"; aLetter[22] = "E"; 
aLetter[5] = "M";  aLetter[11] = "B"; aLetter[17] = "V"; 


function validarNIF(nif) 
{
	var numero; 
	var letra; 
	var modulo; 
	if (nif.match("^[0-9]{8}[a-zA-Z]?")) {
		numero = nif.substr(0,8); 
		letra = nif.substr(8,1); 
		modulo = Number(numero) % 23; 
		letras = 0;
		for (var x=0; x<nif.length; x++) {
			var ch = nif.substring (i, x+1);
			if ((ch >= "a" && ch <= "z") || (ch >= "A" && ch <= "Z")) {
				letras++;
			}  
		}
		if (letras > 1)
			return false;
		if (aLetter[modulo].toUpperCase() == letra.toUpperCase())
			return true; 
		else 
			return false; 
	} else { 
		return false; 
	} 
}

function validarCIF(cif)
{
	// Pasos previos.
	if (cif == null)
		return false;
	cif = cif.toUpperCase();

	// Paso 1. Validación de la longitud: 9 caracteres
	if (cif.length != 9)
		return false;

	// Paso 2: Validación de tipo de carácter correcto.
	letrasComienzo1 = "ABCDEFGHN";
	letrasComienzo2 = "PQS";
	letrasFin = "JABCDEFGHI";
	numeros = "0123456789";

	caracter0 = cif.substring(0,1);
	caracter8 = cif.substring(8,9);

	terminaNumero = false;

	if (letrasComienzo1.indexOf(caracter0) != -1) {
// El CIF comienza por una letra para la que puede terminar
//por dígito o por letra.
		if (letrasFin.indexOf(caracter8) != -1)
			terminaNumero = false;
		else {
			if(numeros.indexOf(caracter8) != -1)
				terminaNumero = true;
			else
				return false;
		}
	} else {
		if (letrasComienzo2.indexOf(caracter0) != -1) {
// El CIF comienza por una letra para la que sólo puede terminar por letra.
			if (letrasFin.indexOf(caracter8) != -1)
				terminaNumero = false;
			else
				return false;
		} else
			return false;
	}

	for (i=1; i<=7; i++) {
		if (numeros.indexOf(cif.substring(i, i+1)) == -1)
			return false;   
	}

// Paso 3. Cálculo del dígito de control.
	R1 = (cif.substring(2,3)+0) + (cif.substring(4,5)+0) + (cif.substring(6,7)+0);
	R21 = 2 * cif.substring(1,2);
	if (R21 > 9)
		R21 = 1 + R21 % 10;
	R22 = 2 * cif.substring(3,4);
	if (R22 > 9)
		R22 = 1 + R22 % 10;
	R23 = 2 * cif.substring(5,6);
	if(R23 > 9)
		R23 = 1 + R23 % 10;
	R24 = 2 * cif.substring(7,8);
	if(R24 > 9)
		R24 = 1 + R24 % 10;
	DC = (10 - ((R1 + R21 + R22 + R23 + R24) % 10)) % 10;
		
	if (terminaNumero) {
		if (caracter8 == DC)
			return true;
		else
			return false;
	} else {
		if (caracter8.equals(letrasFin.substring(DC, DC+1)))
			return true;
		else
			return false;
	}
}

