// JMPG01012 © 2003
/*
	Contiene las siguientes funciones:
	trim()
	acorta(num)
	validaCc(numcc)
	letra_dni(DNI)
	compruebaLetraDNI()
	compruebaDNI(num,letra)
	validaCIF(_cif)
	esCorreoE(valor)
	validaCP(_cp)
	validaTelefono(_ntel)
	validaSegSoc(_ss)
	validaFecha(_fecha,_tipo) // Tipos: 1.INT: aaaa/mm/dd; 2.ESP trad: dd/mm/aaaa; 3.ING trad: mm/dd/aaaa; 4.INT corto: aa/mm/dd; 5.ESP corto: dd/mm/aa; 6.ING corto: mm/dd/aa
	comparaFechas(_fecha1,_fecha2)
	validaNumero(_num)
	validaPorcentaje(_num)
	longMaxCadena(_campo,_objForm)
	validaIP(_ip)
*/

/* Tomados de Macromedia
	MM_FindObj
	MM_ValidateForm
*/	

// *********************** FUNCIONES COMUNES ****************************************************************
String.prototype.trim = function() {	// Elimina los espacios al principio y al final de la cadena
    return this.replace(/(^\s*)|(\s*$)/g, "");
}

function acorta(num) { // JMPG01012 © 2003
	// Elimina los caracteres no numéricos y los espacios en blanco
	num=""+num;
	if (!num) return "";
	num.trim();
	var numero="";
	for (i=0; i<num.length; i++){
		car=num.charAt(i);
		if ("0123456789".indexOf(car) != -1) numero+=car;
	}
	return numero
}

function sinRaros(_cad) { // JMPG01012 © 2003
	// Deja sólo números y letras
	pat = /[^A-Za-z0-9]/g;
	_cad=_cad.replace(pat, "");
	return _cad
}

function cambiaSeparadorDec(_n){ // JMPG01012 © 2004
	if (_n!=0){
		var _separNum=new Array( "," , "'" , "·" );
		for (i=0; i<_separNum.length; i++)
			_n=_n.replace(_separNum[i],'.');
		if (!parseFloat(_n)) _n=false;
	}
	return _n
}

// *********************** VALIDACIÓN DE Nº DE C/c **********************************************************

function validaCc(numcc){// JMPG01012 © 2003
	// Cambiar estos dos valores si cambia la longitud de los identificadores de la c.c.
	longBanco=8;
	longCc=10;

	numcc=acorta(numcc);
	longCuenta=numcc.length;
	if (longCuenta!=longBanco+longCc+2) {
		alert('Longitud del número de cuenta errónea.');
		return false
	}

	if (numcc.substring(0,4)>3999) {
		alert('Número de cuenta bancaria erróneo.');
		return false
	}

	Pesos = new Array(6, 3, 7, 9, 10, 5, 8, 4, 2, 1);
	s1=0; s2=0;

	banco=numcc.substring(0,longBanco);
	cc=numcc.substring(longCuenta-longCc,longCuenta);

	for (i=0; i<longBanco; i++){
		s1+=Pesos[i]*banco.substring(longBanco-i-1,longBanco-i);
	}
	for (i=0; i<longCc; i++){
		s2+=Pesos[i]*cc.substring(longCc-i-1,longCc-i);
	}
	cod1=11-s1%11;
	cod1=(cod1>9) ? 1-cod1%10 : cod1;
	cod2=11-s2%11;
	cod2=(cod2>9) ? 1-cod2%10 : cod2;
	//alert(cod1+" "+cod2);

	r=( cod1==numcc.substring(longBanco,longBanco+1) && cod2==numcc.substring(longCuenta-longCc-1,longCuenta-longCc) )?true:false;
	if (!r) alert("Número de cuenta bancaria erróneo.");
	return r
}

// *********************** VALIDACIÓN DE LETRA DE NIF **********************************************************
/* 
Los dos primeros dígitos indican la provincia donde se hizo el registro:
- 16 y 44: Álava
- 15 y 72: Guipúzcoa
- 12, 30 y 78: Vizcaya
- 07: Cáceres

La letra inicial indica:
- K: españoles menores de catorce años y extranjeros menores de dieciocho.
- L: españoles mayores de catorce años que residan en el extranjero y que se trasladen por tiempo inferior a seis meses a España.
- M: extranjeros mayores de dieciocho años.

Los anteriores han quedado obsoletos. Ahora sólo se usa:
- X: ciudadano extranjero.
*/
// JMPG01012 © 2003
var letra_dnif;
var abc = new String("TRWAGMYFPDXBNJZSQVHLCKE");
function letra_dni(DNI){ // Devuelve la letra correspondiente a un número dado
	if (DNI!=""){
		letra_dnif = abc.charAt(DNI % 23);}
	return letra_dnif;
}

function compruebaLetraDNI() { // Comprueba que la letra dada y la obtenida coincidan
	var letraM = new String(document.forms[0].letra.value.toUpperCase());
	if (letra_dni(document.forms[0].numero.value)!=letraM)
		alert("Carnet falso.")
	else alert("Carnet correcto.");
	alert(letra_dnif);
	document.forms[0].reset();
}

function compruebaDNI(num,letra) { // Verifica la exactitud del DNI
	var letraS = letra.toUpperCase();
	var numS = acorta(num);
	var cad="";
	if (letraS!="" && numS!="")
		if (abc.charAt(numS % 23)!=letraS) {
			cad="Número o letra del DNI incorrectos.";
			r=false;
		}
		else
			r=true;
	else {
		cad="Por favor, rellene los campos referentes al DNI.";
		r=false;
	}
	if (cad!="") alert(cad);
	return r;
}


// *********************** VALIDACIÓN DEL CIF *************************************************************
/*
1. Claves de formas jurídicas y clases de entidades:
	A. Sociedades anónimas.
	B. Sociedades de responsabilidad limitada.
	C. Sociedades colectivas.
	D. Sociedades comanditarias.
	E. Comunidades de bienes.
	F. Sociedades cooperativas.
	G. Asociaciones y otros tipos no definidos.
	H. Comunidades de propietarios en régimen de propiedad horizontal.
	N. Entidades no residentes.
	P. Corporaciones locales.
	Q. Organismos autónomos estatales o no, y asimilados, y congregaciones e instituciones religiosas.
	S. Órganos de la Administración del Estado y Comunidades Autónomas.

2. Claves de provincias:
	01. álava.
	02. Albacete.
	03, 53 y 54 Alicante.
	04. Almería.
	05. Ávila.
	06. Badajoz.
	07 Y 57 Illes Balears.
	08, 58, 59, 60, 61, 62, 63 y 64 Barcelona.
	09. Burgos.
	10. Cáceres.
	11 Y 72 Cádiz.
	12. Castellón.
	13. Ciudad Real.
	14 Y 56 Córdoba.
	15 Y 70 A Coruña.
	16. Cuenca.
	17 Y 55 Girona.
	18. Granada.
	19. Guadalajara.
	20 Y 71 Guipúzcoa.
	21. Huelva.
	22. Huesca.
	23. Jaén.
	24. León.
	25. Lleida.
	26. La Rioja.
	27. Lugo.
	28, 78, 79, 80, 81, 82, 83 y 84 Madrid.
	29, 92 y 93 Málaga.
	30. Y 73 Murcia.
	31. Navarra.
	32. Ourense.
	33. Y 74 Oviedo.
	34. Palencia.
	35 Y 76 Las Palmas.
	36 Y 94 Pontevedra.
	37. Salamanca.
	38 Y 75 Santa Cruz de Tenerife.
	39. Cantabria.
	40. Segovia.
	41 Y 91 Sevilla.
	42. Soria.
	43 Y 77 Tarragona.
	44. Teruel.
	45. Toledo.
	46, 96, 97 y 98 Valencia.
	47. Valladolid.
	48 Y 95 Vizcaya.
	49. Zamora.
	50 Y 99 Zaragoza.
	51. Ceuta.
	52. Melilla.

El primer carácter indica el tipo de entidad. Los dos dígitos siguientes (o 3 si es extranjera) indican el territorio de expedición. EL último dígito es de control. El resto son secuenciales.
*/
function validaCIF(_cif){	// JMPG01012 @ 2003
	tipo=new Array();
	tipo["A"]="Sociedad anónima";
	tipo["B"]="Sociedad de responsabilidad limitada";
	tipo["C"]="Sociedad colectiva";
	tipo["D"]="Sociedad comanditaria";
	tipo["E"]="Comunidads de bienes";
	tipo["F"]="Sociedad cooperativa";
	tipo["G"]="Asociación u otro tipo no definido";
	tipo["H"]="Comunidad de propietarios";
	tipo["N"]="Entidad no residente";
	tipo["P"]="Corporación local";
	tipo["Q"]="Organismo autónomo, asimilado o institución religiosa";
	tipo["S"]="Órgano de la administración";

	_cif=sinRaros(_cif);

	if (_cif.length!=9) {  // Verifica la longitud
		alert("EL CIF es erróneo.");
		return false
	}
	L1_cif=_cif.charAt(0).toUpperCase();	//	Coge el primer y el último carácter
	L9_cif=_cif.charAt(8).toUpperCase();	// 	Por si es una letra

	if (!tipo[L1_cif]) {
		alert("EL CIF es erróneo.");
		return false
	}
	L2_8_cif=_cif.substring(1,8);	// Toma los 7 caracteres del medio y comprueba que sean 7 cifras
	L2_8_cif=acorta(L2_8_cif);

	// Algoritmo de verificación
	suma=0;
	for (i=1; i<8; i+=2){
		suma+= (L2_8_cif.charAt(i-1) != 9) ? 2*parseInt(L2_8_cif.charAt(i-1))%9 : 9; // Suma de los dígitos de la multiplicación
		if (i<7) suma+=parseInt(L2_8_cif.charAt(i));
	}
	r=10-suma%10;	// Dará un valor entre 1 y 10
	if (L1_cif=="P" || L1_cif=="Q" || L1_cif=="S") r=String.fromCharCode(64+r); // 65 es la 'A', 75 es la 'K'
	if (r==10) r=0;

	r=(r==L9_cif)?true:false;
	if (!r) alert("El CIF de "+tipo[L1_cif]+" con valor "+_cif+" es erróneo.");
	return r
}


// *********************** VALIDACIÓN DE DIRECCIÓN DE CORREO-E **********************************************
function esCorreoE(valor){ // JMPG01012 © 2005
	//var valor=document.forms[0].correoe.value; // puede ir como parámetro
	valor=valor.toLowerCase();
	var reCorreo1 =/^[a-z0-9$%][\w\.\-\_\$%]*[a-z0-9$%]\@[a-z0-9][\w\.\-]+\.[a-z0-9]{2,6}$/;
	var reCorreo2 = /[\.\-$%][\.\-$%]/;
	if (valor.substring(valor.length-3,valor.length)=='.es'){ // Cuando esté habilitado habrá que añadir: áéíóúüñ
		reCorreo1 =/^[a-z0-9][a-z0-9\.\-\_]*[a-z0-9]\@[a-z0-9][a-z0-9\.\-]{0,61}[a-z0-9]\.es$/;
		reCorreo2 = /^[a-z0-9][a-z0-9\.\-]*[a-z0-9]\@xn--.*\.es/;
	}
		
	if (typeof(idioma)=="undefined") idioma="cast";
	switch(idioma){ // Variable global de JavaScript definida en cada página
		case "ingl": 
			cadError='E-mail address incorrect!\nPlease, fill the email with abc@xyz.ext pattern'; break;
		case "fran":
			cadError='L\'adresse poste-E n\'est pas correcte!\nS\'il vous pla&icirc;t, remplissez votre poste-E de la forme abc@xyz.ext'; break;
		/*case "ital": 
			cadError=' \n abc@xyz.ext'; break;
		case "alem": 
			cadError=' \n abc@xyz.ext'; break;*/
		case "eusk": 
			cadError='E-posta helbidea ez da zuzena!\nMesedez, bete ezazu zure e-posta abc@xyz.exte eran'; break;
		default: 
			cadError='¡Dirección de Correo-E errónea!\nPor favor rellene su correo-e de la forma abc@xyz.ext'; break;
	}
	if ((!reCorreo1.test(valor)) || (reCorreo2.test(valor))){
		alert (cadError);
		return false
	}
	return true
}

// *********************** VALIDACIÓN DE DIRECCIÓN URL **********************************************
function validaURL(_url,_http){ // JMPG01012 © 2005
	// Si _http=1 obligamos a introducir: http:// o https://
	_url=_url.toLowerCase();
	var reUrl =  (_http) ? /^[https?:\/\/]?([0-9a-z.-]+\.)+[a-z]{2,6}([0-9a-z~\/.-]+)*$/ : /^([0-9a-z.-]+\.)+[a-z]{2,6}([0-9a-z~\/.-]+)*$/;
	if ( !reUrl.test(_url) ){
		var _cTemp=(_http) ? "http(s)://" : "" ;
		alert ("¡Dirección URL errónea! Por favor rellene su dirección de internet de la forma "+_cTemp+"abc.xyz.ext");
		return false
	}
	return true
}

// *********************** VALIDACIÓN DE CÓDIGO POSTAL **********************************************
// JMPG01012 © 2003
function validaCP(_cp){ // Para España
	_cp=acorta(_cp);
	_r=(_cp<"01001" || _cp>"52999" || _cp.length!=5)?false:true;
	if (!_r) alert("Código postal erróneo.");
	return _r
}

// *********************** VALIDACIÓN DE NÚMEROS DE CELULAR, FAX Y TELÉFONO ************************************
/*	Celulares:
	Telefónica Movistar:	606,609,616,618,619,620,626,628,629,630,636,639,646,649,650,659,660,669,676,679,680,686,689,690,696,699
	Telefónica Moviline:	608,689
	Vodafone-Airtel:		600,607,610,617,627,637,647,661,662,666,667,670,677,678,687,697
	Amena-Auna-Euskaltel:	605,615,625,635,645,651,652,653,654,655,656,657,658,665
	Dolphin Telecom:		601
	Xfera:					622
*/
// JMPG01012 © 2003
function validaTelefono(_ntel,_pais){ // _pais=34 para España
	if (!_pais) _pais='';
	_ntfno=_ntel;
	_ntel=1*acorta(_ntel);
	if (_pais==34)
		_r=((_ntel>599999999 && _ntel<700000000) || (_ntel>799999999 && _ntel<=999999999))?true:false;
	else
		_r=((_ntel>9999999 && _ntel<=999999999999999))?true:false;	
	if (!_r) alert(_ntfno+" es un número teléfonico erróneo.");
	return _r
}

// *********************** VALIDACIÓN DE NÚMEROS DE LA SEGURIDAD SOCIAL ************************************
// JMPG01012 © 2003
/*
Los dos primeros dígitos indican la provincia y los dos últimos son los de control
*/
function validaSegSoc(_ss){ // Para España
	_ss=acorta(_ss);
	ini=_ss.substring(0,2);
	num=1*(ini+""+1*_ss.substring(2,_ss.length-2)); // Si tras ini empieza en cero, no se tendrá en cuenta
	//num=_ss.substring(2,_ss.length-2);
	//num=1*(ini+( (num.substring(0,1)=="0")?num.substring(1,num.length):num ));alert(num);
	fin=1*_ss.substring(_ss.length-2,_ss.length);
	//alert(num);

	if (num<11000000 || ini<"01" || ini>"52" || _ss.length<11 || _ss.length>12 || num%97!=fin) {
		alert("Número de la Seguridad Social erróneo.");
		return false
	} else return true
	
}

// *********************** VALIDACIÓN DE FECHAS SEGÚN PARÁMETROS ************************************
// JMPG01012 © 2004
/*
No importa el carácter separador
Tipos: 1.INT: aaaa/mm/dd; 2.ESP trad: dd/mm/aaaa; 3.ING trad: mm/dd/aaaa; 4.INT corto: aa/mm/dd; 5.ESP corto: dd/mm/aa; 6.ING corto: mm/dd/aa;
*/
function validaFecha(_fecha,_tipo){
	_f=_fecha; _r=true;
	if (_fecha.length!=10) 
		_r=false;
	else {
		_fecha=acorta(_fecha);
		if ( ((_fecha.length!=6 && _fecha.length!=8) || _tipo<1 || _tipo>5) || ((_fecha.length==8 && _tipo>3) || (_fecha.length==6 && _tipo<4)) )
			_r=false;
		else {
			meses=Array(31,28,31,30,31,30,31,31,30,31,30,31);
			_la=(_tipo<4)?4:2;	// Longitud de la cadena del año
			if (_tipo==1 || _tipo==4){
				anyo=_fecha.substr(0,_la);
				mes=_fecha.substr(4,2);
				dia=_fecha.substr(6,2);
			} else {
				if (_tipo==2 || _tipo==5){
					anyo=_fecha.substr(4,_la);
					mes=_fecha.substr(2,2);
					dia=_fecha.substr(0,2);
				} else {
					anyo=_fecha.substr(4,_la);
					mes=_fecha.substr(0,2);
					dia=_fecha.substr(2,2);
				}
			}
			
			if ((anyo%4==0 && anyo%100!=0) || (anyo%100==0 && anyo%400==0)) meses[1]=29; // Bisiesto
			_r = _r && ( (anyo<1000 || anyo>9999 || mes<1 || mes>12 || dia<1 || dia>meses[1*mes-1])?false:true );
		}
	}
	
	if (!_r) alert('La fecha '+_f+' es errónea o su formato es incorrecto.');
	return _r
}

// JMPG01012 © 2004
/*
Comprueba si _fecha2>_fecha1, según los tipos anteriores
No importa el carácter separador
Tipos: 1.INT: aaaa/mm/dd; 2.ESP trad: dd/mm/aaaa; 3.ING trad: mm/dd/aaaa; 4.INT corto: aa/mm/dd; 5.ESP corto: dd/mm/aa; 6.ING corto: mm/dd/aa;
Modo: 0.No compara posterioridad al día de hoy. 1.Compara posterioridad al día de hoy.
*/
function comparaFechas(_fecha1,_fecha2,_tipo,_modo){
	__f1=_fecha1; __f2=_fecha2;
	if (_modo!=1) _modo=false;
	var _r=true;
	var fec=new Date(),anho=1*fec.getFullYear(),mes=1+fec.getMonth(),dia=1*fec.getDate();
	_fecha1=acorta(_fecha1); if (!_fecha1) _fecha1=0;
	_fecha2=acorta(_fecha2);
	_la=(_tipo<4)?4:2;	// Longitud de la cadena del año

	switch(_tipo){
		case 2:
		case 5:
			if ( 1*_fecha2.substr(4,_la)>anho && _modo )
				_r=false;
			else
				if ( 1*_fecha2.substr(4,_la)==anho && 1*_fecha2.substr(2,2)>mes && _modo )
					_r=false;
				else
					_r=( 1*_fecha2.substr(4,_la)==anho && 1*_fecha2.substr(2,2)==mes && 1*_fecha2.substr(0,2)>dia && _modo ) ? false : true;
			_fecha1=_fecha1.substr(4,_la)+_fecha1.substr(2,2)+_fecha1.substr(0,2);
			_fecha2=_fecha2.substr(4,_la)+_fecha2.substr(2,2)+_fecha2.substr(0,2);
			/*_fecha1=_fecha1.substr(4,_la)+"-"+_fecha1.substr(2,2)+"-"+_fecha1.substr(0,2);
			_fecha2=_fecha2.substr(4,_la)+"-"+_fecha2.substr(2,2)+"-"+_fecha2.substr(0,2);
			alert(_fecha1+" "+_fecha2);*/
			break;
		case 3:
		case 6:
			if ( 1*_fecha2.substr(4,_la)>anho && _modo )
				_r=false;
			else
				if ( 1*_fecha2.substr(4,_la)==anho && 1*_fecha2.substr(0,2)>mes && _modo )
					_r=false;
				else
					_r=( 1*_fecha2.substr(4,_la)==anho && 1*_fecha2.substr(0,2)==mes && 1*_fecha2.substr(2,2)>dia && _modo ) ? false : true;
			
			_fecha1=_fecha1.substr(4,_la)+_fecha1.substr(0,2)+_fecha1.substr(2,2);
			_fecha2=_fecha2.substr(4,_la)+_fecha2.substr(0,2)+_fecha2.substr(2,2);
			/*_fecha1=_fecha1.substr(4,_la)+"-"+_fecha1.substr(0,2)+"-"+_fecha1.substr(2,2);
			_fecha2=_fecha2.substr(4,_la)+"-"+_fecha2.substr(0,2)+"-"+_fecha2.substr(2,2);*/
			break;
		default: 
			_r=true;
	}

	var _mens= (!_r) ? "Alguna de las fechas ("+__f1+", "+__f2+") es posterior al día de hoy." : ""; 
	if (_fecha1>_fecha2) {
		_mens+="\r\nLas fechas "+__f1+" y "+__f2+" no son consecutivas.";
		_r=false;
	}
	if (!_r) alert(_mens);
	return _r
}

// JMPG01012 © 2004
/*
Verificamos que la hora sea válida. Si el modo=1, comprobamos que haya metido decimales múltiplos de _m.
*/
function validaHoras(_h,_modo){
	var _m=0.25; 
	if (!_modo) _modo=1;
	_h=cambiaSeparadorDec(_h);
	_r=(_h>0.00 && _h<=24.00) && ( (_modo) ? (parseInt(_h/_m)==_h/_m) : true );
	if (!_r) {
		/*_mens=".0";
		for (i=1; i<1/_m; i++) _mens+=", "+Math.round(_m*i*100)/100;*/
		alert("El valor de las horas debe estar comprendido entre "+_m+" y 24.00.\r\nSólo son válidos los valores decimales en intervalos de "+_m+" h.");
	}
	return _r
}

// *********************** VALIDACIÓN DE NÚMEROS ************************************
// JMPG01012 © 2004
/*
Comprueba que el número solicitado se adecúe al formato de programación: -12345678.90123456
*/
function validaNumero(_num){
	var patron1 =/^-?[1-9]?[0-9]+\.?[0-9]*$/;	// Permitimos signos negativos en enteros y decimales
	var patron2 =/^-?0\.[0-9]+$/;	// Para valores de tipo: -0.123456789
	if ( !patron1.test(_num) && !patron2.test(_num)){
		alert('El número '+_num+' debe adecuarse al formato: -12345678.90123456');
		return false
	} else
		return true
}

/* 
Comprueba que el número se adecúe al formato: -12.34, con _longCif caracteres máximo. 
Si _positivo es uno sólo aceptará valores positivos 
*/
var valorCampo = "";
function validaPorcentaje(_num,_longCif,_positivo){
	var _r=true;
	if (!_longCif) _longCif=5;
	if (!_positivo) _positivo=0;
	
	// Comprobar el carácter separador.
	_num=cambiaSeparadorDec(_num);
	_mens=_num+": ";
	if ( !isNaN(_num) && _num!=null ){ // Comprobar longitud (_longCif ó menos caracteres: válido)
		if ( _num.length>_longCif ) {
			_mens+="\r\n- Tiene más de "+_longCif+" cifras.";
			_r=false;
		}
	
		if ( _num.indexOf('.')!=-1 && parseInt(_num.length)-parseInt(_num.indexOf('.'))>3 ) { // Comprobar que sólo hay dos decimales como máximo
			_mens+="\r\n- Tiene más de dos decimales.";
			_r=false;
		}
		
		if ( _num>100.00 ) {
			_mens+="\r\n- Es mayor de 100.";
			_r=false;
		}
		
		if ( _positivo==1 && _num<0 ) {
			_mens+="\r\n- No puede ser negativo.";
			_r=false;
		}
	} else {
		_mens+="\r\n- El formato del número debería ser '12.34'.";
		_r=false;
	}
	if (!_r) alert(_mens);
	valorCampo=_num;
	
	return _r
}

// *********************** VALIDACIÓN DE TEXTO ************************************
/* Comprueba que la longitud de la cadena introducida en el campo de texto sea menor que la indicada en el parámetro maxlength. 
Hay que pasar los valores de nombre del campo y formulario donde se encuentra.
No tiene mucho sentido para los campos que usan maxLength.
*/
function longMaxCadena(_campo,_objForm,_longMax){	// JMPG01012 © 2004
	if ( eval("_objForm."+_campo+".value")!="" ){
		long= (!_longMax) ? eval("_objForm."+_campo+".maxLength") : 1*_longMax; 
		if (isNaN(long)) long=Math.pow(2,31)-1; // Si no está definido, toma el máximo permitido: 2^31-1
		s=eval("_objForm."+_campo+".value.length<="+long);
		if (!s) alert("El campo "+_campo+" debe tener "+long+" caracteres como máximo.");
		return s
	} else 
		return false
}

// Comprueba que la ip esté entre 1.0.0.0 y 255.255.255.255
function validaIP(_ip) {	// JMPG01012 © 2004
	_ip=_ip.trim();
	var _r=true;
	var expreg = /^(\d{1,3}\.){3}\d{1,3}$/;
	if (expreg.test(_ip)) {	// Si pasa la prueba estará entre 0.0.0.0 y 299.299.299.299
		var partes = _ip.split(".");
		_ip="";
		if (!parseInt(parseFloat(partes[0]))) // Si el primer número es 0 o algo raro, no vale
			_r=false;
		else
			for (var i=0; i<partes.length; i++) {
				var t=parseInt(parseFloat(partes[i])); // Si el número es de tipo 0n de ser igualado a n
				if (t > 255) {	// Si algún valor es mayor que 255 no vale
					_r=false;
					break;
				}
				_ip+=t+".";
			}
	} else
		_r=false;

	if (_r) 
		_r=""+_ip.substring(0,_ip.length-1);
	else
		alert("La dirección IP introducida es incorrecta.");

	return _r;
}


// comprueba que un campo no contenga determinados caracteres
// opcionalmente puede comprobar si tiene una longitud determinada, dentro de unos límites mínimo y máximo
function comprobar_campo(campo,long_minima,long_maxima,tipoPatron){
 switch (tipoPatron)
 {
 	case 1:patron=/[<>&,;%*="'.]+/g; break;
	default: patron=/[<>&,;%*="'.]+/g; break;
 }
 var txt=campo;
 if (long_minima !=0 && long_maxima !=0){
 	return ( txt.length>long_minima && txt.length<long_maxima && !patron.test(txt));
 	}
 else{return (!patron.test(txt));}
}


// *********************** TOMADOS DE MACROMEDIA ************************ //

function MM_findObj(n, d) { //v4.01
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  if(!x && d.getElementById) x=d.getElementById(n); return x;
}

function MM_validateForm() { //v4.0 rev. JMPG01012 © 2005
	if (typeof(idioma)=="undefined") idioma="cast";
	switch(idioma){ // Variable global de JavaScript definida en cada página
		case "ingl": 
			cadError1=' must contain an e-mail address'; cadError2=' must contain a number'; cadError3a=' must contain a number between '; cadError3b=' and '; cadError3c=''; cadError4=' is required'; cadError5='The following error(s) occurred'; 
			cadErrorUP= ' no admite los caracteres \<\>\&\,\;\%\*\=\"\'';
			break;
		case "fran":
			cadError1=' doit contenir une adresse poste-E'; cadError2=' doit contenir un nombre'; cadError3a=' doit contenir un nombre entre '; cadError3b=' et '; cadError3c=''; cadError4=' est n&eacute;cessaire'; cadError5='Attention: il ya des erreurs'; 
			cadErrorUP= ' no admite los caracteres \<\>\&\,\;\%\*\=\"\'';
			break;
		case "eusk": 
			cadError1=' E-posta helbidea ez da zuzena'; cadError2=' zenbaki bat izan behar da'; cadError3a=' '; cadError3b=' (e)tik '; cadError3c=' (e)ra bitarteko zenbakia ez da izan behar'; cadError4=' beharrezkoa da'; cadError5='Ondorengo akatsak aurkitu dira'; 
			cadErrorUP= ' no admite los caracteres \<\>\&\,\;\%\*\=\"\'';
			break; 
		case "ital": 
			cadError1=' deve contenere un indirizzo e-mail'; cadError2=' deve contenere un numero'; cadError3a=' deve contenere un numero tra '; cadError3b=' e '; cadError3c=''; cadError4=' &egrave; un campo obbligatorio'; cadError5='Si sono verificati i seguenti errori'; 
			cadErrorUP= ' no admite los caracteres \<\>\&\,\;\%\*\=\"\'';
			break; 
		case "alem": 
			cadError1=' scheint keine g&uuml;ltige eMail-Adresse zu sein'; cadError2=' muss eine Zahl sein'; cadError3a=' muss eine Zahl zwischen '; cadError3b=' und '; cadError3c=' sein'; cadError4=' ist erforderlich'; cadError5='Folgende(r) Fehler bei der Eingabe'; 
			cadErrorUP= ' no admite los caracteres \<\>\&\,\;\%\*\=\"\'';
			break;
		default: 
			cadError1=' debe ser una dirección de correo-E'; cadError2=' debe ser un n&uacute;mero'; cadError3a=' debe ser un n&uacute;mero entre '; cadError3b=' y '; cadError3c=''; cadError4=' es obligatorio'; cadError5='Existen los siguientes errores'; 
			cadErrorUP= ' no admite los caracteres \<\>\&\,\;\%\*\=\"\'';
			break;
	}
	errores='';
	var i,p,q,nm,test,num,min,max,args=MM_validateForm.arguments;
	for (i=0; i<(args.length-2); i+=3) { test=args[i+2]; val=MM_findObj(args[i]);
		if (val) {
			nm=(document.getElementById(val.id).title) ? document.getElementById(val.id).title : ( (document.getElementById(val.id).alt) ? document.getElementById(val.id).alt : val.name ); // Comprobamos el texto a mostrar
			if ((val=val.value)!="") {
				if (test.indexOf('isEmail')!=-1) {
						if (!esCorreoE(val)) errores+='- '+nm+cadError1+'.\n';
				} else 
				if (test.indexOf('isUP')!=-1) {
						if (!comprobar_campo(val,0,0,1)) errores+='- '+nm+cadErrorUP+'.\n';
				} else									
					if (test!='R') { 
						num = parseFloat(val);
						if (isNaN(val)) errores+='- '+nm+cadError2+'.\n';
						if (test.indexOf('inRange') != -1) { 
							p=test.indexOf(':');
							min=test.substring(8,p); max=test.substring(p+1);
							if (num<min || max<num) errores+='- '+nm+cadError3a+min+cadError3b+max+cadError3c+'.\n';
						} 
					} 
			} else 
				if (test.charAt(0) == 'R') errores += '- '+nm+cadError4+'.\n'; 
		}
	} if (errores) alert(cadError5+':\n'+errores);
	return document.MM_returnValue = (errores == '');
}