//<script>
function MM_openBrWindow(theURL,winName,features) { //v2.0
window.open(theURL,winName,features);
}
/*-----------------------------------------*/
function apriFinestra(name, larghezza, altezza){
	var x = (screen.width - larghezza)/2;
	var y = (screen.height - altezza)/2;
	var finestra = window.open(name, 'ingrandimento', 'width=' + larghezza +',height=' + altezza + ', toolbar=no, directories=no, location=no, status=no, menubar=no, copyhistory=no, scrollbars=no, resizable=no');
	finestra.moveTo(x,y);
	finestra.focus();
}// fine funzione
/*-----------------------------------------*/
function login_accedi(){
	with(document.forms['entrata']){
		if(UNAME.value.length<=2){
			alert('Username non valido!');
			UNAME.focus();
			return;
		}//fine if
		if(PASSWD.value.length<=2){
			alert('Password non valida!');
			PASSWD.focus();
			return;
		}//fine if
		submit();
	}// fine with
}// fine funzione

/*-----------------------------------------*/
function login_accedi_lingua(lingua){
	var msg_username
	var msg_nome
	switch(lingua){
		case 2:
			msg_username='Username not valid!';	
			msg_psw='Password not valid!';	
		break;
		default:
			msg_username='Username non valido!';	
			msg_psw='Password non valida!';	
		break;	
	}//end switch

	with(document.forms['entrata']){
		if(UNAME.value.length<=2){
			alert(msg_username);
			UNAME.focus();
			return;
		}//fine if
		if(PASSWD.value.length<=2){
			alert(msg_psw);
			PASSWD.focus();
			return;
		}//fine if
		submit();
	}// fine with
}// fine funzione

/*-----------------------------------------*/
function registra_registra(lingua){
	var msg_username
	var msg_nome
	var msg_cognome
	var msg_email
	var msg_domanda
	var msg_risposta
	var msg_legge
	switch(lingua){
		case 2:
			msg_username='Username not valid!';	
			msg_nome='Name not valid!';	
			msg_cognome='Surname not valid!';	
			msg_email="The E-mail address is not valid (nome@dominio).";
			msg_domanda='Select a question!';
			msg_risposta='Answer not valid!';
			msg_legge="";		break;
		default:
			msg_username='Username non valido!';	
			msg_nome='Nome non valido!';	
			msg_cognome='Cognome non valido!';	
			msg_email="L'indirizzo di e-mail deve essere nel formato nome@dominio.";
			msg_domanda='Selezionare una domanda!';
			msg_risposta='Risposta non valida!';
			msg_legge="Non avete dato il consenso al D.Lgs 196/2003";
		break;	
	}//end switch
	with(document.forms['registra']){

		if(utenUsername.value==''){
			alert(msg_username);
			utenUsername.focus();
			return;
		}//fine if
		if(utenNome.value==''){
			alert(msg_nome);
			utenNome.focus();
			return;
		}//fine if

		if(utenCognome.value==''){
			alert(msg_cognome);
			utenCognome.focus();
			return;
		}//fine if

		if (utenEmail.value.search(/^\w+([\.\-]\w+)*@\w+([\.\-]\w+)*\.\w+$/) == -1) {
			alert(msg_email);
			utenEmail.focus();
			return;
		}//fine if

		if(utenDomanda.selectedIndex == 0){
			alert(msg_domanda);
			utenDomanda.focus();
			return;
		}//fine if

		if(utenRisposta.value==''){
			alert(msg_risposta);
			utenRisposta.focus();
			return;
		}//fine if
		// legge
		if (lingua==1){
		if (!legge.checked){
			alert(msg_legge);
			legge.focus();
			return;
		}//end if
		}//end if
		submit();
	}// fine with
}// fine funzione
/*-----------------------------------------*/

function registra_e_iscrivi(lingua){
	var msg_username
	var msg_nome
	var msg_cognome
	var msg_email
	var msg_domanda
	var msg_risposta
	var msg_legge
	switch(lingua){
		case 2:
			msg_username='Username not valid!';	
			msg_nome='Name not valid!';	
			msg_cognome='Surname not valid!';	
			msg_email="The E-mail address is not valid (nome@dominio).";
			msg_domanda='Select a question!';
			msg_risposta='Answer not valid!';
			msg_legge="";
			msg1="Per procedere devi acconsentire la Lex 196/2003.";
			msg2="Select a theme!";
			msg_utilizzato=" Già utilizzato, inserirne uno differente!";
				break;
		default:
			msg_username='Username non valido!';	
			msg_nome='Nome non valido!';	
			msg_cognome='Cognome non valido!';	
			msg_email="L'indirizzo di e-mail deve essere nel formato nome@dominio.";
			msg_domanda='Selezionare una domanda!';
			msg_risposta='Risposta non valida!';
			msg_legge="Non avete dato il consenso al D.Lgs 196/2003";
			msg1="Per procedere devi acconsentire la Legge 196/2003.";
			msg2="Selezionare un tema!";
			msg_utilizzato=" già utilizzato, inserirne uno differente!";
		break;	
	}//end switch
	with(document.forms['registra']){
		if(utenUsername.value==''){
			alert(msg_username);
			utenUsername.focus();
			return;
		}//fine if
		
		var usernameUsato = 0;
		for(var i = 0; i < arrayUser.length; i++){
			if(arrayUser[i]==hex_md5(utenUsername.value)){
				usernameUsato=1;
			}//fine if
		}// fine for
		if(usernameUsato==1){
			alert("Username:" + utenUsername.value + " " + msg_utilizzato);
			utenUsername.focus();
			return;
		} //end if

		if(utenNome.value==''){
			alert(msg_nome);
			utenNome.focus();
			return;
		}//fine if

		if(utenCognome.value==''){
			alert(msg_cognome);
			utenCognome.focus();
			return;
		}//fine if

		if (utenEmail.value.search(/^\w+([\.\-]\w+)*@\w+([\.\-]\w+)*\.\w+$/) == -1) {
			alert(msg_email);
			utenEmail.focus();
			return;
		}//fine if
		
	// controllo che venga selezionata almeno un tema
			var selezionato=false;
			for (i=0;i<document.forms['registra'].elements.length;i++)
				if (document.forms['registra'].elements[i].name.substring(0,9)=="MailFTemi")
					if (document.forms['registra'].elements[i].checked)
						selezionato=true;
			if (!selezionato) {
				if(lingua=2){
					alert(msg2);
				}else{
					alert(msg2);
				}
				return;
			}//end if		

		if(utenDomanda.selectedIndex == 0){
			alert(msg_domanda);
			utenDomanda.focus();
			return;
		}//fine if

		if(utenRisposta.value==''){
			alert(msg_risposta);
			utenRisposta.focus();
			return;
		}//fine if
		// legge
		if (lingua==1){
		if (!legge.checked){
			alert(msg_legge);
			legge.focus();
			return;
		}//end if
		}//end if
		//op.value='registra';
		submit();
	}// fine with
}// fine funzione
/*-----------------------------------------*/

/*-----------------------------------------*/
function step00(lingua){
	var msg
	switch(lingua){
		case 2:
		msg='Select a Accreditation Type!';
		break;
		default:
		msg='Selezionare una tipologia!';
		break;
	}
	with(document.forms['tipologia']){

		if(serialeTipo.selectedIndex == 0){
			alert(msg);
			serialeTipo.focus();
			return;
		}//fine if
		descrizione.value = serialeTipo.options[serialeTipo.selectedIndex].text;
		op2.value = 'step01';
		submit();
	}// fine with
}// fine funzione
/*-----------------------------------------*/
function step01(lingua){
	var msg1,msg2,msg3,msg4,msg5,msg6,msg7,msg8,msg9,msg10
	switch(lingua){
		case 2:
		msg1='Choose country!';
		msg2='Add surname!';
		msg3='Add name!';
		msg4='Add passport!';
		msg5="Email address not correct!";
		msg6='Choose nationality';
		msg7='Date not correct';
		msg8='Add sport!';
		msg9='Insert text in another field!';
		msg10='Add your role!';
		break;
		default:
		msg1='Selezionare una nazione!';
		msg2='Inserire cognome!';
		msg3='Inserire nome!';
		msg4='Inserire passaporto!';
		msg5="L'indirizzo di e-mail deve essere nel formato nome@dominio.";
		msg6='Selezionare una nazionalità';
		msg7='Inserire la data correttamente!';
		msg8='Non è stata specificato alcun Sport!';
		msg9='Campo Altro obbligatorio';
		msg10='Non è stata specificato alcun Ruolo!';
		break;
	}
	with(document.forms['tipologia']){

		if(adm.value == 1 && serialeNazione.selectedIndex == 0){
			alert(msg1);
			serialeNazione.focus();
			return;
		}//fine if

		if(cognome.value == ''){
			alert(msg2);
			cognome.focus();
			return;
		}//fine if

		if(nome.value == ''){
			alert(msg3);
			nome.focus();
			return;
		}//fine if

		if(numeroPassaporto.value == ''){
			alert(msg4);
			numeroPassaporto.focus();
			return;
		}//fine if

		if(email.value != ''){
			if (email.value.search(/^\w+([\.\-]\w+)*@\w+([\.\-]\w+)*\.\w+$/) == -1) {
				alert(msg5);
				email.focus();
				return;
			}// fine if
		}// fine if

		if(nazionalita.selectedIndex == 0){
			alert(msg6);
			nazionalita.focus();
			return;
		}//fine if

		if(!VerificaData(dataNascita.value)){
			alert(msg7);
			dataNascita.focus();
			return;
		}//fine if

		//alert(eval('document.forms[\'tipologia\'].chksport'));
		if(eval('document.forms[\'tipologia\'].chksport') != undefined){
			// controllo che venga selezionata almeno un gruppo
			var selezionatoSport = false;
			for (i=0;i<document.forms['tipologia'].elements.length;i++){
				if (document.forms['tipologia'].elements[i].name.substring(0,5)=="sport" && document.forms['tipologia'].elements[i].checked){
					selezionatoSport = true;
				}// fine if
			}// fine for
			if (selezionatoSport == false) {
				alert(msg8);
				return;
			}//fine if
		}// fine if

		//alert(eval('document.forms[\'tipologia\'].chkruolo'));
		if(eval('document.forms[\'tipologia\'].chkruolo') != undefined){
			// controllo che venga selezionata almeno un gruppo
			var selezionatoRuolo = false;
			for (i=0;i<document.forms['tipologia'].elements.length;i++){
				if (document.forms['tipologia'].elements[i].name.substring(0,5)=="ruolo" && document.forms['tipologia'].elements[i].checked){
					selezionatoRuolo = true;
					// controllo campo other
					if((document.forms['tipologia'].elements[i].value == 9 || document.forms['tipologia'].elements[i].value == 3) && altriRuoli.value ==''){
						alert(msg9);
						altriRuoli.focus();
						return;
					}// fine if
				}// fine if
			}// fine for
			if (selezionatoRuolo == false) {
				alert(msg10);
				return;
			}//fine if
		}// fine if

		op2.value = 'step03';
		submit();
	}// fine with
}// fine funzione
/*-----------------------------------------*/
function VerificaData(Valore) {
	var ValoriData;
	var Giorni = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
	var iData = new RegExp("^((3[0-1])|([1-2][0-9])|(0[1-9]))\/((1[0-2])|(0[1-9]))\/((19|20)[0-9][0-9])$");
	// verifica la validita' della data

	if(iData.test(Valore) == true){
		//	if (Valore.search(/^(3[01]|[0-2]\d)\/(1[0-2]|0\d)\/(19|20)\d\d$/) != -1 && Valore.lenght == 10) {
		// imposta il vettore dei valori
		ValoriData = Valore.split("/");
		// verifica se l'anno e' bisestile aggiungo 1 a febbraio
		if (ValoriData[2] % 4 == 0){
			Giorni[1]++;
		}// fine if
		//		alert(ValoriData[0] + '---|' + (ValoriData[1] - 1) + '|---' + Giorni[ValoriData[1] - 1] + '///' + (ValoriData[0] <= Giorni[ValoriData[1] - 1]) );
		return (ValoriData[0] <= Giorni[ValoriData[1] - 1]);
	}// fine if
	// in caso di errore ritorna false
	return false;
}//end function
/*-----------------------------------------*/
function eliminaRiga(seriale,lingua){
	var msg
	switch(lingua){
		case '2':
		msg='Delete the Row! Are you sure?';
		break;
		default:
		msg='Sei sicuro di volere eliminare questa riga?';
		break;
	}
	with (document.forms[0]) {
		if(!confirm(msg)){
			return;
		}
		COMANDO.value="elimina";
		SERIALE.value=seriale;

		submit();
	}
}//end function
/*-----------------------------------------*/
function getTime(lingua) {
	now = new Date();
	y2k = new Date("Jul 3 2005 20:00:00");
	days = (y2k - now) / 1000 / 60 / 60 / 24;
	daysRound = Math.floor(days);
	hours = (y2k - now) / 1000 / 60 / 60 - (24 * daysRound);
	hoursRound = Math.floor(hours);
	minutes = (y2k - now) / 1000 /60 - (24 * 60 * daysRound) - (60 * hoursRound);
	minutesRound = Math.floor(minutes);
	seconds = (y2k - now) / 1000 - (24 * 60 * 60 * daysRound) - (60 * 60 * hoursRound) - (60 * minutesRound);
	secondsRound = Math.round(seconds);
	if(lingua == 1){
		sec = (secondsRound == 1) ? " secondo a Lignano 2005" : " secondi a Lignano 2005!";
		min = (minutesRound == 1) ? " minuto" : " minuti, ";
		hr = (hoursRound == 1) ? " ora" : " ore, ";
		dy = (daysRound == 1)  ? " giorno" : " giorni, ";
		mancano = "Mancano ";
	}
	else{
		sec = (secondsRound == 1) ? " second to Lignano 2005" : " seconds to Lignano 2005!";
		min = (minutesRound == 1) ? " minute" : " minutes, ";
		hr = (hoursRound == 1) ? " hour" : " hours, ";
		dy = (daysRound == 1)  ? " day" : " days, ";
		mancano = "Still ";
	}// fine if
	//document.bannerform.input1.value = mancano + daysRound  + dy + hoursRound + hr + minutesRound + min + secondsRound + sec;

	newtime = window.setTimeout("getTime(" + lingua + ");", 1000);
}// fine funzione
/*-----------------------------------------*/
function inviaModulo(lingua){
	// Italiano
	var testi1 = new Array(
	'Devi inserire il nome',
	'Devi inserire il cognome',
	'Devi inserire la via',
	'Devi inserire il CAP in modo corretto',
	'Devi inserire il comune',
	'Devi inserire la provincia',
	'Devi inserire un numero telefonico corretto\nFormato: pref. int./pref./numero',
	'Devi inserire un numero di cell corretto\nFormato: pref. int./pref./numero',
	'Devi inserire l\'indirizzo email in maniera corretta\nFormato: nome@dominio.xx',
	'Devi inserire una data corretta\nFormato: gg/mm/aaaa',
	'Devi inserire il luogo di nascita',
	'Non avete dato il consenso alla Legge 196/2003',
	'Devi inserire il telefono o il cellulare'
	);
	// Inglese
	var testi2 = new Array(
	'Insert the name',
	'Insert the surname',
	'Insert the street',
	'Insert a correct postal code ',
	'Insert the zone',
	'Insert the province',
	'Insert a correct telephone number\nFormat: pref. int./pref./number',
	'Insert a correct cellular number\nFormat: pref. int./pref./number',
	'Insert email address correctly\nFormat: name@dom.xx',
	'Insert a date\nFormat: dd/mm/YYYY',
	'Insert the birth place',
	'Non avete dato il consenso alla Legge 196/2003',
	'Insert the telephone number or the cellular number'
	);

	with(document.forms['richiedi']){

		// nome
		if(nome.value==''){
			alert(eval('testi' + lingua  + '[0]'));
			nome.focus();
			return;
		}//fine if

		// cognome
		if(cognome.value==''){
			alert(eval('testi' + lingua  + '[1]'));
			cognome.focus();
			return;
		}//fine if

		// Data nascita
		if(!VerificaData(nascita_data.value)){
			alert(eval('testi' + lingua  + '[9]'));
			nascita_data.focus();
			return;
		}//fine if

		// Luogo nascita
		if(nascita_luogo.value==''){
			alert(eval('testi' + lingua  + '[10]'));
			nascita_luogo.focus();
			return;
		}//fine if

		// Via
		if(res_via.value==''){
			alert(eval('testi' + lingua  + '[2]'));
			res_via.focus();
			return;
		}//fine if

		// Cap
		var i=new RegExp("^[0-9]{5}$");
		if(!i.test(res_cap.value)){
			alert(eval('testi' + lingua  + '[3]'));
			res_cap.focus();
			return;
		}//fine if

		// Comune
		if(res_comune.value==''){
			alert(eval('testi' + lingua  + '[4]'));
			res_comune.focus();
			return;
		}//fine if

		// Provincia
		if(res_provincia.value==''){
			alert(eval('testi' + lingua  + '[5]'));
			res_provincia.focus();
			return;
		}//fine if

		if(res_tel.value=='' && res_cell.value==''){
			alert(eval('testi' + lingua  + '[12]'));
			res_tel.focus();
			return;
		}//fine if


		// Telefono
		if(res_tel.value!=''){
			var i=new RegExp("^[\+]?([0-9]{2,})?(-| |\/)?([0-9]{2,})(-| |\/)?([0-9]{4,})$");
			if(!i.test(res_tel.value)){
				alert(eval('testi' + lingua  + '[6]'));
				res_tel.focus();
				return;
			}//fine if
		}//fine if

		// Cell
		if(res_cell.value!=''){
			var i=new RegExp("^[\+]?([0-9]{2,})?(-| |\/)?([0-9]{2,})(-| |\/)?([0-9]{4,})$");
			if(!i.test(res_cell.value)){
				alert(eval('testi' + lingua  + '[7]'));
				res_cell.focus();
				return;
			}//fine if
		}//fine if

		// Mail
		if (res_email.value.search(/^\w+([\.\-]\w+)*@\w+([\.\-]\w+)*\.\w+$/) == -1) {
			alert(eval('testi' + lingua  + '[8]'));
			res_email.focus();
			return;
		}//fine if

		// Data Documento Identità
		if(docIden_data.value != ''){
			if(!VerificaData(docIden_data.value)){
				alert(eval('testi' + lingua  + '[9]'));
				docIden_data.focus();
				return;
			}//fine if
		}//fine if

		// Data Patente
		if(patente_data.value != ''){
			if(!VerificaData(patente_data.value)){
				alert(eval('testi' + lingua  + '[9]'));
				patente_data.focus();
				return;
			}//fine if
		}//fine if

		// Legge
		if(!legge.checked && lingua == 1 ){
			alert(eval('testi' + lingua  + '[11]'));
			legge.focus();
			return;
		}// fine if

		op2.value='ok';
		submit();
	}// fine with
}// fine funzione

/*-----------------------------------------
funzione applicata al modulo ricerca
-----------------------------------------*/
function ricerca(lingua) {
	
	// Italiano
	var testi1 = new Array(
	'Devi inserire una stringa per la ricerca' // 0
	);
	// Inglese
	var testi2 = new Array(
	'Devi inserire una stringa per la ricerca'
	);

	//with(document.forms[0]){
	with(document.forms['ricercaForm']){
		if(l_stRicerca.value==''){
			alert(eval('testi' + lingua  + '[0]'));
			l_stRicerca.focus();
			return;
		}//fine if
		submit();
	}// fine with
}// fine funzione


function contattaci(lingua){
	// Italiano
	var testi1 = new Array(
	'Devi inserire il nome',
	'Devi inserire il cognome',
	'Devi inserire l\'indirizzo email in maniera corretta\nFormato: nome@dominio.xx',
	'Devi inserire un testo',
	'Non avete dato il consenso alla Legge 196/2003'
	);
	// Inglese
	var testi2 = new Array(
	'Insert the name!',
	'Insert the surname',
	'E-mail format not correct\nFormat: name@dom.xx',
	'Insert a text message',
	'You have to allow the treatment of personal data'
	);
	with(document.forms['Contattaci']){
		// Nome
		if(frm_nome.value==''){
			alert(eval('testi' + lingua  + '[0]'));
			frm_nome.focus();
			return;
		}//fine if
		// Cognome
		if(frm_cognome.value==''){
			alert(eval('testi' + lingua  + '[1]'));
			frm_cognome.focus();
			return;
		}//fine if
		// Mail
		if (frm_email.value.search(/^\w+([\.\-]\w+)*@\w+([\.\-]\w+)*\.\w+$/) == -1) {
			alert(eval('testi' + lingua  + '[2]'));
			frm_email.focus();
			return;
		}//fine if
		// Cognome
		if(frm_mess.value==''){
			alert(eval('testi' + lingua  + '[3]'));
			frm_mess.focus();
			return;
		}//fine if
		// Legge
//		if(lingua == 1 ){
			if(!frm_legge.checked){
				alert(eval('testi' + lingua  + '[4]'));
				frm_legge.focus();
				return;
			}// fine if
//		}// fine if
		frm_op.value = 'ok';
		submit();
	}// fine with
}// fine funzione


function lavoro(lingua){
	// Italiano
	var testi1 = new Array(
	'Devi inserire il nome',
	'Devi inserire il cognome',
	'Devi inserire l\'indirizzo email in maniera corretta\nFormato: nome@dominio.xx',
	'Non avete dato il consenso alla Legge 196/2003',
	'Devi inserire una data corretta\nFormato: gg/mm/aaaa'
	);

	// Inglese
	var testi2 = new Array(
	'Insert the name',
	'Insert the surname',
	'Insert the email address in the correct format\nFormat: name@dom.xx',
	'Non avete dato il consenso alla Legge 196/2003',
	'Insert a data\nFormat: dd/mm/YYYY'
	);

	with(document.forms[0]){

		// Nome
		if(frm_nome.value==''){
			alert(eval('testi' + lingua  + '[0]'));
			frm_nome.focus();
			return;
		}//fine if

		// Cognome
		if(frm_cognome.value==''){
			alert(eval('testi' + lingua  + '[1]'));
			frm_cognome.focus();
			return;
		}//fine if

		// Data nascita
		if(!VerificaData(frm_nasc_data.value)){
			alert(eval('testi' + lingua  + '[4]'));
			frm_nasc_data.focus();
			return;
		}//fine if

		// Mail
		if (frm_email.value.search(/^\w+([\.\-]\w+)*@\w+([\.\-]\w+)*\.\w+$/) == -1) {
			alert(eval('testi' + lingua  + '[2]'));
			frm_email.focus();
			return;
		}//fine if

		// Legge
		if(!frm_legge.checked && lingua == 1 ){
			alert(eval('testi' + lingua  + '[3]'));
			frm_legge.focus();
			return;
		}// fine if

		frm_op.value = 'ok';
		submit();

	}// fine with
}// fine if






/*#######################################################################*/
/*INIZIO FUNZIONI PER MD5 PER IL JAVASCRIPT*/
/*#######################################################################*/
var hexcase = 0;  /* hex output format. 0 - lowercase; 1 - uppercase        */
var b64pad  = ""; /* base-64 pad character. "=" for strict RFC compliance   */
var chrsz   = 8;  /* bits per input character. 8 - ASCII; 16 - Unicode      */

function hex_md5(s){ return binl2hex(core_md5(str2binl(s), s.length * chrsz));}
function b64_md5(s){ return binl2b64(core_md5(str2binl(s), s.length * chrsz));}
function str_md5(s){ return binl2str(core_md5(str2binl(s), s.length * chrsz));}
function hex_hmac_md5(key, data) { return binl2hex(core_hmac_md5(key, data)); }
function b64_hmac_md5(key, data) { return binl2b64(core_hmac_md5(key, data)); }
function str_hmac_md5(key, data) { return binl2str(core_hmac_md5(key, data)); }
/*
 * Perform a simple self-test to see if the VM is working
 */
function md5_vm_test()
{
  return hex_md5("abc") == "900150983cd24fb0d6963f7d28e17f72";
}
/*
 * Calculate the MD5 of an array of little-endian words, and a bit length
 */
function core_md5(x, len)
{
  /* append padding */
  x[len >> 5] |= 0x80 << ((len) % 32);
  x[(((len + 64) >>> 9) << 4) + 14] = len;

  var a =  1732584193;
  var b = -271733879;
  var c = -1732584194;
  var d =  271733878;

  for(var i = 0; i < x.length; i += 16)
  {
    var olda = a;
    var oldb = b;
    var oldc = c;
    var oldd = d;
    a = md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936);
    d = md5_ff(d, a, b, c, x[i+ 1], 12, -389564586);
    c = md5_ff(c, d, a, b, x[i+ 2], 17,  606105819);
    b = md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330);
    a = md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897);
    d = md5_ff(d, a, b, c, x[i+ 5], 12,  1200080426);
    c = md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341);
    b = md5_ff(b, c, d, a, x[i+ 7], 22, -45705983);
    a = md5_ff(a, b, c, d, x[i+ 8], 7 ,  1770035416);
    d = md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417);
    c = md5_ff(c, d, a, b, x[i+10], 17, -42063);
    b = md5_ff(b, c, d, a, x[i+11], 22, -1990404162);
    a = md5_ff(a, b, c, d, x[i+12], 7 ,  1804603682);
    d = md5_ff(d, a, b, c, x[i+13], 12, -40341101);
    c = md5_ff(c, d, a, b, x[i+14], 17, -1502002290);
    b = md5_ff(b, c, d, a, x[i+15], 22,  1236535329);
    a = md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510);
    d = md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632);
    c = md5_gg(c, d, a, b, x[i+11], 14,  643717713);
    b = md5_gg(b, c, d, a, x[i+ 0], 20, -373897302);
    a = md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691);
    d = md5_gg(d, a, b, c, x[i+10], 9 ,  38016083);
    c = md5_gg(c, d, a, b, x[i+15], 14, -660478335);
    b = md5_gg(b, c, d, a, x[i+ 4], 20, -405537848);
    a = md5_gg(a, b, c, d, x[i+ 9], 5 ,  568446438);
    d = md5_gg(d, a, b, c, x[i+14], 9 , -1019803690);
    c = md5_gg(c, d, a, b, x[i+ 3], 14, -187363961);
    b = md5_gg(b, c, d, a, x[i+ 8], 20,  1163531501);
    a = md5_gg(a, b, c, d, x[i+13], 5 , -1444681467);
    d = md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784);
    c = md5_gg(c, d, a, b, x[i+ 7], 14,  1735328473);
    b = md5_gg(b, c, d, a, x[i+12], 20, -1926607734);
    a = md5_hh(a, b, c, d, x[i+ 5], 4 , -378558);
    d = md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463);
    c = md5_hh(c, d, a, b, x[i+11], 16,  1839030562);
    b = md5_hh(b, c, d, a, x[i+14], 23, -35309556);
    a = md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060);
    d = md5_hh(d, a, b, c, x[i+ 4], 11,  1272893353);
    c = md5_hh(c, d, a, b, x[i+ 7], 16, -155497632);
    b = md5_hh(b, c, d, a, x[i+10], 23, -1094730640);
    a = md5_hh(a, b, c, d, x[i+13], 4 ,  681279174);
    d = md5_hh(d, a, b, c, x[i+ 0], 11, -358537222);
    c = md5_hh(c, d, a, b, x[i+ 3], 16, -722521979);
    b = md5_hh(b, c, d, a, x[i+ 6], 23,  76029189);
    a = md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487);
    d = md5_hh(d, a, b, c, x[i+12], 11, -421815835);
    c = md5_hh(c, d, a, b, x[i+15], 16,  530742520);
    b = md5_hh(b, c, d, a, x[i+ 2], 23, -995338651);
    a = md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844);
    d = md5_ii(d, a, b, c, x[i+ 7], 10,  1126891415);
    c = md5_ii(c, d, a, b, x[i+14], 15, -1416354905);
    b = md5_ii(b, c, d, a, x[i+ 5], 21, -57434055);
    a = md5_ii(a, b, c, d, x[i+12], 6 ,  1700485571);
    d = md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606);
    c = md5_ii(c, d, a, b, x[i+10], 15, -1051523);
    b = md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799);
    a = md5_ii(a, b, c, d, x[i+ 8], 6 ,  1873313359);
    d = md5_ii(d, a, b, c, x[i+15], 10, -30611744);
    c = md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380);
    b = md5_ii(b, c, d, a, x[i+13], 21,  1309151649);
    a = md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070);
    d = md5_ii(d, a, b, c, x[i+11], 10, -1120210379);
    c = md5_ii(c, d, a, b, x[i+ 2], 15,  718787259);
    b = md5_ii(b, c, d, a, x[i+ 9], 21, -343485551);
    a = safe_add(a, olda);
    b = safe_add(b, oldb);
    c = safe_add(c, oldc);
    d = safe_add(d, oldd);
  }
  return Array(a, b, c, d);
}

/*
 * These functions implement the four basic operations the algorithm uses.
 */
function md5_cmn(q, a, b, x, s, t){
  return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s),b);
}
function md5_ff(a, b, c, d, x, s, t){
  return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
}
function md5_gg(a, b, c, d, x, s, t){
  return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
}
function md5_hh(a, b, c, d, x, s, t){
  return md5_cmn(b ^ c ^ d, a, b, x, s, t);
}
function md5_ii(a, b, c, d, x, s, t){
  return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
}
/*
 * Calculate the HMAC-MD5, of a key and some data
 */
function core_hmac_md5(key, data){
  var bkey = str2binl(key);
  if(bkey.length > 16) 
  	bkey = core_md5(bkey, key.length * chrsz);
  var ipad = Array(16), opad = Array(16);
  for(var i = 0; i < 16; i++)  {
    ipad[i] = bkey[i] ^ 0x36363636;
    opad[i] = bkey[i] ^ 0x5C5C5C5C;
  }
  var hash = core_md5(ipad.concat(str2binl(data)), 512 + data.length * chrsz);
  return core_md5(opad.concat(hash), 512 + 128);
}
/*
 * Add integers, wrapping at 2^32. This uses 16-bit operations internally
 * to work around bugs in some JS interpreters.
 */
function safe_add(x, y){
  var lsw = (x & 0xFFFF) + (y & 0xFFFF);
  var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
  return (msw << 16) | (lsw & 0xFFFF);
}
/*
 * Bitwise rotate a 32-bit number to the left.
 */
function bit_rol(num, cnt){
  return (num << cnt) | (num >>> (32 - cnt));
}
/*
 * Convert a string to an array of little-endian words
 * If chrsz is ASCII, characters >255 have their hi-byte silently ignored.
 */
function str2binl(str){
  var bin = Array();
  var mask = (1 << chrsz) - 1;
  for(var i = 0; i < str.length * chrsz; i += chrsz)
    bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (i%32);
  return bin;
}
/*
 * Convert an array of little-endian words to a string
 */
function binl2str(bin){
  var str = "";
  var mask = (1 << chrsz) - 1;
  for(var i = 0; i < bin.length * 32; i += chrsz)
    str += String.fromCharCode((bin[i>>5] >>> (i % 32)) & mask);
  return str;
}
/*
 * Convert an array of little-endian words to a hex string.
 */
function binl2hex(binarray){
  var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
  var str = "";
  for(var i = 0; i < binarray.length * 4; i++)
  {
    str += hex_tab.charAt((binarray[i>>2] >> ((i%4)*8+4)) & 0xF) +
           hex_tab.charAt((binarray[i>>2] >> ((i%4)*8  )) & 0xF);
  }
  return str;
}
/*
 * Convert an array of little-endian words to a base-64 string
 */
function binl2b64(binarray){
  var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  var str = "";
  for(var i = 0; i < binarray.length * 4; i += 3)
  {
    var triplet = (((binarray[i   >> 2] >> 8 * ( i   %4)) & 0xFF) << 16)
                | (((binarray[i+1 >> 2] >> 8 * ((i+1)%4)) & 0xFF) << 8 )
                |  ((binarray[i+2 >> 2] >> 8 * ((i+2)%4)) & 0xFF);
    for(var j = 0; j < 4; j++)
    {
      if(i * 8 + j * 6 > binarray.length * 32) str += b64pad;
      else str += tab.charAt((triplet >> 6*(3-j)) & 0x3F);
    }
  }
  return str;
}
/*#######################################################################*/
/*FINE FUNZIONI PER MD5*/
/*#######################################################################*/