<!--

	document.writeln('<' + 'script type="text/javascript" src="/jvs/php.js"><' + '/script>');

	var ventana;

	// Esta función activará textos parpadeantes en el documento.
	
	function activa_blinks(color_texto,color_fondo,tiempo_fuente,tiempo_fondo,alternar,transparente) {
		var objeto=new Array();
		for (i=0,x=0;i<document.all.length;i++) {
			temp=document.all[i].id;
			if (temp.substr(0,5) == "blink") {
				objeto[x]=eval(temp);
				x++;
			}
		}
		if (!alternar) {
			for (i=0;i<x;i++) {
				objeto[i].style.color=color_fondo;
				if (!transparente)
					objeto[i].style.backgroundColor=color_fondo;
			}
			timer=setTimeout("activa_blinks('" + color_texto + "','" + color_fondo + "'," + tiempo_fuente + "," + tiempo_fondo + ",1," + transparente + ")",tiempo_fondo);
		}
		else {
			for (i=0;i<x;i++) {
				objeto[i].style.color=color_texto;
				if (!transparente)
					objeto[i].style.backgroundColor=color_fondo;
			}
			timer=setTimeout("activa_blinks('" + color_texto + "','" + color_fondo + "'," + tiempo_fuente + "," + tiempo_fondo + ",0," + transparente + ")",tiempo_fuente);
		}
	}
	function limita(objeto,maxchar) {
		var texto=objeto.value;
		if (texto.length > maxchar)
			objeto.value=texto.substr(0,maxchar);
	}
	
	function onlyNum(e, objeto) {
		
		// Controla que el texto introducido en todo momento sea unicamente numeros enteros, incluso del keypad.
		
		var keynum;
	
		if (window.event) {	// IE
			keynum = e.keyCode;
		}
		else if (e.which) {	// Netscape/Firefox/Opera
			keynum = e.which;
		}
	
		var intro = (keynum == 13);
		var mays = (keynum == 16);
		var homend = (keynum >= 35 && keynum <= 36);
		var flechas = (keynum >= 37 && keynum <= 40);
		var numeric = (keynum >= 48 && keynum <= 57);
		var keypad = (keynum >= 96 && keynum <= 105);
		var backsp = (keynum == 8);
		var tab = (keynum == 9);
		var del = (keynum == 46);
		var other = (typeof keynum == 'undefined');
		
		return (intro || numeric || keypad || flechas || backsp || tab || del || mays || homend || other) && !e.shiftKey;
	}
	
	/* Función de PHP.JS
	
	function trim(s) {

		// Remove leading spaces and carriage returns
  
		while ((s.substring(0,1) == ' ') || (s.substring(0,1) == '\n') || (s.substring(0,1) == '\r')) {
			s = s.substring(1,s.length);
		}

		// Remove trailing spaces and carriage returns

		while ((s.substring(s.length-1,s.length) == ' ') || (s.substring(s.length-1,s.length) == '\n') || (s.substring(s.length-1,s.length) == '\r')) {
			s = s.substring(0,s.length-1);
		}
		return s;
	} */
	function mail_valido(dircorreo) {
	
		// Función que comprueba si una dirección de e-mail es válida.
		// Primero declaramos algunas variables a 0.

		var conarroba=0,conpunto=0,posarroba=0,cuentarrobas=0,primarroba,x,car;

		// Las direcciones de correo son todas en minúscula.
		
		dircorreo=dircorreo.toLowerCase();
		
		// Si no contiene nada $dircorreo, no es válida

		if (dircorreo == '') return false;

		// Debe tener una y sólo una arroba.

		primarroba=dircorreo.indexOf('@');
		if (primarroba != -1) {
			cuentarrobas++;
			if (dircorreo.indexOf('@',primarroba + 1) != -1)
				cuentarrobas++;
		}
		if (cuentarrobas != 1) return false;
		
		// Al menos un punto, correspondiente como mínimo a la extensión del dominio.
		
		if (dircorreo.indexOf('.') == -1) return false;
		
		// No puede tener dos puntos seguidos.
		
		if (dircorreo.indexOf('..') != -1) return false;
		
		// Empezamos a comprobar cada carácter por separado.
		
		for (x=0;x<dircorreo.length;x++) {
		
			// No puede tener otro carácter no alfanumérico diferente de punto, arroba o guión medio o bajo.
			
			car=dircorreo.charCodeAt(x);
			
			if (car < 45 || car == 47 || (car > 57 && car < 64) || (car > 64 && car < 95) || (car > 95 && car < 97) || car > 122) return false;
		
			// Si es el carácter arroba, y se encuentra el primero en la dirección, o en una posición que no deja
			// espacio para un mínimo dominio (...@x.xx), no es válida la dirección.
			
			if (dircorreo.substr(x,1) == "@" && (x == 0 || x > (dircorreo.length - 5))) return false;
			
			// En caso contrario al anterior, cuando se encuentre la arroba empieza a buscarse al menos un punto,
			// para lo cual, activamos dos variables: $conarroba a true (encontrada) y $posarroba con la posición
			// de la arroba en la dirección.
			
			if (dircorreo.substr(x,1) == "@") {
				conarroba=1;
				posarroba=x;
			}
			
			// Si se encuentra un punto después de la arroba ($conarroba=true) y está inmediatamente después
			// de dicha arroba (p.e.: usuario@.com), no es correcta.
			
			if (dircorreo.substr(x,1) == "." && conarroba == 1 && x < (posarroba + 2)) return false;
			
			// En caso contrario, si la dirección termina con un punto y menos de dos caracteres como extensión
			// (usuario@dominio. o usuario@dominio.x), tampoco es válida, ya que lo mínimo es extensión .es, por ejemplo
			
			if (dircorreo.substr(x,1) == "." && x > (dircorreo.length - 3)) return false;
			
			// Y por último, si se encuentra el último punto, después de la arroba, con una extensión de 2 a 4 caracteres,
			// $conpunto se pone a true
			
			if (dircorreo.substr(x,1) == "." && conarroba == 1 && x >= (dircorreo.length - 5)) conpunto=1;
		}
		
		// Si la dirección tiene arroba y punto, con las verificaciones ya realizadas,
		// la dirección es correcta.
		
		if (conpunto && conarroba) return true;
		
		// En cualquier otro caso, no será válida.
		
		else return false;
	}
	function parserInt(s) {
		// Pasar a entero una cadena. parseInt falla con 08 y 09.
		s = trim(s.toString());
		s = s.replace(/^0*/g, "");
		s = (s == "") ? 0 : s;
		s = (s[0] == ".") ? ("0" + s) : (s);
		return isNaN(parseInt(s)) ? false : parseInt(s);
	}
	function buscaVentana(url) {
		if (typeof ventana != 'undefined' && ventana != null) {
			if (!ventana.closed) {
				if (urlAnterior == url) {
					ventana.blur();
					ventana.focus();
					return true;
				}
				else {
					ventana.close();
					return false;
				}
			}
		}
	}
	function openWin(url, nombre, width, height, scrollbars, left) {
		if (typeof scrollbars == 'undefined' || scrollbars == null) scrollbars = 'yes';
		if (typeof left == 'undefined' || left == null) left = 'center';
		
		if (left == 'center')
			left = parserInt((window.screen.width - width) / 2);
		else
			left = ((typeof window.screenX == 'undefined') ? window.screenLeft : window.screenX) + left;
			
		if (!buscaVentana(url)) {
			ventana = window.open(url, nombre, 'menubar=no, directories=no, toolbar=no, scrollbars=' + scrollbars + ', width=' + width + ', height=' + height + ', left=' + left + ', top=' + parserInt((window.screen.height - height) / 2));
			urlAnterior = url;
		}
	}
	function comprueba_datos(nom,tfno,movil,email,authcode) {
		if (nom == '') return false;
		if (tfno == '' && movil == '') return false;
		if (tfno != '' && (tfno.length < 9 || isNaN(tfno))) return false;
		if (movil != '' && (movil.length < 9 || isNaN(movil))) return false;
		if (email != '' && !mail_valido(email)) return false;
		authcode=trim(authcode);
		if (authcode.length < 4) return false;
		return true;
	}

	function enviardatos(ref, adm, adminpag) {
		var ruta="";
		
		if (adminpag == -1)
			ruta="administracion-de-comunidades/sp/";
		else if (adminpag == 1383)
			ruta="../administracion-de-comunidades/sp/";
		
		window.open(ruta + 'capturadatos.php?ref=' + ref + '&adm=' + adm,'EnviaDatos','toolbar=no, location=no, status=no, menubar=no, scrollbars=no, width=400, height=380, left=' + (parseInt(window.screen.width/2) - 200) + ', top=' + (parseInt(window.screen.height/2) - 190));
	}
	
	function onlyCurPos(e, objeto, nextObject) {
		
		// Controla que el texto introducido en todo momento
		// sea unicamente numeros en formato español, con uno o varios decimales,
		// Y SIN SIGNO, evitando el signo -
		// y que se pueda utilizar el keypad, cambiando el . por , si es así.
		// Si pulsamos Intro, pondremos el foco en 'nextObject'.
		
		var keynum;
	
		if (window.event) {	// IE
			keynum = e.keyCode;
		}
		else if (e.which) {	// Netscape/Firefox/Opera
			keynum = e.which;
		}
	
		if (keynum == 109 || keynum == 189)	// No negativos
			return false;
		else if (keynum == 110) {
			var pos = getCursorPos(objeto.id);
			objeto.value = objeto.value.substr(0, pos) + ',' + objeto.value.substr(pos);
			setCursorPos(objeto.id, pos);
			return false;
		}
		else if (keynum == 13 && nextObject != null) {
			nextObject.focus();
			return false;
		}
		
		var mays = (keynum == 16);
		var homend = (keynum >= 35 && keynum <= 36);
		var flechas = (keynum >= 37 && keynum <= 40);
		var numeric = (keynum >= 48 && keynum <= 57);
		var keypad = (keynum >= 96 && keynum <= 105);
		var puntua = (keynum == 109 || (keynum >= 188 && keynum <= 190));
		var backsp = (keynum == 8);
		var tab = (keynum == 9);
		var del = (keynum == 46);
		var other = (typeof keynum == 'undefined');
		
		return (mays || homend || flechas || numeric || keypad || puntua || backsp || tab || del || other);
	}
	
	function getCursorPos(idTexto) {
		
		// Obtiene la posición del cursor en un cuadro de texto
		
		var tb = document.getElementById(idTexto);
		var cursor = -1;
		
		if (document.selection && document.selection != 'undefined') { // IE
			var _range = document.selection.createRange();
			var contador = 0;
			while (_range.move('character', -1)) {
				contador++;
			}
			cursor = contador;
		}
		else if (tb.selectionStart >= 0) // FF
			cursor = tb.selectionStart;
		
		return cursor;
	}
	
	function setCursorPos(idTexto, pos) {
		
		// Coloca el cursor en una posición determinada de un cuadro de texto
		
		var tb = document.getElementById(idTexto);
		
		if (tb.createTextRange) {
			var range = tb.createTextRange();
			
			range.collapse(true);
			range.moveStart('character', pos + 1);
			range.moveEnd('character', 0);
			range.select();
		}
		else if (tb.selectionEnd) {
			tb.setSelectionRange(pos + 1, pos + 1);
		}
	}
	
	function SQLnum(s) {
        	return (isNaN(parseFloat(s.replace(/\./g, "").replace(/,/g, ".")))) ? 0 : parseFloat(s.replace(/\./g, "").replace(/,/g, "."));
	}
	
	function filactiva(activar, objeto) {
		if (activar) {
			objeto.style.cursor='pointer';
			objeto.style.backgroundColor='#F8E7B1';
		}
		else {
			objeto.style.cursor='default';
			objeto.style.backgroundColor='#FDFEE0';
		}
	}
	function filactivaizq(activar, objeto) {
		if (activar) {
			objeto.style.backgroundColor='#760000';
			objeto.style.color='#FFFFFF';
		}
		else {
			objeto.style.backgroundColor='#FFFFFF';
			objeto.style.color='#000000';
		}
	}
	function filactivaintra(activar, objeto, mano) {
		if (activar) {
			objeto.style.backgroundColor='#760000';
			objeto.style.color='#FFFFFF';
		}
		else {
			objeto.style.backgroundColor='#FCF1C7';
			objeto.style.color='#000000';
		}
		if (mano)
			objeto.style.cursor='pointer';
		else
			objeto.style.cursor='default';
	}
	function filactivaefincas(activar, objeto, rollover, idimg) {
		if (activar) {
			objeto.style.backgroundColor='#760000';
			objeto.style.color='#FFFFFF';
		}
		else {
			objeto.style.backgroundColor='#FFFFFF';
			objeto.style.color='#760000';
		}
		idimg.src=rollover;
	}
	function mailjava(usuario, dominio, extension) {
	
	// Esta función servirá para evitar los programas recolectores de e-mail (SPAM)
	
		correo="mailto";
		location.href = correo + ':' + usuario + '@' + dominio + '.' + extension;
	}
	function escribemail(usuario, dominio, extension) {

	// Esta otra función es para escribirlo directamente en la página
	
		document.write(usuario + '@' + dominio + '.' + extension);
	}
	function idunico() {
		var num, x, que;
		num = "";
		for (x=0;x < 20;x++) {
			que = (Math.random()*2) + 1;
			switch (que) {
				case 1: num=num + String.fromCharCode((Math.random()*25) + 65);
						break;
				case 2: num=num + String.fromCharCode((Math.random()*25) + 97);
						break;
				case 3: num=num + String.fromCharCode((Math.random()*9) + 48);
						break;
			}
		}
		return num;
	}
	function parseDoble(cadena) {
	
	// Función que convertirá un string a Doble
	
		var numres;
		var cadnueva;
		var decimal;
		var x;
		var indice;
		numres=0;
		decimal=0;
		cadnueva='';
		for (x=(cadena.length - 1);x >= 0;x--) {
			if (cadena.substr(x,1) == ',' && decimal)
				return 0;
			else if (cadena.substr(x,1) == ',') {
				decimal=1;
				cadnueva='.' + cadnueva;
			}
			else if ((cadena.charCodeAt(x) - 48) >= 0 && (cadena.charCodeAt(x) - 48) <= 9)
				cadnueva=cadena.substr(x,1) + cadnueva;
		}
		if (cadnueva == '' && decimal == 0) {
			for (x=(cadena.length - 1);x >= 0;x--) {
				if ((cadena.charCodeAt(x) - 48) >= 0 && (cadena.charCodeAt(x) - 48) <= 9)
					cadnueva=cadena.substr(x,1) + cadnueva;
			}
		}
		for (x=(cadnueva.length - 1),indice=0;x >= 0;x--,indice++) {
			if (cadnueva.substr(x,1) == '.') {
				numres=numres / Math.pow(10,cadnueva.length - x - 1);
				indice=-1;
			}
			else
				numres=numres + ((cadnueva.charCodeAt(x) - 48) * Math.pow(10, indice));
		}
		return numres;
	}
	function calculadora_hipoteca(idioma) {
	
	// Esta función se utilizará para calcular cualquier valor necesario para la hipoteca, en base a 3 factores.
	
		var interes=char_replace(document.forms.frmPrincipal.Interes.options[document.forms.frmPrincipal.Interes.selectedIndex].value,',','.') / 1200;
		var cuota=char_replace(document.forms.frmPrincipal.Cuota.value,',','.') * 1;
		var tiempo=char_replace(document.forms.frmPrincipal.Tiempo.options[document.forms.frmPrincipal.Tiempo.selectedIndex].value,',','.') * 12;
		var capital=char_replace(document.forms.frmPrincipal.Importe.value,',','.') * 1;
		if ((cuota == '' && capital == '') || (cuota != '' && capital != '')) {
			if (idioma == 'sp')
				alert('Debe indicar el importe a solicitar o la cuota mensual, dejando un campo libre a calcular');
			else if (idioma == 'en')
				alert('You must fill up amount to request or monthly quota, leaving a free field to carry out the operation.');
			else if (idioma == 'de')
				alert('Sie müssen oben füllen betragen den Antrag oder Monatsquote und ein freies Feld lassen, um den Betrieb durchzuführen.');
			return 0;
		}
		if (capital == '') {
			var factor=Math.pow((1+interes),tiempo);
			capital=cuota / ((factor*interes) / (factor-1));
			capital=parseLong(capital);
			document.forms.frmPrincipal.Importe.value=localnum(capital);
		}
		if (cuota == '') {
			var factor=Math.pow((1+interes),tiempo);
			cuota = capital * ((factor*interes) / (factor-1));
			cuota=parseLong(cuota + 0.5);	// Al calcular la cuota, se redondea
			document.forms.frmPrincipal.Cuota.value=localnum(cuota);
		}
		return 1;
	}
	function calculahipoteca(frmentrada,frmcuota,frminteres,frmtiempo) {
	
	// Esta función se utilizará para calcular el precio posible de la hipoteca, en base al capital, interés y tiempo.
	
		var interes=char_replace(frminteres.toString(),',','.') / 1200;
		var cuota=char_replace(frmcuota.toString(),',','.') * 1;
		var tiempo=char_replace(frmtiempo.toString(),',','.') * 12;
		var entrada=char_replace(frmentrada.toString(),',','.') * 1;
		if (interes == 0 || cuota == 0 || tiempo == 0) {
			if (entrada == 0)
				return 0;
			else
				return entrada;
		}
		var factor=Math.pow((1+interes),tiempo);
		var capital=cuota / ((factor*interes) / (factor-1));
		capital=capital + entrada;
		capital=parseLong(capital);
		return localnum(capital);
	}
	function char_replace(cadena,buscar,sustituir) {
	
	// Esta función sustituirá en la cadena <cadena>, todos los caracteres <buscar> por <sustituir>,
	// y quita todos los puntos de millar.
	
		var resultado="";
		for (x=0;x<cadena.length;x++) {
			if (cadena.substr(x,1) == buscar)
				resultado=resultado + sustituir;
			else if (cadena.substr(x,1) != '.')
				resultado=resultado + cadena.substr(x,1);
		}
		return resultado;
	}
	function parseLong(cadena) {
	
	// Función que convertirá un string a Long
	
		var numres;
		var cadnueva;
		var decimal;
		var x;
		var indice;
		numres=0;
		decimal=0;
		cadnueva='';
		cadena=cadena.toString();
		for (x=(cadena.length - 1);x >= 0;x--) {
			if (cadena.substr(x,1) == '.' && decimal)
				return 0;
			else if (cadena.substr(x,1) == '.')
				decimal=1;
			else if (decimal && (cadena.charCodeAt(x) - 48) >= 0 && (cadena.charCodeAt(x) - 48) <= 9)
				cadnueva=cadena.substr(x,1) + cadnueva;
		}
		if (cadnueva == '' && decimal == 0) {
			for (x=(cadena.length - 1);x >= 0;x--) {
				if ((cadena.charCodeAt(x) - 48) >= 0 && (cadena.charCodeAt(x) - 48) <= 9)
					cadnueva=cadena.substr(x,1) + cadnueva;
			}
		}
		for (x=(cadnueva.length - 1),indice=0;x >= 0;x--,indice++)
			numres=numres + ((cadnueva.charCodeAt(x) - 48) * Math.pow(10, indice));
		return numres;
	}
	function localnum(cadena) {

	// Función que convertirá un número cualquiera a formato local.
		
		var decimal;
		var grupo;
		var resultado;
		var count;
		cadena=cadena.toString();
		decimal=0;
		grupo=0;
		resultado='';
		for (count=(cadena.length - 1);count >= 0;count--) {
			if (cadena.substr(count,1) == '.') {
				decimal=1;
				resultado=',' + resultado;
			}
			else if (decimal && grupo == 3) {
				grupo=1;
				resultado=cadena.substr(count,1) + '.' + resultado;
			}
			else if (decimal) {
				grupo++;
				resultado=cadena.substr(count,1) + resultado;
			}
			else
				resultado=cadena.substr(count,1) + resultado;
		}
		if (!decimal) { // No tiene decimales, ponerle los puntos
			resultado='';
			grupo=0;
			for (count=(cadena.length - 1);count >= 0;count--) {
				if (grupo == 3) {
					grupo=1;
					resultado=cadena.substr(count,1) + '.' + resultado;
				}
				else {
					grupo++;
					resultado=cadena.substr(count,1) + resultado;
				}
			}
		}
		return resultado;
	}
	/* Función de PHP.JS
	function str_replace(buscar, reemplazar, objeto) {
		var x, result = "", trozos = new Array();
	
		trozos = objeto.split(buscar);
	
		for (x=0;x < trozos.length;x++) {
			if (x > 0)
				result += reemplazar;
			result += trozos[x];
		}
		return result;
	}*/
	function validar_nif(nif) {
		var dni, letra, patron, first, x;
		
		nif = str_replace(".","",nif);
		nif = str_replace("-","",nif);
		
		patron = new RegExp("([0-9]{8})([A-Za-z]{1})","gi"); // NIF
		if (patron.test(nif)) {
			dni = nif.substr(0, nif.length - 1);
			letra = nif.substr(nif.length - 1);
	
			first = "";
			for (x=0;x < dni.length;x++) {
				if (first == "")
					first=dni.substr(x,1);
				else if (first != dni.substr(x,1))
					break;
			}
			if (x == dni.length)
				return false;
	
			if (letra == calcularletra(dni) || letra.toUpperCase() == calcularletra(dni))
				return true;
			else
				return false;
		}
		else {
			var patron = new RegExp("([A-HK-NP-S]{1})([0-9]{7})([A-J0-9]{1})","gi"); // CIF
			if (patron.test(nif))
				return true;
			else {
				var patron = new RegExp("([X]{1})([0-9]{7})([A-Za-z]{1})","gi"); // Residente
				if (patron.test(nif)) {
					dni = nif.substr(1, 7);
					letra = nif.substr(nif.length - 1);
	
					first = "";
					for (x=0;x < dni.length;x++) {
						if (first == "")
							first=dni.substr(x,1);
						else if (first != dni.substr(x,1))
							break;
					}
					if (x == dni.length)
						return false;
	
					if (letra == calcularletra(dni) || letra.toUpperCase() == calcularletra(dni))
						return true;
					else
						return false;
				}
				else
					return false;
			}
		}
	}
	function calcularletra(nif) {
		var cadena = 'TRWAGMYFPDXBNJZSQVHLCKET';
		var posicion = nif % 23;
		return cadena.charAt(posicion);
	}
	function strtoname(frase,apellidos) {
	
		// Esta función convertirá un texto introducido por el usuario, correspondiente
		// a nombres propios, en minúsculas con iniciales en mayúscula.
	
		var x, sw, result, aux, aux2;
		var car, cad, cod, enc, enc2, enc3, enc4;
		sw=1;
		result="";
		cad=frase.toUpperCase();
		enc=cad.indexOf("S.L.");
		enc2=cad.indexOf("S.A.");
		enc3=cad.indexOf("S.C.");
		enc4=cad.indexOf("C.B.");
		if (!apellidos) {
			if (enc != -1 || enc2 != -1 || enc3 != -1 || enc4 != -1) {
				alert('Los nombres de sociedad deben ir en el campo apellidos, dejando el nombre en blanco.');
				return "";
			}
		}
		else {
			if (enc != -1 || enc2 != -1 || enc3 != -1 || enc4 != -1)
				return cad;
		}
		for (x=0;x < frase.length;x++) {
			aux=frase.substr(x,4);
			aux2=frase.substr(x,5);
			aux=aux.toLowerCase();
			aux2=aux2.toLowerCase();
			car=frase.substr(x,1);
			cod=frase.charCodeAt(x);
			if ((car == " " && aux != " de " && aux != " la " && aux2 != " del ") || car == "-") sw=1;
			if (sw && car != " " && car != "-") {
				if (cod > 96 && cod < 123)
					result = result + String.fromCharCode(cod - 32);
				else
					result = result + car;
				sw=0;
			}
			else {
				if (frase.charCodeAt(x) > 64 && frase.charCodeAt(x) < 91)
					result = result + String.fromCharCode(cod + 32);
				else
					result = result + car;
			}
		}
		return result;
	}
	/* Función de PHP.JS
	function urlencode(cadena) {
	
	// Esta función hará las veces del urlencode de PHP en Javascript.
	
		var resultado;
		resultado="";
		for (x=0;x<cadena.length;x++) {
			if (cadena.substr(x,1) == String.fromCharCode(13))
				resultado = resultado + "%0D";
			if (cadena.substr(x,1) == String.fromCharCode(10))
				resultado = resultado + "%0A";
			else if (cadena.substr(x,1) == String.fromCharCode(32))
				resultado = resultado + "%20";
			else
				resultado = resultado + cadena.substr(x,1);
		}
		return resultado;
	}*/
	function xor(condicion1, condicion2) {	// XOR logico
		return ((condicion1 && !condicion2) || (!condicion1 && condicion2));
	}

	/*
	 * FUNCIONES DE ENCRIPTACION EN MD5. Están en PHP.JS, por lo que lo comentamos
	 *
	
	function md5cycle(x, k) {
		var a = x[0], b = x[1], c = x[2], d = x[3];
	
		a = ff(a, b, c, d, k[0], 7, -680876936);
		d = ff(d, a, b, c, k[1], 12, -389564586);
		c = ff(c, d, a, b, k[2], 17,  606105819);
		b = ff(b, c, d, a, k[3], 22, -1044525330);
		a = ff(a, b, c, d, k[4], 7, -176418897);
		d = ff(d, a, b, c, k[5], 12,  1200080426);
		c = ff(c, d, a, b, k[6], 17, -1473231341);
		b = ff(b, c, d, a, k[7], 22, -45705983);
		a = ff(a, b, c, d, k[8], 7,  1770035416);
		d = ff(d, a, b, c, k[9], 12, -1958414417);
		c = ff(c, d, a, b, k[10], 17, -42063);
		b = ff(b, c, d, a, k[11], 22, -1990404162);
		a = ff(a, b, c, d, k[12], 7,  1804603682);
		d = ff(d, a, b, c, k[13], 12, -40341101);
		c = ff(c, d, a, b, k[14], 17, -1502002290);
		b = ff(b, c, d, a, k[15], 22,  1236535329);
	
		a = gg(a, b, c, d, k[1], 5, -165796510);
		d = gg(d, a, b, c, k[6], 9, -1069501632);
		c = gg(c, d, a, b, k[11], 14,  643717713);
		b = gg(b, c, d, a, k[0], 20, -373897302);
		a = gg(a, b, c, d, k[5], 5, -701558691);
		d = gg(d, a, b, c, k[10], 9,  38016083);
		c = gg(c, d, a, b, k[15], 14, -660478335);
		b = gg(b, c, d, a, k[4], 20, -405537848);
		a = gg(a, b, c, d, k[9], 5,  568446438);
		d = gg(d, a, b, c, k[14], 9, -1019803690);
		c = gg(c, d, a, b, k[3], 14, -187363961);
		b = gg(b, c, d, a, k[8], 20,  1163531501);
		a = gg(a, b, c, d, k[13], 5, -1444681467);
		d = gg(d, a, b, c, k[2], 9, -51403784);
		c = gg(c, d, a, b, k[7], 14,  1735328473);
		b = gg(b, c, d, a, k[12], 20, -1926607734);
	
		a = hh(a, b, c, d, k[5], 4, -378558);
		d = hh(d, a, b, c, k[8], 11, -2022574463);
		c = hh(c, d, a, b, k[11], 16,  1839030562);
		b = hh(b, c, d, a, k[14], 23, -35309556);
		a = hh(a, b, c, d, k[1], 4, -1530992060);
		d = hh(d, a, b, c, k[4], 11,  1272893353);
		c = hh(c, d, a, b, k[7], 16, -155497632);
		b = hh(b, c, d, a, k[10], 23, -1094730640);
		a = hh(a, b, c, d, k[13], 4,  681279174);
		d = hh(d, a, b, c, k[0], 11, -358537222);
		c = hh(c, d, a, b, k[3], 16, -722521979);
		b = hh(b, c, d, a, k[6], 23,  76029189);
		a = hh(a, b, c, d, k[9], 4, -640364487);
		d = hh(d, a, b, c, k[12], 11, -421815835);
		c = hh(c, d, a, b, k[15], 16,  530742520);
		b = hh(b, c, d, a, k[2], 23, -995338651);
		
		a = ii(a, b, c, d, k[0], 6, -198630844);
		d = ii(d, a, b, c, k[7], 10,  1126891415);
		c = ii(c, d, a, b, k[14], 15, -1416354905);
		b = ii(b, c, d, a, k[5], 21, -57434055);
		a = ii(a, b, c, d, k[12], 6,  1700485571);
		d = ii(d, a, b, c, k[3], 10, -1894986606);
		c = ii(c, d, a, b, k[10], 15, -1051523);
		b = ii(b, c, d, a, k[1], 21, -2054922799);
		a = ii(a, b, c, d, k[8], 6,  1873313359);
		d = ii(d, a, b, c, k[15], 10, -30611744);
		c = ii(c, d, a, b, k[6], 15, -1560198380);
		b = ii(b, c, d, a, k[13], 21,  1309151649);
		a = ii(a, b, c, d, k[4], 6, -145523070);
		d = ii(d, a, b, c, k[11], 10, -1120210379);
		c = ii(c, d, a, b, k[2], 15,  718787259);
		b = ii(b, c, d, a, k[9], 21, -343485551);
		
		x[0] = add32(a, x[0]);
		x[1] = add32(b, x[1]);
		x[2] = add32(c, x[2]);
		x[3] = add32(d, x[3]);
	}
	
	function cmn(q, a, b, x, s, t) {
		a = add32(add32(a, q), add32(x, t));
		return add32((a << s) | (a >>> (32 - s)), b);
	}
	
	function ff(a, b, c, d, x, s, t) {
		return cmn((b & c) | ((~b) & d), a, b, x, s, t);
	}
	
	function gg(a, b, c, d, x, s, t) {
		return cmn((b & d) | (c & (~d)), a, b, x, s, t);
	}
	
	function hh(a, b, c, d, x, s, t) {
		return cmn(b ^ c ^ d, a, b, x, s, t);
	}
	
	function ii(a, b, c, d, x, s, t) {
		return cmn(c ^ (b | (~d)), a, b, x, s, t);
	}
	
	function md51(s) {
		txt = '';
		var n = s.length,
		state = [1732584193, -271733879, -1732584194, 271733878], i;
		for (i=64; i<=s.length; i+=64) {
			md5cycle(state, md5blk(s.substring(i-64, i)));
		}
		s = s.substring(i-64);
		var tail = [0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0];
		for (i=0; i<s.length; i++)
			tail[i>>2] |= s.charCodeAt(i) << ((i%4) << 3);
		tail[i>>2] |= 0x80 << ((i%4) << 3);
		if (i > 55) {
			md5cycle(state, tail);
			for (i=0; i<16; i++)
				tail[i] = 0;
		}
		tail[14] = n * 8;
		md5cycle(state, tail);
		return state;
	}
	
	function md5blk(s) {
		var md5blks = [], i;
		for (i=0; i<64; i+=4) {
			md5blks[i>>2] = s.charCodeAt(i) + (s.charCodeAt(i+1) << 8) + (s.charCodeAt(i+2) << 16) + (s.charCodeAt(i+3) << 24);
		}
		return md5blks;
	}
	
	var hex_chr = '0123456789abcdef'.split('');
	
	function rhex(n)
	{
		var s='', j=0;
		for (; j < 4; j++)
			s += hex_chr[(n >> (j * 8 + 4)) & 0x0F] + hex_chr[(n >> (j * 8)) & 0x0F];
		return s;
	}
	
	function hex(x) {
		for (var i=0; i < x.length; i++)
			x[i] = rhex(x[i]);
		return x.join('');
	}
	
	function md5(s) {
		return hex(md51(s));
	}
	
	function add32(a, b) {
		return (a + b) & 0xFFFFFFFF;
	}
	
	if (md5('hello') != '5d41402abc4b2a76b9719d911017c592') {
		function add32(x, y) {
			var lsw = (x & 0xFFFF) + (y & 0xFFFF), msw = (x >> 16) + (y >> 16) + (lsw >> 16);
			return (msw << 16) | (lsw & 0xFFFF);
		}
	} */
-->

