// 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
	// Toma una cadena y devuelve un número en coma flotante. Considera como punto decimal el último caracter no numérico.
	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 de DNI 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){ // Comnprueba si un NIF es correcto
	_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-zA-Z.-]+\.)+[a-zA-Z]{2,6}([0-9a-zA-Z~\/._-]+)*$/ : /^(([0-9a-zA-Z.-]+\.)+[a-zA-Z]{2,6})?(\/[0-9a-zA-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,_m){
	if (typeof(_m)=="undefined" || !_m) _m=0.25; 
	if (typeof(_modo)=="undefined" || !_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=1, 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))}

// Valida que sea un color RGB correcto
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 o igual 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 "port": 
		cadError1=" deve conter um endereço correio e. válido."; cadError2=" precisa ser um valor numérico"; cadError3a=" precisa ser um valor entre "; cadError3b=" e "; cadError3c=""; cadError4=" é obrigatório"; cadError5="Os seguintes erros ocorreram"; cadError6="Endereço de correio eletrônico erróneo!\nPor favor, preenche seu correio eletrônico da forma abc@xyz.ext"; break;
	case "chec": 
		cadError1=" musí být emailová adresa."; cadError2=" musí být un número"; cadError3a=" musí být un número entre "; cadError3b=" a "; cadError3c=""; cadError4=" je povinné(á/ý)"; cadError5="Vyskytly se tyto chyby"; cadError6="Neplatná emailová adresa!\nProsíme vyplnte svou emailovou adresu formou 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;
}

// Valida menús desplegables de formulario
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="";
// Valida formularios devolviendo mensajes de error según el tipo, obligatoriedad e idioma.
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){ // Si hay formularios...
		for (var k=fo.length-1; k>-1; k--){ // los recorremos todos, empezando por el último.
			var f=fo[k];
			var j=0;
			while( (fe=f.elements[j]) && fe.type=='hidden' && j<f.elements.length ) // Y recorremos todos sus elementos...
				j++;
			if (fe && fe.type!='hidden') { // hasta dar con el primer elemento no oculto...
				fe.focus(); // y le damos el foco.
				return true
			}
		}
	}
	return false
}

if (typeof('aE')!='function'){ // Si no se ha definido previamente
	function aE(_o,_e,_f,_u){ // Añade la función (_f) para ejecutar al cargar un objeto (_o) [sin el 'on' inicial] mediante un evento (_e)
		if (_o){
			if (typeof("_u")=="undefined" || !_u) _u=false;
			if (_o.addEventListener)
				return _o.addEventListener(_e,_f,_u);
			else if (_o.attachEvent)
				return _o.attachEvent("on"+_e,_f);
			else if (_o["on"+_e]){
				_o["on"+_e]=_f;
				return true;
			}
		}
		return false;
	}
}

aE(window,"load",enfoca);