
var XMLHTTP;
var flag=0;
//**************** INIZIO: VALIDAZIONE INVITO******************	

function validainvito() {
     // Variabili associate ai campi del modulo
	 
	 var Mail = document.invito.invitomail.value;
	 
	 document.getElementById('erroretitolo').style.visibility = "Hidden";
	 var indirizzo = document.location.href;
	 

     
	 indirizzo=indirizzo.replace("?invita=true","");

	 var flag=0;
	 
	 
	 
        if (ControlloEmail(Mail)==false) {
		   document.getElementById('erroretitolo').style.visibility = "visible";
		   document.getElementById('erroretitolo').innerHTML = wrongmail;
		   flag=1;
        }

	  if (flag==0) {
		   document.invito.action = indirizzo+"?invita=true";
           return true;
		   
        }
		return false;
  }

 //**************** FINE: VALIDAZIONE INVITO******************
//**************** INIZIO: CONTROLLO FORM   MODIFICA UTENTI ******************	

function validaMod(validFirstrname,validLastname,validstate,validProvincia,validzipCap,validCity,validaddress,validhomeNumber,validcell,validfax,validofficeNumber,validdate,validjob,validSesso,validstato_civile,validdes,validfoto) {


flag=0;


      if (validFirstrname==1) {
	 document.getElementById('errore_firstrname').style.visibility = "Hidden";
	 var Firstrname = trim(document.registrazione.Firstrname.value);
	 if ((Firstrname == "") || (Firstrname == "undefined")) {
		   document.getElementById('errore_firstrname').style.visibility = "visible";
           flag=1;
        }
	}
	
	if (validLastname==1) {
	 document.getElementById('errore_lastname').style.visibility = "Hidden";
	 var Lastname = trim(document.registrazione.Lastname.value);
		if ((Lastname == "") || (Lastname == "undefined")) {
		   document.getElementById('errore_lastname').style.visibility = "visible";
           flag=1;
        }
	}
	
	if (validstate==1) {
	  document.getElementById('errore_state').style.visibility = "Hidden";
	 var state = trim(document.registrazione.State.value);
		if ((state == "") || (state == "undefined")) {
		   document.getElementById('errore_state').style.visibility = "visible";
           flag=1;
        }
	}
	
	if (validProvincia==1) {
	 document.getElementById('errore_provincia').style.visibility = "Hidden";
	 var Provincia = trim(document.registrazione.Provincia.value);
		if ((Provincia == "") || (Provincia == "undefined")) {
           document.getElementById('errore_provincia').style.visibility = "visible";
           flag=1;
        }
	}


	if (validzipCap==1) {
	 document.getElementById('errore_ZipCap').style.visibility = "Hidden";
	 var zipCap = trim(document.registrazione.ZipCap.value);
		if ((zipCap == "") || (zipCap == "undefined")) {
           document.getElementById('errore_ZipCap').style.visibility = "visible";
           flag=1;
        }
	}	
	
	if (validCity==1) {
	 document.getElementById('errore_city').style.visibility = "Hidden";
	 var City = trim(document.registrazione.City.value);
		if ((City == "") || (City == "undefined")) {
           document.getElementById('errore_city').style.visibility = "visible";
           flag=1;
        }
	}	
	
	if (validaddress==1) {
	 document.getElementById('errore_address').style.visibility = "Hidden";
	  var address = trim(document.registrazione.address.value);
		if ((address == "") || (address == "undefined")) {
           document.getElementById('errore_address').style.visibility = "visible";
           flag=1;
        }
	}	
	
	if (validhomeNumber==1) {
	 document.getElementById('errore_homeNumber').style.visibility = "Hidden";
	 var homeNumber = trim(document.registrazione.homeNumber.value);
		if ((homeNumber == "") || (homeNumber == "undefined")) {
		   document.getElementById('errore_homeNumber').style.visibility = "visible";
           flag=1;
        }
	}	
	
	if (validcell==1) {
	 document.getElementById('errore_cell').style.visibility = "Hidden";
	  var cell = trim(document.registrazione.cell.value);
		if ((cell == "") || (cell == "undefined")) {
		   document.getElementById('errore_cell').style.visibility = "visible";
           flag=1;
        }
	}	
	
	if (validfax==1) {
	 document.getElementById('errore_fax').style.visibility = "Hidden";
	  var fax = trim(document.registrazione.fax.value);
		if ((fax == "") || (fax == "undefined")) {
		   document.getElementById('errore_fax').style.visibility = "visible";
           flag=1;
        }
	}	
	
	if (validofficeNumber==1) {
	 document.getElementById('errore_officeNumber').style.visibility = "Hidden";
	 var officeNumber = trim(document.registrazione.officeNumber.value);
		if ((officeNumber == "") || (officeNumber == "undefined")) {
		   document.getElementById('errore_officeNumber').style.visibility = "visible";
           flag=1;
        }
	}	
	
	if (validdate==1) {
	 document.getElementById('errore_data').style.visibility = "Hidden";
	 var giorno = trim(document.registrazione.giorno.value);
	 var mese = trim(document.registrazione.mese.value);
	 var anno = trim(document.registrazione.anno.value);
		if ((giorno == "") || (giorno == "undefined")) {
           document.getElementById('errore_data').style.visibility = "visible";
           flag=1;
        }
		
		if ((mese == "") || (mese == "undefined")) {
           document.getElementById('errore_data').style.visibility = "visible";
           flag=1;
        }
		
		if ((anno == "") || (anno == "undefined")) {
           document.getElementById('errore_data').style.visibility = "visible";
           flag=1;
        }
	}	
	
	if (validjob==1) {
	 document.getElementById('errore_job').style.visibility = "Hidden";
	 var job = trim(document.registrazione.job.value);
		if ((job == "") || (job == "undefined")) {
		   document.getElementById('errore_job').style.visibility = "visible";
           flag=1;
        }
	}	
	
	
	if (validSesso==1) {
	 document.getElementById('errore_sesso').style.visibility = "Hidden";
	 var Sesso = trim(document.registrazione.Sesso.value);
		if ((Sesso == "") || (Sesso == "undefined")) {
           document.getElementById('errore_sesso').style.visibility = "visible";
           flag=1;
        }
	}	
	
	if (validstato_civile==1) {
	 document.getElementById('errore_stato_civile').style.visibility = "Hidden";
	 var stato_civile = trim(document.registrazione.stato_civile.value);
		if ((stato_civile == "") || (stato_civile == "undefined")) {
           document.getElementById('errore_stato_civile').style.visibility = "visible";
           flag=1;
        }
	}	
	
	
	if (validdes==1) {
	 document.getElementById('errore_des').style.visibility = "Hidden";
	  var des = trim(document.registrazione.Descrizione.value);
		if ((des == "") || (des == "undefined")) {
		   document.getElementById('errore_des').style.visibility = "visible";
           flag=1;
        }
		
	}	
	 

	 document.getElementById('errore_foto').style.visibility = "Hidden";
	  var foto = trim(document.registrazione.blob.value);
		if(EstensioneFile(foto)==false)
		 {
		   document.getElementById('errore_foto').style.visibility = "visible";
		   flag=1;
          }		
		
	
	
	

	 
	 
	 document.getElementById('errore_mail').style.visibility = "Hidden";
	 document.getElementById('errore_password').style.visibility = "Hidden";
	 document.getElementById('errore_password2').style.visibility = "Hidden";

	 
	 

	 var Mail = document.registrazione.Mail.value;
	 var Password = trim(document.registrazione.Password.value);
	 var Password2 = trim(document.registrazione.Password2.value);
	 var emailOld = document.registrazione.MailOld.value;
	 
	 



		if(ControlloEmail(Mail)==false)
		 {
		   document.getElementById('errore_mail').style.visibility = "visible";
		   document.getElementById('errore_mail').innerHTML = wrongmail;
		   flag=1;
          }
		  
		  
      if(emailOld!=Mail)
		 {
			url  = "validazioneemail.asp?mail=" + Mail.toLowerCase();
			XMLHTTP = RicavaBrowser(validamailajax);
			XMLHTTP.open("POST", url, false);
			XMLHTTP.send(null);
	  }
	  

		
		if ((Password == "") || (Password == "undefined")) {
           document.getElementById('errore_password').style.visibility = "visible";
           flag=1;
        }
		

		
        //Effettua il controllo sul campo CONFERMA PASSWORD
        if ((Password2 == "") || (Password2 == "undefined")) {
           
		    document.getElementById('errore_password2').style.visibility = "visible";
           flag=1;
        }
		
		if (Password2 != Password) {
			document.getElementById('errore_password2').style.visibility = "visible";
			document.getElementById('errore_password').style.visibility = "visible";
		   document.getElementById('errore_password').innerHTML = passwnotequalMsg;
           flag=1;
        }

			
	   if (flag==0) {
	       document.getElementById('Password').value  = converti_md5(Password);
		   document.registrazione.action = "confermamodifica.asp";
           return true;
		   
        }
		
		return false;
  }

//**************** FINE: CONTROLLO FORM   MODIFICA UTENTI ******************	


//**************** INIZIO: CONTROLLO FORM   REGISTRAZIONE UTENTI ******************	

function validareg(validFirstrname,validLastname,validstate,validProvincia,validzipCap,validCity,validaddress,validhomeNumber,validcell,validfax,validofficeNumber,validdate,validjob,validSesso,validstato_civile,validdes,validfoto) {


flag=0;


      if (validFirstrname==1) {
	 document.getElementById('errore_firstrname').style.visibility = "Hidden";
	 var Firstrname = trim(document.registrazione.Firstrname.value);
	 if ((Firstrname == "") || (Firstrname == "undefined")) {
		   document.getElementById('errore_firstrname').style.visibility = "visible";
           flag=1;
        }
	}
	
	if (validLastname==1) {
	 document.getElementById('errore_lastname').style.visibility = "Hidden";
	 var Lastname = trim(document.registrazione.Lastname.value);
		if ((Lastname == "") || (Lastname == "undefined")) {
		   document.getElementById('errore_lastname').style.visibility = "visible";
           flag=1;
        }
	}
	
	if (validstate==1) {
	  document.getElementById('errore_state').style.visibility = "Hidden";
	 var state = trim(document.registrazione.State.value);
		if ((state == "") || (state == "undefined")) {
		   document.getElementById('errore_state').style.visibility = "visible";
           flag=1;
        }
	}
	
	if (validProvincia==1) {
	 document.getElementById('errore_provincia').style.visibility = "Hidden";
	 var Provincia = trim(document.registrazione.Provincia.value);
		if ((Provincia == "") || (Provincia == "undefined")) {
           document.getElementById('errore_provincia').style.visibility = "visible";
           flag=1;
        }
	}


	if (validzipCap==1) {
	 document.getElementById('errore_ZipCap').style.visibility = "Hidden";
	 var zipCap = trim(document.registrazione.ZipCap.value);
		if ((zipCap == "") || (zipCap == "undefined")) {
           document.getElementById('errore_ZipCap').style.visibility = "visible";
           flag=1;
        }
	}	
	
	if (validCity==1) {
	 document.getElementById('errore_city').style.visibility = "Hidden";
	 var City = trim(document.registrazione.City.value);
		if ((City == "") || (City == "undefined")) {
           document.getElementById('errore_city').style.visibility = "visible";
           flag=1;
        }
	}	
	
	if (validaddress==1) {
	 document.getElementById('errore_address').style.visibility = "Hidden";
	  var address = trim(document.registrazione.address.value);
		if ((address == "") || (address == "undefined")) {
           document.getElementById('errore_address').style.visibility = "visible";
           flag=1;
        }
	}	
	
	if (validhomeNumber==1) {
	 document.getElementById('errore_homeNumber').style.visibility = "Hidden";
	 var homeNumber = trim(document.registrazione.homeNumber.value);
		if ((homeNumber == "") || (homeNumber == "undefined")) {
		   document.getElementById('errore_homeNumber').style.visibility = "visible";
           flag=1;
        }
	}	
	
	if (validcell==1) {
	 document.getElementById('errore_cell').style.visibility = "Hidden";
	  var cell = trim(document.registrazione.cell.value);
		if ((cell == "") || (cell == "undefined")) {
		   document.getElementById('errore_cell').style.visibility = "visible";
           flag=1;
        }
	}	
	
	if (validfax==1) {
	 document.getElementById('errore_fax').style.visibility = "Hidden";
	  var fax = trim(document.registrazione.fax.value);
		if ((fax == "") || (fax == "undefined")) {
		   document.getElementById('errore_fax').style.visibility = "visible";
           flag=1;
        }
	}	
	
	if (validofficeNumber==1) {
	 document.getElementById('errore_officeNumber').style.visibility = "Hidden";
	 var officeNumber = trim(document.registrazione.officeNumber.value);
		if ((officeNumber == "") || (officeNumber == "undefined")) {
		   document.getElementById('errore_officeNumber').style.visibility = "visible";
           flag=1;
        }
	}	
	
	if (validdate==1) {
	 document.getElementById('errore_data').style.visibility = "Hidden";
	 var giorno = trim(document.registrazione.giorno.value);
	 var mese = trim(document.registrazione.mese.value);
	 var anno = trim(document.registrazione.anno.value);
		if ((giorno == "") || (giorno == "undefined")) {
           document.getElementById('errore_data').style.visibility = "visible";
           flag=1;
        }
		
		if ((mese == "") || (mese == "undefined")) {
           document.getElementById('errore_data').style.visibility = "visible";
           flag=1;
        }
		
		if ((anno == "") || (anno == "undefined")) {
           document.getElementById('errore_data').style.visibility = "visible";
           flag=1;
        }
	}	
	
	if (validjob==1) {
	 document.getElementById('errore_job').style.visibility = "Hidden";
	 var job = trim(document.registrazione.job.value);
		if ((job == "") || (job == "undefined")) {
		   document.getElementById('errore_job').style.visibility = "visible";
           flag=1;
        }
	}	
	
	
	if (validSesso==1) {
	 document.getElementById('errore_sesso').style.visibility = "Hidden";
	 var Sesso = trim(document.registrazione.Sesso.value);
		if ((Sesso == "") || (Sesso == "undefined")) {
           document.getElementById('errore_sesso').style.visibility = "visible";
           flag=1;
        }
	}	
	
	if (validstato_civile==1) {
	 document.getElementById('errore_stato_civile').style.visibility = "Hidden";
	 var stato_civile = trim(document.registrazione.stato_civile.value);
		if ((stato_civile == "") || (stato_civile == "undefined")) {
           document.getElementById('errore_stato_civile').style.visibility = "visible";
           flag=1;
        }
	}	
	
	
	if (validdes==1) {
	 document.getElementById('errore_des').style.visibility = "Hidden";
	  var des = trim(document.registrazione.Descrizione.value);
		if ((des == "") || (des == "undefined")) {
		   document.getElementById('errore_des').style.visibility = "visible";
           flag=1;
        }
		
	}	
	 
	 if (validfoto==1) {
	 document.getElementById('errore_foto').style.visibility = "Hidden";
	  var foto = trim(document.registrazione.blob.value);
		if(EstensioneFile(foto)==false)
		 {
		   document.getElementById('errore_foto').style.visibility = "visible";
		   flag=1;
          }
		  if ((foto == "") || (foto == "undefined")) {
           document.getElementById('errore_foto').style.visibility = "visible";
           flag=1;
        }
		
		
	}	
	

	 
	 
	 document.getElementById('errore_mail').style.visibility = "Hidden";
	 document.getElementById('errore_nick').style.visibility = "Hidden";
	 document.getElementById('errore_password').style.visibility = "Hidden";
	 document.getElementById('errore_password2').style.visibility = "Hidden";

	 

	 var Mail = document.registrazione.Mail.value;
	 var Nick = trim(document.registrazione.Nick.value);
	 var Password = trim(document.registrazione.Password.value);
	 var Password2 = trim(document.registrazione.Password2.value);
	 
	 

	 var url;
    url  = "validazionenick.asp?username=" + Nick.toLowerCase();
    XMLHTTP = RicavaBrowser(validanick);
    XMLHTTP.open("POST", url, false);
    XMLHTTP.send(null);



		if(ControlloEmail(Mail)==false)
		 {
		   document.getElementById('errore_mail').style.visibility = "visible";
		   document.getElementById('errore_mail').innerHTML = wrongmail;
		   flag=1;
          }
		  
		  
    url  = "validazioneemail.asp?mail=" + Mail.toLowerCase();
    XMLHTTP = RicavaBrowser(validamailajax);
    XMLHTTP.open("POST", url, false);
    XMLHTTP.send(null);
	
		if ((Nick == "") || (Nick == "undefined")) {
		   document.getElementById('errore_nick').style.visibility = "visible";
           flag=1;
        }
		
		
		if ((Password == "") || (Password == "undefined")) {
           document.getElementById('errore_password').style.visibility = "visible";
           flag=1;
        }
		
        //Effettua il controllo sul campo CONFERMA PASSWORD
        if ((Password2 == "") || (Password2 == "undefined")) {
           
		    document.getElementById('errore_password2').style.visibility = "visible";
           flag=1;
        }
		
		
		if (Password2 != Password) {
			document.getElementById('errore_password2').style.visibility = "visible";
			document.getElementById('errore_password').style.visibility = "visible";
		   document.getElementById('errore_password').innerHTML = passwnotequalMsg;
           flag=1;
        }

			
	   if (flag==0) {
	       document.getElementById('Password').value  = converti_md5(Password);
		   document.registrazione.action = "confermautente.asp";
           return true;
		   
        }
		
		return false;
  }

//**************** FINE: CONTROLLO FORM   REGISTRAZIONE UTENTI ******************	
  
 
 
//****************INIZIO:  CHIAMATA AJAX CONTROLLO USERNAME & MAIL******************

function validamailajax()
{
    if (XMLHTTP.readyState == 4)
    {
	   var rispostaajax;
		rispostaajax=XMLHTTP.responseText;
	
		if(rispostaajax==0)
		{
	    document.getElementById('errore_mail').style.visibility = "visible";
	    document.getElementById('errore_mail').innerHTML = validamailMsg;
		flag=1;
		
		}
		
	  
	}
}

function validanick()
{
    if (XMLHTTP.readyState == 4)
    {
	   var rispostaajax;
		rispostaajax=XMLHTTP.responseText;
		if(rispostaajax==0)
		{
	    document.getElementById('errore_nick').style.visibility = "visible";
	    document.getElementById('errore_nick').innerHTML = nickexistMsg;
		flag=1;
		
		}
	}
}

function RicavaBrowser(QualeBrowser)
{
    if (navigator.userAgent.indexOf("MSIE") != (-1))
    {
        var Classe = "Msxml2.XMLHTTP";
        if (navigator.appVersion.indexOf("MSIE 5.5") != (-1));
        {
            Classe = "Microsoft.XMLHTTP";
        } 
        try
        {
            OggettoXMLHTTP = new ActiveXObject(Classe);
            OggettoXMLHTTP.onreadystatechange = QualeBrowser;
            return OggettoXMLHTTP;
        }
        catch(e)
        {
            alert("Errore: l'ActiveX non verrą eseguito!");
        }
    }
    else if (navigator.userAgent.indexOf("Mozilla") != (-1))
    {
        OggettoXMLHTTP = new XMLHttpRequest();
        OggettoXMLHTTP.onload = QualeBrowser;
        OggettoXMLHTTP.onerror = QualeBrowser;
        return OggettoXMLHTTP;
    }
    else
    {
        alert("non funziona con altri browser!");
    }
}

//**************** FINE: CHIAMATA AJAX CONTROLLO USERNAME & MAIL******************


//**************** INIZIO: CONTROLLO EMAIL******************


function ControlloEmail(EmailAddr)
   {
   Filtro = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-]{2,})+\.)+([a-zA-Z0-9]{2,})+$/;
   if (Filtro.test(EmailAddr))
      return true;
   else
      {
      return false;
      }
   }

//**************** FINE: CONTROLLO EMAIL******************
	
//**************** INIZIO: CONTROLLO ESTENSIONE  FILE******************	
	
function EstensioneFile(str)
{
  if( str=="" || str == "undefined")
   {
  return true
  	 }

  var dot="."
  var lastdot=str.lastIndexOf(dot)
  var estensione=str.substring(lastdot+1)
  var estensionelow=estensione.toLowerCase()
  if( estensionelow=="jpg" || estensionelow=="tif" || estensionelow=="gif" )
     {
	 return true
	 }
     else
	 {
	 return false
	 }
	 
	 return false
}	



//**************** FINE: CONTROLLO  ESTENSIONE  FILE******************	
	
	
//**************** INIZIO: CONTROLLO FORM  ACCETTAZIONE INFORMATIVA SITO******************	
	
function AccettaInformativaSito(numform)
{
  var flag=0;
  
  var contform=0;
  while(contform<numform)
  {
  
  contform=contform+1;

  if(document.getElementById('ok'+contform).checked !=true)
	{
	document.getElementById('errore_Informativa'+contform).style.visibility = "visible";
	flag=1;
	}
	else
	{
	document.getElementById('errore_Informativa'+contform).style.visibility = "hidden";
	}
  }
   
   
	if (flag==0)
  {
   document.informativasito.action = "datiregistrazione.asp";
   document.informativasito.submit();
		   
   }
  
}	




//**************** FINE: CONTROLLO FORM  ACCETTAZIONE REGOLE SITO******************	

    //**************** INIZIO: TRIM  STRINGA  ******************	
	function trim(str){
        return str.replace(/^\s+|\s+$/g,"");
    } 
	
  //**************** FINE: TRIM  STRINGA    ******************	
  
  
/*************************************************INIZIO: CRIPTAZIONE*************************************************************/
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      */

/*
 * These are the functions you'll usually want to call
 * They take string arguments and return either hex or base-64 encoded strings
 */
function converti_md5(s){ return binlTohex(criptazione_md5(strToBinl(s), s.length * chrsz));}



/*
 * Calculate the MD5 of an array of little-endian words, and a bit length
 */
function criptazione_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 = strToBinl(key);
  if(bkey.length > 16) bkey = criptazione_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 = criptazione_md5(ipad.concat(strToBinl(data)), 512 + data.length * chrsz);
  return criptazione_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 strToBinl(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 binlTohex(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: CRIPTAZIONE*************************************************************/
