// JMPG01012 © 2003
/*
	Contiene las siguientes funciones:
	trim()
	acorta(num)
	validaCc(numcc)
	validaEAN13(_ean)
	letra_dni(DNI)
	compruebaLetraDNI()
	compruebaDNI(num,letra)
	validaNIF(_nif)
	validaCIF(_cif)
	validaPasaporte(_pasap)
	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)
	dec2hex(dec)
	hex2dec(hex)
*/

/* 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
	return (_cad!="") ? _cad.replace( /[^A-Za-z0-9]/g, "") : true;
}
/*
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
}*/
function cambiaSeparadorDec(_n){ // JMPG01012 © 2006
	var _signo=(_n.substr(0,1)=='-')?1:0; // Recoge el signo del número
	_n=_n.replace(/([^0-9])([0-9])/g,".\$2"); // Sustituye todos los no números por puntos
	var p=_n.lastIndexOf('.');
	var _dec='';
	if (p<0)
		p=_n.length;
	else
		_dec=_n.substr(p); // Considera el último punto el separador de decimales
	var _ent=_n.substring(_signo,p); // Considera el resto de la cadena como el entero (sin signo)
	return ( (_signo)?'-':'' )+_ent.replace('.','')+_dec; // Concatena todo
}

// *********************** 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 CÓDIGO EAN 13 **********************************************************
function validaEAN13(_ean){	// JMPG01012 @ 2006
	_ean=sinRaros(_ean);

	if (_ean.length!=13) {  // Verifica la longitud
		alert("EL EAN13 es erróneo.");
		return false
	}
	L13_ean=acorta(_ean.charAt(13)); // Coge el último carácter y se asegura de que sea una cifra

	L0_11_ean=_ean.substring(0,11);	// Toma los caracteres del medio y comprueba que sean cifras
	L0_11_ean=acorta(L0_11_ean);
	
	if (L13_ean.length!=1 || L0_11_ean.length!=12){   // Verifica la longitud
		alert("EL EAN13 es erróneo.");
		return false
	}

	// Algoritmo de verificación
	suma=0;
	for (i=0; i<11; i+=2)
		suma+=3*parseInt(L0_11_ean.charAt(i))+parseInt(L0_11_ean.charAt(i+1)); // Suma de los dígitos de la multiplicación

	r=(10-suma%10)%10;	// Dará un valor entre 0 y 10

	r=(r==L13_ean)?true:false;
	if (!r) alert("El EAN13 con valor "+_ean+" es 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;
}

function validaNIF(_nif){
	_nif=sinRaros(_nif).toUpperCase(); // Ponemos en mayúsculas
	while (_nif.length<9) _nif="0"+_nif; // Completamos con 0 a la izda.
	var letra_1=_nif.substr(0,1); // Comprobamos si es extranjero o no
	if (ex=isNaN(letra_1)) _nif="0"+_nif.substr(1,9); // y si lo es sustituimos la 1ª letra por 0
	var num=_nif.substr(0,8); // Extraemos los números
	var letra_2=_nif.substr(8,9); // y la letra de control
	r=compruebaDNI(num,letra_2); // Comprobamos la validez
	return (r) ? r : ((ex)?letra_1+num.substr(1,9):num)+letra_2;
}

// *********************** 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 DEL NÚMERO DE PASAPORTE **********************************************
// Desde 2003 consta de 2 letras seguidas de seis números, aparentemente sin relación.
function validaPasaporte(_pasap){ // JMPG01012 © 2006
	var patron=/^([a-zA-Z]{2})([0-9]{6})$/; // /^([a-zA-Z]{2})\s?([0-9]{6})$/ 
	r=patron.test(_pasap);
	if (!r) alert("El número de pasaporte no es correcto.");
	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 ((!reCorreo1.test(valor)) | (reCorreo2.test(valor))){
		alert (cadError6); // Ver cadenas de error al final
		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=eval("/^" + ( (_http) ? "[https?:\/\/]?" : "" ) + '([0-9a-z.-]+\.)+[a-z]{2,6}([0-9a-z~\/.-]+)*$/');
	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(/carpeta)(/archivo.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 (typeof(_pais)=="undefined") _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
}

/* Funciones para pasar de decimal a hexadecimal y viceversa */
var digitosHex=new Array("0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F");
function dec2hex(dec){return(digitosHex[dec>>4]+digitosHex[dec&15])}
function hex2dec(hex){return(parseInt(hex,16))}

function validaRGB(rgb){
	var pat=/^[0-9A-Fa-f]{6}$/;
	if (!pat.test(rgb)){
		alert('El color debe estar en formato RGB hexadecimal (00-FF). Ej.: 01a4Fb');
		return false
	} else
		return true
}

function invierteColor(rgb) { // Toma el color en RGB hexadecimal y da su contraste.
	if ( p=rgb.indexOf("#")>0 ) rgb=rgb.substr(p);
	var i=-2,cad="";
	while ( s=rgb.substr(i+=2,2) ){
		t="0"+dec2hex( (0x7F+hex2dec(s))%0xFF );
		cad+=t.substr(t.length-2,t.length);
	}
	return "#"+cad.toUpperCase();
}

function invierte(cad){ // Invierte la cadena
	var t="",i=cad.length;
	while(i>-1){
		t+=cad.substring(i,i+1);
		i--;
	}
	return t;
}

// *********************** 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")!="" ){
		longi= (!_longMax) ? eval("_objForm."+_campo+".maxLength") : 1*_longMax; 
		if (isNaN(longi)) longi=Math.pow(2,31)-1; // Si no está definido, toma el máximo permitido: 2^31-1
		s=eval("_objForm."+_campo+".value.length<="+longi);
		if (!s) alert("El campo "+_campo+" debe tener "+longi+" 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;
}

// *********************** VALIDACIÓN DE OPCIONALES ************************ //
errores="";
// Establecemos las cadenas de errores según idioma
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"; cadError6="E-mail address incorrect!\nPlease, fill the email with abc@xyz.ext pattern"; 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écessaire"; cadError5="Attention: il ya des erreurs"; cadError6="L'adresse poste-E n'est pas correcte!\nS'il vous plaît, remplissez votre poste-E de la forme abc@xyz.ext"; 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"; cadError6="E-posta helbidea ez da zuzena!\nMesedez, bete ezazu zure e-posta abc@xyz.exte eran"; 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=" è un campo obbligatorio"; cadError5="Si sono verificati i seguenti errori"; cadError6="Indirizzo e-mail: abc@xyz.ext"; break; 
	case "alem": 
		cadError1=" scheint keine gü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"; cadError6="eMail-Adresse: abc@xyz.ext"; break;
	case "gall": 
		cadError1=" debe ser  un enderezo de correo-e"; cadError2=" must contain a number"; cadError3a=" must contain a number between "; cadError3b=" and "; cadError3c=""; cadError4=" é  obrigatorio"; cadError5="Existen os seguintes erros"; cadError6="¡Enderezo de  correo-E erróneo por favor cubra o seu correo-e da forma  abc@xyz.ext "; break;
	case "cata": 
		cadError1=" ha de ser una adreça de correu-e"; cadError2=" zenbaki bat izan behar da"; cadError3a=" "; cadError3b=" (e)tik "; cadError3c=" (e)ra bitarteko zenbakia ez da izan behar"; cadError4=" és obligatori"; cadError5="Existeixen els següents errors"; cadError6="Adreça de correu-e errònia si us plau ompliu el vostre correu-e de la forma abc@xyz.ext"; break; 
	default: 
		cadError1=" debe ser una dirección de correo-E"; cadError2=" debe ser un número"; cadError3a=" debe ser un número entre "; cadError3b=" y "; cadError3c=""; cadError4=" es obligatorio"; cadError5="Existen los siguientes errores"; cadError6="¡Dirección de Correo-E errónea!\nPor favor rellene su correo-e de la forma abc@xyz.ext"; break;
}

function validaDesplegable(nm){ // JMPG01012 © 2005
	if (typeof(errores)=="undefined") errores=""; // Si no se ha definido previamente la inicializamos
	var val=MM_findObj(nm);
	var elemID=document.getElementById(val.id);
	nm=(elemID.title) ? elemID.title : ( (elemID.alt) ? elemID.alt : val.name ); // Comprobamos el texto a mostrar
	errores += (val.selectedIndex>=0)?"":"- "+nm+cadError4+".\n";
	return (errores=="")
}
// Valida botones radio de formulario
function validaRadio(nm){ // JMPG01012 © 2005
	if (typeof(errores)=="undefined") errores=""; // Si no se ha definido previamente la inicializamos
	var val=document.getElementsByName(nm); // Busca el nombre de los botones
	/*var elemID=document.getElementById(val[0].id); // Toma el ID del primer botón
	nm=(elemID.title) ? elemID.title : ( (elemID.alt) ? elemID.alt : val[0].name ); // Comprobamos el texto a mostrar*/
	nm=(val[0].title) ? val[0].title : ( (val[0].alt) ? val[0].alt : val[0].name ); // Comprobamos el texto a mostrar
	var valor=false;
	for (var i=0; i<val.length; i++) valor|=val[i].checked;
	if (valor) {
		opcI=val[0].checked;	// Si está marcada alguna opción, recoge el valor del primer elemento en vble. global
		opcF=val[i-1].checked;	// Si está marcada alguna opción, recoge el valor del último elemento en vble. global
	}		
	errores+=(valor)?"":"- "+nm+cadError4+".\n";
	return (errores=="")
}
// *********************** 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;
}

document.MM_returnValue="";
function MM_validateForm() { //v4.0 rev. JMPG01012 © 2005
	if (typeof(errores)=="undefined") errores=""; // Si no se ha definido previamente la inicializamos
	var i,p,q,nm,test,num,min,max,args=MM_validateForm.arguments,elemID;
	for (i=0; i<(args.length-2); i+=3) { test=args[i+2]; var val=MM_findObj(args[i]);
		if (val) {
			elemID=document.getElementById(val.id);
			nm=(elemID && elemID.title) ? elemID.title : ( (elemID.alt) ? elemID.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!='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 == ""));
}


function enfoca(){ // Pone el cursor en el primer campo de texto empezando por el último formulario
	var fo=document.forms, fe="";
	if (fo){
		for (var k=fo.length-1; k>-1; k--){
			var f=fo[k];
			var j=0;
			while( (fe=f.elements[j]) && fe.type=='hidden' && j<f.elements.length )
				j++;
			if (fe.type!='hidden') {
				window.clearInterval(crono);
				crono=false;
				fe.focus();
				return true
			}
		}
	}
	window.clearInterval(crono);
	crono=false;
	return false
}
crono=window.setInterval("if (window.onload && crono) enfoca();",300);