//<![CDATA[

/****************************************************************************
* funciones.js		                                   	                    *
*                                                                           *
* Funciones varias															*
*                                                                           *
****************************************************************************/


	// **************************************************************************************
	// extensionesIncorrectas(fichero,$array_extensiones) 
	// pasado un fichero y un array de extensiones correctas averiguamos si la extensión de ese fichero está dentro del array y devolvemos un booleano.
	// Autor: JR 30/09/07					
	// Ultima modificacion: 15/05/08 (Dani-Pymematica) 
	// **************************************************************************************
		function extensionesIncorrectas(fichero,Array_extensiones_correctas)
		{
			var incorrecto = true;	
			var extension="";
			
			for (i=0; i<Array_extensiones_correctas.length; i++)
			{
				extension = fichero.substring(fichero.length-Array_extensiones_correctas[i].length,fichero.length);	
				if (extension.toLowerCase() == Array_extensiones_correctas[i].toLowerCase())
				{
					incorrecto = false;	
				}
			}

			return incorrecto;
		}
	// FIN extensionesIncorrectas ***********************************************************
	
	// **************************************************************************************
	// camposVacios(capas,mensajes) 
	// 		comprobamos si los campos de un formulario están vacios y mostramos el error en la capa correspondiente.
	//		capas = listado separado por comas de las distitnas capas de error
	//		campos = campos a comprobar
	//		capa_error = div o capa donde se mostrara el mensaje de error
	// Autor: JR 04/10/07					
	// Ultima modificacion: 26/05/08 (JR) 
	// **************************************************************************************
		function camposVacios(capas, campos, capa_error)
		{
			var array_campos = campos.split(",");
			var error = false;
			var valores = "";
			var capas_error = "";
			var array_capas = capas.split(",")
			var separacion_valores = "###";
			var dato = "";
			// con las valores de las capas averiguamos los valores de los campos del formulario y montamos los id de las capas de error
			for (valor in array_capas)
			{
				if (document.getElementById(array_capas[valor]))
				{
					dato = document.getElementById(array_capas[valor]).value;
					// quitamos los espacios en blanco del principio y final para evitar que se rellenen los campos con espacios en blanco
					dato = dato.replace(/^(\s|\&nbsp;)*|(\s|\&nbsp;)*$/g,"");
					//alert(dato);
				}
				valores = valores + dato + separacion_valores;
			}
			//recogemos los valores y los guardamos en arrays

				//valores = valores.substring(1); //quitamos la primera coma
				//capas_error = capas_error.substring(1); //quitamos la primera coma
				array_valores = valores.split(separacion_valores);
				//array_capas_errores = capas_error.split(",");
			
			//limpiamos las capas de errores
				//limpiarValorCapas(capa_error);
				document.getElementById(capa_error).innerHTML="";
				document.getElementById(capa_error).style.display = "none";


			mensaje = "Debe rellenar los siguientes campos: <br />";
			for (i=0; i<array_valores.length-1 ; i++)
			{
				if (array_valores[i]=='')
				{
					//alert(array_capas[i]);					
					mensaje = mensaje + array_campos[i] + "<br /> ";			
					error = true;
				}
				if (error)
				{
					document.getElementById(capa_error).innerHTML = mensaje;// + "<hr>";
					document.getElementById(capa_error).style.display = "block";
				}
			}
			
			return error;
		}

	// FIN camposVacios *********************************************************************

	// **************************************************************************************
	// validarCampos_conAjax(campo,url,variable)
	// funcion que hace una llamada ajax en funcion de UN SOLO campo y su variable
	// campo = nombre del campo del formulario que queremos validar si es correcto
	// url = url para la comprobación por ajax
	// variable = variable que queremos validar (nif, mail, etc...)
	// Autor: JR 14/07/08					
	// Ultima modificacion: 14/07/08 (JR) 
	// **************************************************************************************
		function validarCampos_conAjax(campo,url,variable)
		{
			var error = false;
			if (campo) // comprobamos que exista el campo;
			{
				if (campo.value!="") //campo distinto de vacío;
				{
					var vars = "?"+variable+"="+campo.value;
					//alert(getDataServer(url,vars));
					if (getDataServer(url,vars))
					{
						error = true;
					}
				}
			}
			return error;
		}
	// FIN validarCampos_conAjax *************************************************************
		
	// **************************************************************************************
	// 	// validarCampos_conAjax2(variables,valores_campos,url,separacion)
	// función que hace una llamada ajax en funcion de VARIOS valores de campos y sus variables
	// variables = variables que queremos validar (nif, titulo, etc...) unidas en un solo campo de texto
	// valores_campos = valor de los campos en un solo campo de texto
	// url = url para la comprobación por ajax
	// separacion = clave utilizada para poder separar los textos de "variables" y "valores_campos"
	// Autor: JR 02/09/08					
	// Ultima modificacion: 02/09/08 (JR) 
	// **************************************************************************************
		function validarCampos_conAjax2(variables,valores_campos,url,separacion)
		{
			var error = false;
			array_campos = valores_campos.split(separacion);
			array_variables = variables.split(separacion);
			var vars = "?";
			for (i=0; i<array_campos.length; i++)
			{
				if (i>0)
				{
					vars = vars + "&";
				}
				vars = vars + array_variables[i]+"="+array_campos[i];
			}
			//alert(url+vars);
			if (getDataServer(url,vars))
			{
				error = true;
			}
		}
	// FIN validarCampos_conAjax2 *************************************************************

	// **************************************************************************************
	// validarRadioGroup(campo)
	// campo = nombre del campo del formulario que queremos validar si es correcto
	// Autor: JR 14/07/08					
	// Ultima modificacion: 14/07/08 (JR) 
	// **************************************************************************************
		function validarRadioGroup(campo)
		{
			var error = false;
			if (campo) 
			{
				var error_check = radioGroup_marcado(campo);
				if (error_check)
				{
					error = true
				}
			}
			return error;
		}
	// FIN validarRadioGroup *********************************************************************

	// **************************************************************************************
	// validarDatosFacturacion()
	// si hay un campo rellenado deben estar todos los demás rellenados
	// Autor: JR 14/07/08					
	// Ultima modificacion: 14/07/08 (JR) 
	// **************************************************************************************
		function validarDatosFacturacion(campo)
		{
			var error = false;
			var campos = "Tnombrefac,Tniffac,Tdireccionfac,Tcpfac,Sprovinciafac";
			var array_campos = campos.split(",");

			// comprobamos que exista algún campo rellenado
				for (i=0; i<array_campos.length; i++) 
				{
					if (document.getElementById(array_campos[i]).value!="") 
					{
						var hay_campo_rellenado = true;
						break;
					}
				}
			// si hay algún campo rellenado comprobamos que el resto no esten vacíos
				if (hay_campo_rellenado)
				{
					for (i=0; i<array_campos.length; i++)
					{
						if (document.getElementById(array_campos[i]).value=="") 
						{
							error = true;
							break;
						}
					}
				}
			return error;
		}
	// FIN validarDatosFacturacion **********************************************************

	// **************************************************************************************
	// radioGroup_marcado(radioGroup)
	// 		averiguamos si en un radio group hay marcada alguna opción
	// Autor: JR 24/04/08					
	// Ultima modificacion: 24/04/08 (JR) 
	// **************************************************************************************
		function radioGroup_marcado(radioGroup)
		{
			var error = true;
			// si radiogroup solamente tiene una opción no se crea una array
			if (isNaN(radioGroup.length)==true)
			{
				if (radioGroup.checked) 
				{
					error = false;
				}
			}
			else //cuando el radiogroup tiene varias opciones
			{
				for (i=0;i<radioGroup.length;i++)
				{ 
					if (radioGroup[i].checked) 
					{
						error = false;
						break;
					}
				} 
			}
			return error;
		}
	// FIN radioGroup_marcado *********************************************************************

	// **************************************************************************************
	// obtener_radioGroup_marcado(radioGroup)
	// 		obtenemos el valor marcado en un radio group
	// Autor: JR 24/04/08					
	// Ultima modificacion: 24/04/08 (JR) 
	// **************************************************************************************
		function obtener_radioGroup_marcado(radioGroup)
		{
			var valor = "";
			for (i=0;i<radioGroup.length;i++)
			{ 
				if (radioGroup[i].checked) 
				{
					valor = radioGroup[i].value;
					break;
				}
			} 
			return valor;
		}
	// FIN obtener_radioGroup_marcado ********************************************************

	// **************************************************************************************
	// string_to_date(fecha)
	// 		convertimos una fecha string (formato dia/mes/anyo) a Date
	// Autor: JR 11/07/08					
	// Ultima modificacion: 11/07/08 (JR) 
	// **************************************************************************************
			function string_to_date(fecha) //formato dia/mes/anyo
			{
				fecha = fecha.split("/");
				dia = fecha[0];
				mes = fecha[1]-1; //ojo: los meses empizan en cero Enero=0, Febrero=1, ....;
				anyo = fecha[2];
				return new Date(anyo,mes,dia,0,0,0); 
			}
	// FIN string_to_date *******************************************************************
			
	// **************************************************************************************
	// calcularDiasTranscurridos(fecha1,fecha2)
	// 		dadas 2 fechas obtenemos su diferencia en días
	// Autor: JR 11/07/08					
	// Ultima modificacion: 11/07/08 (JR) 
	// **************************************************************************************
			function calcularDiasTranscurridos(fecha1,fecha2)
			{
				var msPorDia = 24 * 60 * 60 * 1000; // Número de milisegundos por día;
				var diastranscurridos = (fecha2.getTime() - fecha1.getTime()) / msPorDia;
				diastranscurridos = Math.round(diastranscurridos);
				return diastranscurridos ;
			}
	// FIN calcularDiasTranscurridos ********************************************************


	// **************************************************************************************
	// activarDias()
	// 		utilizado en el boletín de alojamiento para activar los combos de llegada salida y calcular los días seleccionados y el total de dineo que le costará al usuario el hotel seleccionado
	// Autor: JR 10/07/08					
	// Ultima modificacion: 10/07/08 (JR) 
	// **************************************************************************************
			function activarDias()
			{
				// activamos los select y mostramos el precio de la habitación marcada
					if (radioGroup_marcado(document.form.Rhotel))
					{
						document.form.Sfechallegada.disabled = true;
						document.form.Sfechasalida.disabled = true;
					}
					else
					{
						document.form.Sfechallegada.disabled = false;
						document.form.Sfechasalida.disabled = false;
						var valor = obtener_radioGroup_marcado(document.form.Rhotel);
						//var precio_habitacion = parseInt(valor.substr(valor.length-10));
						var precio_habitacion = valor.replace("euros","");
						precio_habitacion = precio_habitacion.replace(" ","");
						precio_habitacion = parseInt(precio_habitacion.slice(precio_habitacion.lastIndexOf("-")+1));
						document.getElementById("precio_hab").innerHTML = precio_habitacion;
					}
				// calculamos el total de días y el precio total
					var	fecha_llegada = string_to_date(document.form.Sfechallegada.value);
					var	fecha_salida = string_to_date(document.form.Sfechasalida.value);
					var total_dias = calcularDiasTranscurridos(fecha_llegada,fecha_salida);
					var precio_total = total_dias * precio_habitacion; 
					if ((total_dias) <= 0)
					{
						total_dias = "<span class='error_num_noches'>"+total_dias+"</span>";
					}
					document.getElementById("num_noches").innerHTML = total_dias;

					document.getElementById("Htotal").value = precio_total;
					if (isNaN(precio_total)) { precio_total=0 }
					if ((precio_total) <= 0 )
					{
						precio_total = "<span class='error_precio_total'> 0 </span>";
					}
					document.getElementById("precio_total").innerHTML = precio_total;
			}
	// FIN activarDias ********************************************************

	// **************************************************************************************
	// valida(capas, campos, capa_error,urlAjaxPHP,tipo_form)
	// 	 función par validar los formularios (unificación de los distintos "valida" que tenían los formularios)
	//	capas: capas que contiene los campos que son obligatorios
	//	campos: texto que se mostrará pra cada campo si son vacios
	//	capa_error: capa en la que mostraremos los distintos errores
	//	urlAjaxPHP: url donde están las funciones que llamamos por ajax
	//	tipo_form: 0=Comunicación; 1=Inscripción; 2=Alojamiento
	// Autor: JR 03/09/08					
	// Ultima modificacion: 03/09/08 (JR) 
	// **************************************************************************************
			function valida(capas, campos, capa_error,urlAjaxPHP,tipo_form)
			{
				document.getElementById(capa_error).innerHTML= "";
	
				// comprobamos si los campos obligatorios están vacios;
					var error =  camposVacios(capas, campos, capa_error)
	
				//comprobamos si el nif es correcto;
					if (document.form.Tnif && document.form.Tnif.value!='')
					{
						//if (validarCampo("nif",document.form.Tnif.value,urlAjaxPHP)) //la función PHP no calcula bien las letras
						if (valida_nif_cif_nie(document.form.Tnif.value)<1)
						{
							document.getElementById(capa_error).innerHTML +="<strong>NIF / NIE </strong> incorrecto. (Ejemplo: NIF -> 06549396P --- NIE -> X3985044H)<br />";
							var nif_incorrecto = true;
							error = true;
						}
					}
				//comprobamos si los mail son correctos;
					if (document.form.Tmail && document.form.Tmail.value!='')
					{
						if (validarCampo("mail",document.form.Tmail.value,urlAjaxPHP))
						{
							document.getElementById(capa_error).innerHTML +="<strong>E-Mail</strong> incorrecto<br />";
							error = true;
						}
					}
					if (document.form.Tmail2 && document.form.Tmail2.value!='')
					{
						if (validarCampo("mail",document.form.Tmail2.value,urlAjaxPHP))
						{						
							document.getElementById(capa_error).innerHTML +="<strong>E-Mail 2</strong> incorrecto<br />";
							error = true;
						}
					}

				// comprobamos que otro centro de trabajo esté rellenado;
					if (document.form.Scentrotrabajo)
					{
						var otro_centro = document.form.Scentrotrabajo.value;
						if (otro_centro=="Otro")
						{
							if (document.form.Tcentrotrabajo.value=="")
							{
									document.getElementById(capa_error).innerHTML +="Debe rellenar el <strong>nuevo Centro de Trabajo</strong><br />";
									error = true;
							}
						}
					}

				// form "comunicación";
//					alert(tipo_form);
					if (tipo_form==0) 
					{
						// comprobamos si NIF y Título de la comunicación ya existen en la BD (se ha comentado pq a algunos usuarios les daba error.
							/*if (!nif_incorrecto) 
							{
							// comprobamos si nif y titulo de la comunicación ya existen en la BD;
							// Nota: en IE no funciona cuando el título tiene acentos.;
								if (validarCampo2("nif","titulo",document.form.Tnif.value,document.form.Ttitulo.value,urlAjaxPHP))
								{
									document.getElementById(capa_error).innerHTML +="<strong>Usted ya ha enviado una comunicaci&oacute;n con el mismo t&iacute;tulo</strong><br />";
									error = true;
								}
							}
							*/
						// comprobamos las extensiones del fichero;
							var fichero = document.form.fichero.value;
							if (fichero != '')
								{
									Array_extensiones_correctas = new Array (".doc");
									if (extensionesIncorrectas(fichero,Array_extensiones_correctas))
									{
										document.getElementById(capa_error).innerHTML +="El <strong>Fichero</strong> no tiene extensi&oacute;n correcta: <strong>.doc</strong>";
										error = true;
									}
								}					
						// comprobamos que otro centro de trabajo esté rellenado;
							var otro_centro = document.form.Scentrotrabajo.value;
							if (otro_centro=="Otro")
							{
								if (document.form.Tcentrotrabajo.value=="")
								{
										document.getElementById(capa_error).innerHTML +="Debe rellenar el <strong>nuevo Centro de Trabajo</strong>";
										error = true;
								}
							}
					}
					
				// form "inscripción";
					if (tipo_form==1) 
					{
						// comprobamos si se ha marcado alguna cuota ;
							// para RADIOGROUP;
								if (validarRadioGroup(document.form.Rcuota))
								{
									error = true
									document.getElementById(capa_error).innerHTML= document.getElementById(capa_error).innerHTML + "<strong>Cuota de inscripci&oacute;n</strong> no marcada<br />";
								}
							// para CHECKBOX;
								if (document.form.checkCuota1)
								{
									var cuota1 = document.form.checkCuota1.checked;
									var cuota2 = document.form.checkCuota2.checked;
									// cuota 1 obligatoria;
									if (cuota1 == false)
									{
										error = true
										document.getElementById(capa_error).innerHTML += "<strong>Cuota de inscripci&oacute;n</strong> no marcada<br />";
									}
				
									// cuota 2. si marcada => comprobamos campos asociados;
									if (cuota2 == true)
									{
										if (document.form.Tnombre_acompanyante.value == "" || document.form.Tapellidos_acompanyante.value=="")
										{
											document.getElementById(capa_error).innerHTML += "Si marca <strong>Acompa&ntilde;ante</strong>, debe rellenar sus datos<br />";						
										}
									}
								}
						// FIN comprobamos si se ha marcado alguna cuota;
					}
	
				// form "alojamiento";
					if (tipo_form==2) 
					{
					// comprobamos si se ha marcado algún hotel
						if (validarRadioGroup(document.form.Rhotel))
						{
							error = true
							document.getElementById(capa_error).innerHTML= document.getElementById(capa_error).innerHTML + "<strong>Hotel</strong> no marcado<br />";
						}
					
					// compruebo que los datos de llegada / salida son correctos;
						if (document.getElementById("Htotal").value <= 0 )
						{
							error = true;
							document.getElementById(capa_error).innerHTML= document.getElementById(capa_error).innerHTML +	"Los datos de <strong>llegada/salida</strong> al hotel no son correctos.<br />";
						}
					}
				// validar datos de facturacion (solo para tipo_form 1 y 2);
					if (tipo_form!=0)
					{
						// si existe algún dato de facturación. deben rellenarse todos;
							if (validarDatosFacturacion())
							{
								error = true;
								document.getElementById(capa_error).innerHTML = document.getElementById(capa_error).innerHTML +	"Si rellena un <strong>dato de facturaci&oacute;n</strong>, debe rellenar todos los datos.<br />";
							}
							/*else
							{
								if (document.form.Tniffac && document.form.Tniffac.value!='')
								{
									//	if (validarCampo("nif",document.form.Tniffac.value,urlAjaxPHP)) //la función PHP no calcula bien las letras
									if (valida_nif_cif_nie(document.form.Tniffac.value)<1)
									{
										document.getElementById(capa_error).innerHTML += "<strong>CIF / NIF / NIE de Facturaci&oacute;n</strong> incorrecto (Ejemplo: CIF -> B96575550 --- NIF -> 06549396P --- NIE -> X3985044H)<br />";
										var nif_incorrecto = true;
										error = true;
										
									}
								}
							}
							*/
					}
				// sin errores enviamos el formulario, en caso contrario mostramos los errores;
					if (!error)
					{				
						document.form.submit();
						//alert("correcto");
					}
					else
					{
						document.getElementById(capa_error).style.display = "block";
					}
			}
	// FIN valida ********************************************************

	// **************************************************************************************
	// datos_acompanyante()
	// 		función que muestra los campos para rellenar los datos del acompañante y que solamente se muestran si se activa la opción correspondiente
	// Autor: JR 10/07/08					
	// Ultima modificacion: 10/07/08 (JR) 
	// **************************************************************************************
			function datos_acompanyante()
			{
				var cuota2 = document.form.checkCuota2.checked;
				if (cuota2 == true)
				{
					document.getElementById("acompanyante").style.display = "block";
					document.form.Tnombre_acompanyante.focus();
				}
				else
				{
					document.getElementById("acompanyante").style.display = "none";
					document.form.Tnombre_acompanyante.value = "";
					document.form.Tapellidos_acompanyante.value= "";
				}
			}
	// FIN datos_acompanyante ********************************************************

	// **************************************************************************************
	// validar_camposIdenticos(campo1,campo2)
	// 		función que comprueba si 2 campos son iguales
	// Autor: JR 20/09/08
	// Ultima modificacion: 20/09/08 (JR) 
	// **************************************************************************************
			function validar_camposIdenticos(campo1,campo2)
			{
				resultado = true;
				if (campo1 != campo2)
				{
					resultado = false;
				}
				return resultado;
			}
	// FIN validar_camposIdenticos ********************************************************

	// **************************************************************************************
	// mostrar_ocultar_capa(capas, mostrar_capa)
	// 		función que muestra una capa y oculta el resto
	// Autor: JR 20/09/08
	// Ultima modificacion: 20/09/08 (JR) 
	// **************************************************************************************
		function mostrar_ocultar_capa(capas, mostrar_capa)
		{
			var array_capas = capas.split(',');
			for (i=0;i<array_capas.length ;i++)
			{
				document.getElementById(array_capas[i]).style.display = 'none';
				if (array_capas[i] == mostrar_capa)
				{
					document.getElementById(array_capas[i]).style.display = 'block';
				}
			} 
		}
	// FIN mostrar_ocultar_capa ********************************************************
	
	// **************************************************************************************
	// ir_pagina(tecla_pulsada,pagina)
	// 		función que carga una url si se ha pulsado la tecla intro
	// Autor: JR 24/03/09
	// Ultima modificacion: 24/03/09 (JR) 
	// **************************************************************************************
		function ir_pagina(tecla_pulsada,ir_pagina)
		{
			if (tecla_pulsada.keyCode==13)
			{
				//alert(pagina);
				window.location.href=ir_pagina;
			}
		}
	// FIN ir_pagina ********************************************************

	// **************************************************************************************
	// valida_nif_cif_nie(a)
 	// función que valida nif, nie y cif
	// Retorna: 1 = NIF ok; 2 = CIF ok; 3 = NIE ok; -1 = NIF error; -2 = CIF error; -3 = NIE error; 0 = error (campo vacio, formato incorrecto, etc);
	// Autor: http://compartecodigo.com/javascript/validar-nif-cif-nie-segun-ley-vigente-31.html					
	// Creado: 05/11/09
	// Ultima modificacion: 05/11/09 (JR) 
	// **************************************************************************************
		function valida_nif_cif_nie(a) 
		{
			var temp=a.toUpperCase();
			var cadenadni="TRWAGMYFPDXBNJZSQVHLCKE";
		 
			if (temp!==''){
				//si no tiene un formato valido devuelve error
				if ((!/^[A-Z]{1}[0-9]{7}[A-Z0-9]{1}$/.test(temp) && !/^[T]{1}[A-Z0-9]{8}$/.test(temp)) && !/^[0-9]{8}[A-Z]{1}$/.test(temp))
				{
					return 0;
				}
		 
				//comprobacion de NIFs estandar
				if (/^[0-9]{8}[A-Z]{1}$/.test(temp))
				{
					posicion = a.substring(8,0) % 23;
					letra = cadenadni.charAt(posicion);
					var letradni=temp.charAt(8);
					if (letra == letradni)
					{
						return 1;
					}
					else
					{
						return -1;
					}
				}
		 
				//algoritmo para comprobacion de codigos tipo CIF
				suma = parseInt(a[2])+parseInt(a[4])+parseInt(a[6]);
				for (i = 1; i < 8; i += 2)
				{
					temp1 = 2 * parseInt(a[i]);
					temp1 += '';
					temp1 = temp1.substring(0,1);
					temp2 = 2 * parseInt(a[i]);
					temp2 += '';
					temp2 = temp2.substring(1,2);
					if (temp2 == '')
					{
						temp2 = '0';
					}
		 
					suma += (parseInt(temp1) + parseInt(temp2));
				}
				suma += '';
				n = 10 - parseInt(suma.substring(suma.length-1, suma.length));
		 
				//comprobacion de NIFs especiales (se calculan como CIFs)
				if (/^[KLM]{1}/.test(temp))
				{
					if (a[8] == String.fromCharCode(64 + n))
					{
						return 1;
					}
					else
					{
						return -1;
					}
				}
		 
				//comprobacion de CIFs
				if (/^[ABCDEFGHJNPQRSUVW]{1}/.test(temp))
				{
					temp = n + '';
					if (a[8] == String.fromCharCode(64 + n) || a[8] == parseInt(temp.substring(temp.length-1, temp.length)))
					{
						return 2;
					}
					else
					{
						return -2;
					}
				}
		 
				//comprobacion de NIEs
				//T
				if (/^[T]{1}/.test(temp))
				{
					if (a[8] == /^[T]{1}[A-Z0-9]{8}$/.test(temp))
					{
						return 3;
					}
					else
					{
						return -3;
					}
				}
		 
				//XYZ
				if (/^[XYZ]{1}/.test(temp))
				{
					pos = str_replace(['X', 'Y', 'Z'], ['0','1','2'], temp).substring(0, 8) % 23;
					if (a[8] == cadenadni.substring(pos, pos + 1))
					{
						return 3;
					}
					else
					{
						return -3;
					}
				}
			}
		 
			return 0;
		}

		// Para los cálculos se usa esta función auxiliar que emula el str_replace de PHP
			function str_replace(search, replace, subject) {
				// http://kevin.vanzonneveld.net
				// +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
				// +   improved by: Gabriel Paderni
				// +   improved by: Philip Peterson
				// +   improved by: Simon Willison (http://simonwillison.net)
				// +    revised by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
				// +   bugfixed by: Anton Ongson
				// +      input by: Onno Marsman
				// +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
				// +    tweaked by: Onno Marsman
				// *     example 1: str_replace(' ', '.', 'Kevin van Zonneveld');
				// *     returns 1: 'Kevin.van.Zonneveld'
				// *     example 2: str_replace(['{name}', 'l'], ['hello', 'm'], '{name}, lars');
				// *     returns 2: 'hemmo, mars'
			 
				var f = search, r = replace, s = subject;
				var ra = r instanceof Array, sa = s instanceof Array, f = [].concat(f), r = [].concat(r), i = (s = [].concat(s)).length;
			 
				while (j = 0, i--) {
					if (s[i]) {
						while (s[i] = s[i].split(f[j]).join(ra ? r[j] || "" : r[0]), ++j in f){};
					}
				};
			 
				return sa ? s : s[0];
			}
	// valida_nif_cif_nie(a) ********************************************************
//]]> 