function clientChat(alias, user_id, user_nick, richiesta){

	
var application_id = def_application_id;	
var msg_error_init = "Devi effettuare il Log in per poter entrare in chat.";
var vip = 'capirossi';
var vip_name = 'Loris';
var wait_message_vip = "Aspetta un attimo prima di fare un'altra domanda a " + vip_name + '!';
// variabili per il numero massimo di tentativi di riconnessione
var retry_connection_counter = 0;
var max_retry_connection = 10;

// Disattivo il polling delle richieste di chat nella community
chat_request=false;

if ((!profile_id) || (!nick_name)) {

  alert(msg_error_init); 
  
}
else { 

  Ext.onReady(function(){
  
    // URL di configurazione per i servizi di chat
    // Attenzione: modificare da pvt a it nel passaggio a produzione

    var base_domain = def_base_domain;
	
	// aggiunta 26 giugno
    var url_base = def_url_base + '/';
    var client_chat = 'client_chat/';
    var nome_stanza = '';

    var url_me = url_base + client_chat;
    var url_richiesta_token = url_base + client_chat + 'get_token.php';
    var url_update_token = url_base + 'chat_request/wupdate_token.php';
    var server_rchat = url_base + 'rchat';
    var url_chat_request = url_base + 'chat_request/wget_request.php?type=json&';
    var url_manage_request = url_base + 'chat_request/';
    var url_profile_id= url_base + client_chat + 'chat_id.php?nick=';
    var url_chat_thumb = url_base + client_chat + 'chat_thumb.php';
    var timeout = 12000; //20000; // timeout connessioni HTTP in millisecondi
    var token_stop = true;  // Indica se aggiornare o meno il token di rchat
    var first_time = true;  // Indica se � la prima volta che viene aggiornata la lista delle stanze
    
    var guardia_alert=false; // Sperimentale 28/05
    
    // Messaggi di output per l'utente
    var msg_error_connection = _('Il servizio non é momentaneamente disponibile. Riprova più tardi.');
    var msg_already_request = _('Hai già richiesto una chat con l`utente');
	var msg_chat_myself = _('Non puoi chattare con te stesso');
    var msg_request_rejected = _('Non puoi chattare con l`utente perchè sei nella sua lista nera.');
    var msg_no_stanza = _('Non puoi essere contemporaneamente in più stanze.');
    var msg_nomore_chat = _('Non puoi chattare con più di tre utenti per volta.');
    var msg_uscita_chat_one_one = _(' è uscito/a dalla chat privata.');
    var msg_user_banned = _('Non puoi utilizzare la chat perchè sei stato espulso.');
    //var msg_user_kicked = 'Sei stato espulso temporaneamente dalla stanza.';
    var msg_stanza_full = _('La stanza è piena. Riprova più tardi.');
    var msg_user_kicked = _('La stanza è piena o ci sono problemi tecnici. Riprova più tardi.');   
    var msg_autorizzazione_stanza = _('Non sei autorizzato ad entrare nella stanza!');
    
    //messagi vari
    var tmsg1 = _('utente destinatario non trovato');
    var tmsg2 = _(' è entrato/a nella stanza.');
    var tmsg3 = _('Spiacente, sei stato escluso dalla community per comportamento scorretto.');
    var tmsg4 = _('richiesta non valida');
    var tmsg5 = _('utente non autorizzato');
    var tmsg6 = _('Spiacente, il servizio non è al momento disponibile, riprova più tardi.'); 
    var tmsg7 = _('utente in nessuna stanza o destinatario chat privata assenta'); 
    var tmsg8 = _('Spiacente, sei uscito dalla chat per comportamento scorretto.');
    var tmsg9 = _('Spiacente, sei stato momentaneamente escluso dalla chat per comportamento scorretto.');
    var tmsg10 = _('token non valido'); 
    var tmsg11 = _('Spiacente, la stanza selezionata al momento ha raggiunto il numero massimo di utenti. Scegli un`altra stanza o riprova più tardi. ');
    var tmsg12 = _('Attenzione! Hai raggiunto il numero massimo di chat private aperte contemporaneamente. Se vuoi attivarne una nuova devi chiudere una di quelle aperte.');
    var tmsg13 = _('Attenzione! Hai già attivato una conversazione con nickname. Controlla nella finestra di chat.');
    var tmsg14 = _('Attenzione! Non puoi chattare con il tuo stesso nickname.');
    var tmsg15 = _('Spiacente, l`utente selezionato non è al momento raggiungibile.')
    var tmsg16 = _('l utente è stato segnalato.');
    var tmsg17 = _('Spiacente, il servizio non è al momento disponibile, riprova più tardi.');
    var tmsg18 = _('Invia un messaggio al moderatore');
    var tmsg19 = _('Invia');
    var tmsg20 = _('Il tuo messaggio è stato inviato al moderatore.');
    var tmsg21 = _('Cancella');
    var tmsg22 = _('Moderatore');
    var tmsg23 = _('Utente: ');
    var tmsg24 = _('Profilo'); 
    var tmsg25 = _('Chat Privata');
    var tmsg26 = _('Blocca');
    var tmsg27 = _('Segnala abuso');
    var tmsg28 = _('Chiudi');
    var tmsg29 = _('Richiesta di chat');
    var tmsg30 = _('Accetta');
    var tmsg31 = _('Rifiuta');
    var tmsg32 = _('Desideri entrare nella stanza?');
    var tmsg33 = _('Si');
    var tmsg34 = _('No');
    var tmsg35 = _('Stanze');
    var tmsg36 = _('Seleziona una categoria..')
    var tmsg37 = _('Stanza: ');
    var tmsg38 = _('Utenti');
    var tmsg39 = _('Richieste');
    var tmsg40 = _('Scegli un colore per il tuo messaggio');
    var tmsg41 = _('Scegli un emoticon');
    var tmsg42 = _('Non puoi inviare messaggi con più di ');
    var tmsg43 = _(' caratteri.');
    var tmsg44 = _('<b>Invia</b>');
    var tmsg45 = _('ParadiseHotel : chat');
    var tmsg46 = _('Hai una nuova richiesta di chat!');
    
    //header per messagi di errore o altro
    var head1 = _('Avviso');
    
    // Variabili globali per l'interfaccia grafica
    var stop_msg = true;     // ferma le chiamate AJAX relative ai messaggi  
    var num_msg_stanza_vip= 30;  // Numero di messaggi visualizzati nella stanza VIP
    var max_length_text = 80;  // lunghezza massima di un messaggio
    var delay_chat_vip = 10000; // periodo di attesa, in millisecondi, per l'invio di un messagio in una stanza VIP
    var client_closing = false; // indica che il client chat � in chiusura
    var tab_attivo; // Il nome del tab attivo
    var attivo = new Array(); // Array associativo contenente i tab approvati 
    var max_im = 3; // Numero massimo di chat 1:1 
    var is_stanza = false;  // Indica se il tab_attivo � una stanza oppure no
    var richiesta_stanza;  // Variabile utilizzata per il passaggio di info in Ajax sulle stanze
    var richiesta_chat;    // Variabile utilizzata per il passaggio di info in Ajax sulle richieste di chat 1:1
    var apri_stanza = null; // Se diverso da null apre la stanza all'avvio del client
    var attesa_chat = 0; // Numero di attese di chat 1:1
    var id_richiesta_chat;  // Player id dell'utente che effetua la richiesta di chat
    var id_moderatore = null;  // Id di un moderatore di Rchat
    var num_im = 0; // Numero di chat 1:1 attive
    var num_richieste = 0;  // Utilizzata per stabilire se ci sono nuove richieste di chat
    var testo_richieste;  // Testo di alert della richiesta (Hai una nuova richiesta di chat)
    var session_chat_closed = false; // Indica la chiusura della sessione di chat
    var chat_accettata = null;  // Utilizzata nelle richieste last id delle chat 1:1 (deprecated?)
    var data_invio;   // Data ed ora dell'invio dell'ultimo msg 
    var data_attuale; // Data ed ora attuale (utilizzata per chat VIP)
    var old_messages = new Array(); // buffer per la stanza VIP
    
    var arr_chat = new Array(); // buffer dei messaggi 
    var arr_mod = new Array(); // buffer dei messaggi dai moderatori
    var stanza_vip = new Array();  // Array associativo contenente le stanze VIP
	var arr_css = new Array(); // memorizza l'ultimo css utilizzato per visualizzare il messaggio di una stanza ( serve per alternare i colori dei messaggi ---> vedi funzione render()
    
    var color_msg = '000000';  // Colore messaggio
    var selected_emoticon= ':)';  // Icona di default
    
    var receiving, sending;  // Variabili booleane che indicano lo stato di invio/ricezione dei msg
    var rcv_moderatori = true; // utilizzato per attivare o meno la ricezione di messaggi dai moderatori
  
    var updated; // TODO: use it
    var last_id = new Array(); // Array associativo contenente il last_id (di RCHAT) dei tab 
    var last_mod_id = null;    // Last id dei msg dei moderatori
    var token;  // token di autenticazione di RChat
    var nick_from_id = new Array(); // Array associativo contenente il nick dato l'id
    var id_from_nick = new Array(); // Array associativo contenente l'id dato il nick
    var nicks = new Array();    // Array associativo contente l'id dato il nick [per il thumb]
    var gender= new Array();    // Array associativo contenete il sesso dell'utente dato il nick
    var nick_player;        // nick dell'utente che utilizza il client
    var gender_profile_id;      // Sesso dell'utente che utilizza il client
    var xWin;  // posizione orizzontale delle window (user, moderatore)
    var yWin;  // posizione verticale delle window (user,moderatore)
    
    /*
    -----------------------------------------
     Sezione per la configurazione degli emoticons
    -----------------------------------------
    */
    var icons = {
           ":-)":"sorriso.gif", ":)":"sorriso.gif",
           ":-(":"triste.gif", ":(":"triste.gif",
           ":O":"sorpreso.gif", ":-O":"sorpreso.gif",
           ":o":"sorpreso.gif", ":-o":"sorpreso.gif",
           ":D":"felice.gif", ":-D":"felice.gif",
           ":P":"sarcastico.gif", ":-P":"sarcastico.gif",
           ":p":"sarcastico.gif", ":-p":"sarcastico.gif",
           ";)":"occhiolino.gif", ";-)":"occhiolino.gif"
          };
    var dir_icon= url_base + 'client_chat/resources/images/emoticons/';
      
    /*
     -----------------------------------------
     Client Chat Engine - UTILITIES
     -----------------------------------------
     */
    
    // Restituisce true se i vettori sono differenti
    // Serve nella chat vip per vedere se i messaggi nella stessa
    // sono aggiornati o no
    function array_diff(array1,array2) {

      var i,diff=false;
      
      if ((array1) && (array2)) {
        if (array1.length!=array2.length) {
          diff=true;
        } else {
          for (i=0;i<array1.length;i++) {
            if ((array1[i].id!=array2[i].id) ||
               (array1[i].nick!=array2[i].nick) ||
               (array1[i].posted_on!=array2[i].posted_on) ||
               (array1[i].text!=array2[i].text)){
              diff=true;
              break;
            }
          }
        } 
      } else {
        diff=true;  
      }
      
      return diff;
    }
    
    // Colora il messaggio con il colore selezionato
    function colorMsg(msg) {
    
      var messages= msg;
    
      // Se il messaggio contiene la specifica del colore
      if (msg.charAt(0) == '#') {
        messages = '<font color="' + msg.substr(0, 7) + '">' + msg.substr(7) + '</font>';
      }
      
      return messages;
    }
    
    // Sostituisce le emoticons in una stringa con le immagini
    function emotIcons(msg) {
      
      var messages= msg;
      var icon;
      var icon_find=true;
      
      while (icon_find) {
        icon_find = false;
        for (var icon in icons) {
          while (messages.indexOf(icon) >= 0) {
            messages = messages.replace(icon, '<img align="baseline" src="' + dir_icon + icons[icon] + '">');
            icon_find = true;
          }
        }
      }  
      
      return messages; 
    }
    
    // funzione success di supporto ad una richiesta AJAX
    var rcvPlayerIdSuccess = function(o){
      
      try {
        var messages = Ext.util.JSON.decode(o.responseText);  
      } 
      catch (e) {
       
      }
      
      if (messages!=null) {
        nicks[nick_player]= messages.profile_id;
        gender[nick_player]= messages.gender;
        openWinUtente(xWin, yWin, nicks[nick_player], nick_player);
      }
      
    };
    
    // funzione failure di supporto ad una richiesta AJAX
    var responseIdFailure = function(o){
    }
    
    // Esegue il render dei messaggi nella Tab selezionata
    function renderChat(){
    
      var messages = '';
      var msg= '';

      
      // Costruisco la tabella dei messaggi nella var. messages
      
      for (i = 0; i < arr_chat[tab_attivo].length; i++){
      
		// se e' un messaggio privato di un moderato viene messo nell' array per i messagi pop up, altrimenti viene messo nella chat
		if(arr_chat[tab_attivo][i].userType == 'MOD' && arr_chat[tab_attivo][i].type == 'PRIVATE'){
			
			// codice per non inserire un messaggio di un moderatore gi� visualizzato
			var found = false;
			for(j = 0; j < arr_mod.length; j++){
				if(arr_mod[j].id == arr_chat[tab_attivo][i].id){
					found = true;
					break;
				}
			}
			if(found == false){
				arr_mod.push(arr_chat[tab_attivo][i]);
			}
		}	
		else{
			
			// se il messaggio e' di un utente recupero la sua immagine di profilo, se e' di un moderatore uso una immagine standard
			if(arr_chat[tab_attivo][i].userType == 'MOD'){
				icon = url_base + client_chat + 'resources/images/icone/icona_mod.gif';
				id_thumb = 'user_mod';
			}
			else{
				icon = url_chat_thumb + '?nick='+escape(arr_chat[tab_attivo][i].nickname);
				id_thumb = 'user_' + arr_chat[tab_attivo][i].nickname;
			}
	        
	        // Coloro il messaggio
	        msg= colorMsg(arr_chat[tab_attivo][i].message);
	        
	        // Sostituisce le emoticons con le immagini
	        msg= emotIcons(msg);
			
			if(!arr_css[tab_attivo]){
				arr_css[tab_attivo] = 'msg1';
			}
	         
		var my_min= arr_chat[tab_attivo][i].dateTime.substr(arr_chat[tab_attivo][i].dateTime.indexOf(' ') + 4, 2);
		var hour_to_compute =Number( arr_chat[tab_attivo][i].dateTime.substr(arr_chat[tab_attivo][i].dateTime.indexOf(' ') + 1, 2) );
		var h = new Date();
		if(sign =='add') {	
			var added_date = h.setHours(hour_to_compute + deltah);
 		}
		else if(sign == 'del') {
			var added_date = h.setHours(hour_to_compute - deltah); 
		}
		else {
			var added_date = h.setHours(hour_to_compute);
		}
		var timenew =  h.getHours() +':'+ my_min;
	        messages = '<div class="' + arr_css[tab_attivo] +'"><div><img align="left" id="'+ id_thumb + '" src="' + icon +'" width="34" height="34"></div><div style="margin-left : 40px;"><b>' + arr_chat[tab_attivo][i].nickname + '</b> <span class="ora">('+ timenew  + ')</span><br>' + msg+'</div></div>' + messages;
	        
			if(arr_css[tab_attivo] == 'msg1'){
				arr_css[tab_attivo] = 'msg2';
			}
			else if(arr_css[tab_attivo] == 'msg2'){
					arr_css[tab_attivo] = 'msg1';
			}
		}

	  }
	  
	  // visualizzazione popup messaggi privati da parte del moderatore per l'utente
	  rcvModResponseSuccess('');
      
      // Se il tab � stato istanziato
      if (document.getElementById(tab_attivo) && messages != '') {
      
        // Aggiorna il contenuto del tab
		document.getElementById(tab_attivo).innerHTML += messages;
	
		// Aggancia l'evento per la visualizzazione
        /*
         * function (e,t)
         * funzione che viene agganciata all'evento click sui tag img di tutto il DOM
         * in particolare e --> indicazioni sull'evento, t--> oggetto selezionato  
         */ 
		Ext.select('img').on('click', function(e,t) {
          if (is_stanza && !(stanza_vip && stanza_vip[tab_attivo])) {
          
            nick_player = t.id.substr(5);
              
            if(nick_player.toLowerCase() != nick_name && nick_player.toLowerCase() != 'mod') {
              
              // Se non � stato ancora recuperato l'id del nickname
              if (nicks[nick_player] == null) {
                
                xWin = e.getPageX();
                yWin = e.getPageY();
                
                // chiamata AJAX per ottenere informazioni sul player cliccato  
                Ext.Ajax.request({
                  url: url_profile_id + nick_player,
                  timeout: timeout,
                  method: 'GET',
                  success: rcvPlayerIdSuccess,
                  failure: responseIdFailure
                });
                  
              }
              else {
                openWinUtente(e.getPageX(), e.getPageY(), nicks[nick_player], nick_player);
              }
            }
          }  
        });
        
     // Posiziona la scrollbar verticale in fondo
	    document.getElementById(tab_attivo).scrollTop = document.getElementById(tab_attivo).scrollHeight;
        
      }  
    }
    
    // funzione di supporto per la raccolta dei messaggi
    // questa funzione triggera renderChat()
    var rcvResponseSuccess = function(o){
    
    	if(o.status == '400'){ // richiesta non valida
    		messageAlert('bad_request');
    	}
    	else if(o.status == '401'){ // token non valido
    		messageAlert('bad_token');
    	}
    	else if(o.status == '403'){ // banning
    		messageAlert('banning');
    	}
    	else if(o.status == '404'){ // utente in nessuna stanza o destinatario chat privata assenta
    		messageAlert('no_room_user');
    	}
    	else if(o.status == '405'){ // kicking
    		messageAlert('kicking');
    	}
    	else{ // richiesta valida
    		
    		// recupero messaggi
    		try {
    			var messages = Ext.util.JSON.decode(o.responseText);
    		} 
    		catch(e){
    			receiving = false;
				messageAlert('generic');
    		}
      
    		if(messages.length > 0 && tab_corrente == tab_attivo){
    			arr_chat[tab_corrente] = new Array(); 
    			arr_chat[tab_corrente]= messages;
    			last_id[tab_corrente] = parseInt(arr_chat[tab_corrente][0].id) + 1; 
    			renderChat();
    		}
	  
    		msg_editor.enable();
    		button_invio.enable();
      
    		// TODO: do it well!
    		receiving = false;
    	}
    };
    
    
    var sndResponseSuccess = function(o){
    
      // DEBUG
      //document.getElementById('send_box').innerHTML= 'SUCCESS: <br>Status: '+ o.status + '<br>ResponseText: '+o.responseText;
      /*
      if ((client_closing) && (tabs_messaggi.items.keys.length == 0)) {
        End_Sessione_RChat();
      }
      */
      sending = false;
    };
    
    // callback per richiesta a JChat non andata a buon fine
    var responseFailure = function(o){
    	
    	if(o.statusText == 'user kicked'){ // kicking
    		messageAlert('kicking');
    	}
    	else if(o.statusText == 'user banned'){
    		messageAlert('banning');
    	}
    	else if(o.statusText == tmsg1 ){
    		sending = false;
    		messageAlert('no_user_online');
    	}
    	else{
    		messageAlert('generic');
    	}
    }
    
    // Ricezione dei messaggi dalla stanza attiva
    function rcvMessages(){
    
      if (!receiving) {
        tab_corrente = tab_attivo;
		// TODO: verificare safety
        receiving = true;
		
		if(!last_id[tab_attivo]){
			last_id[tab_attivo] = 0;
		}
        
        // Differenzio la chiamata ad RChat nel caso di stanza o messaggio istantaneo 
		if (is_stanza) {
		  var rcv_url = server_rchat + '/rooms/current/messages?token=' + token + '&verbose=high&max=20' + '&filter=newerThan%3D' + last_id[tab_attivo] + '%7Clog%3Dfalse';
        }
        else {
          var rcv_url = server_rchat + '/users/current/messages/' + id_from_nick[tab_attivo] + '@' + application_id + '?token=' + token + '&filter=newerThan%3D' + last_id[tab_attivo];
        }
        
        Ext.Ajax.request({
          url: rcv_url,
          timeout: timeout,
          method: 'GET',
          success: rcvResponseSuccess,
          failure: responseFailure
        });
        
      }
    }
    
    // successo ricezione messaggi da moderatori utilizzato da rcvModMessages()
    var rcvModResponseSuccess = function(o){
    	
    	for(i = 0; i < arr_mod.length; i++){
    		if(arr_mod[i].visible == 'true'){
    			Ext.MessageBox.alert('Messaggio ' + arr_mod[i].nickname, arr_mod[i].message);
    			arr_mod[i].visible = 'false';
    		}
        }
    	//arr_mod = new Array();
    	
    };
    
    // Ricezione dei messaggi dai moderatori
    function rcvModMessages(){
      if (!stop_msg) {
        rcv_moderatori = true;
        
        var rcv_url = server_rchat + '/im/' + profile_id + '/entranti?token=' + token + '&mod=1&since_id=' + last_mod_id;
        
        ////console.log('GET: ' + rcv_url);
        
        Ext.Ajax.request({
          url: rcv_url,
          timeout: timeout,
          method: 'GET',
          success: rcvModResponseSuccess,
          failure: responseFailure
        });
        
      }
    }
    
    
    // Invio messaggio
    function sndMessage(msg){
      if (!sending) {
      
        if (nick_name == '') {
          nick_name = 'no_nick';
        }
        
		/*
        if (color_msg == '000000') {
          var message = {
            text: msg
          };
        }
        else {
          // abilita il colore selezionato
          var message = {
            text: '#' + color_msg + msg
          };
        }  	
		*/
		var snd_url;
		var obj;
		var body;
         
        // TODO: verificare safety
        sending = true;
        
        // Differenzio la chiamata ad RChat nel caso di moderatore, stanza o messaggio istantaneo
        if (id_moderatore != null) {
          snd_url = server_rchat + '/im/' + id_moderatore + '/entranti?token=' + token;
        }
        else {
			if (is_stanza) {
				
				snd_url = server_rchat + '/rooms/current/messages/public/' + token;
				//snd_url = 'www.timcafe.it/client_chat/send_message.php?type=public';
				obj = {
					message : msg
				};
			}
			else{
				
				snd_url = server_rchat + '/messages/' + token;
			
				obj = {
					destinationUser : id_from_nick[tab_attivo] + '@' + application_id,
					text : msg
				};
			}
        }
        
        id_moderatore = null;
        
		body = Ext.util.JSON.encode(obj);
                
        Ext.Ajax.request({
          url: snd_url,
          timeout: timeout,
          method: 'PUT',
          success: sndResponseSuccess,
          failure: responseFailure,
          params: body
        });
		}
    }
    
    var rcvPlayerGenderSuccess = function(o){
    
      try {
        var messages = Ext.util.JSON.decode(o.responseText);
      } 
      catch (e) {
      }
      
      if (messages!=null) {
        gender_profile_id= messages.gender;  
      } 
      
    }
        
      
    var responseGenderFailure = function(o){
    }
      
    // Inizializzazione parametri del client chat
    function Init_Chat(){
      receiving = false;
      sending = false;
      
      //url_chat_request = url_chat_request + "token=" + token;
      
      // Determino il sesso dell'utente
      Ext.Ajax.request({
        url: url_profile_id+nick_name,
        timeout: timeout,
        method: 'GET',
        success: rcvPlayerGenderSuccess,
        failure: responseGenderFailure
      });
    }
    
    // funzione di supporto AJAX
    // entrata in una stanza
    var enter_stanzaResponseSuccess = function(o){
    	
    	if(o.responseText == '401'){ // richiesta non valida
    		messageAlert('bad_token');
    	}
    	else if(o.responseText == '405'){ // token non valido
    		messageAlert('full_room_wrong_channel');
    	}
    	else if(o.responseText == '403'){ // banning
    		messageAlert('banning');
    	}
    	else if(o.responseText == '500'){ // errore interno server
    		messageAlert('generic');
    	}
    	else{ // ingresso in room avvenuto con successo
    	
    		try{
    			var messages = Ext.util.JSON.decode(o.responseText);
    		} 
    		catch(e){
    			receiving = false;
				messageAlert('generic');
    		}
   
    		is_stanza = true;
    		attivo[messages.id] = true;
    		if(false && !((stanza_vip) && (stanza_vip[tab_attivo]))) {
    			sndMessage(nick_name + tmsg2);
    		}  
    		stop_msg = false;
    		receiving = false;
    		UpdateUtenti(); // update del tree degli utenti
    		rcvMessages();  // ricezione messaggi
    		msg_editor.enable(); // abilitazione dell'editor
    	}
    }
    
    // gestione dell'entrata in una stanza
    function Entrata_Stanza(roomId){
    
      ////console.log('POST: ' + server_rchat + '/stanze/' + stanza + '/utenti?token=' + token);
      
		arr_chat[roomId] = new Array();
		last_id[roomId] = null;
	  
		var obj = {
			token : token
		};
        
		var body = Ext.util.JSON.encode(obj);
      
		Ext.Ajax.request({
			url: server_rchat + '/rooms/' + roomId + '/users',
			timeout: timeout,
			method: 'PUT',
			success: enter_stanzaResponseSuccess,
			failure: responseFailure,
			params : body
		});
      
    }
    
    // funzione di supporto AJAX
    // uscita da una stanza
    var exit_stanzaResponseSuccess = function(o){
    
      if ((client_closing) && (tabs_messaggi.items.keys.length == 0)) {
        End_Sessione_RChat();
      }
      
      receiving = false;
    }
    
    // gestione dell'uscita da una stanza
    function Uscita_Stanza(stanza, msg){
    
      var url_exit;
      
      receiving = true;
      
	  url_exit = server_rchat + '/rooms/current/users/current?token=' + token;
      
      Ext.Ajax.request({
        url: url_exit,
        timeout: timeout,
        method: 'DELETE',
        success: exit_stanzaResponseSuccess,
        failure: responseFailure
      });
      
    }
    
    var rcvAliasSuccess = function(o){
    	
    	if(o.responseText == '400'){ // richiesta non valida
    		messageAlert('bad_request');
    	}
    	else if(o.responseText == '401'){ // token non valido
    		messageAlert('bad_token');
    	}
    	else if(o.responseText == '403'){ // banning
    		messageAlert('banning');
    	}
    	else if(o.responseText == '404'){ // utente in nessuna stanza o destinatario chat privata assenta
    		messageAlert('no_room_user');
    	}
    	else if(o.responseText == '405'){ // kicking
    		messageAlert('kicking');
    	}
    	else{ // richiesta valida
    		
    		try {
    			var messages = Ext.util.JSON.decode(o.responseText);
    		} 
    		catch(e){
    			messageAlert('generic');  
    		}
      
    		var arr_alias = new Array();
      
    		if(nome_stanza != null){
		
    			var new_tab = new Ext.Panel({
    								title: nome_stanza,
    								id: nome_stanza,
    								iconCls: 'stanze',
    								baseCls: 'boxmsg',
    								closable: true
    							});
        
    			// Chiusura di una stanza
    			// associo al tab appena creato un evento sulla chiusura, 
    			// quindi quanto segue � una funzione per gestire questo aspetto
    			new_tab.on('beforedestroy', function(p){
    				tab_attivo = p.title;
    				stop_msg = true;
    				if(apri_stanza == vip) stanza_vip[tab_attivo] = true;
    				/*
    				if((stanza_vip) && (stanza_vip[tab_attivo])) {
    					Uscita_Stanza(apri_stanza);
    				}
    				else{
    					Uscita_Stanza(apri_stanza, nick_name + ' � uscito/a dalla stanza.');
    				}  
    				*/
    				if(nome_stanza){
    					Uscita_Stanza(nome_stanza);
    				}
    			
    				// Elimino il vettore dei messaggi della stanza
    				arr_chat[tab_attivo] = null;
    				old_messages= null;
    				tab_attivo = null;
    				msg_editor.reset();
    				msg_editor.disable();
          
    				if(nome_stanza != ''){
    					is_stanza = false;
    					nome_stanza = '';
    				}
          
    				UpdateUtenti();
    				UpdateStanze();
          
    				if(!session_chat_closed){
    					stop_msg = false;
    				}
    			});
        
    			// Aggiungo il tab al panel dei messaggi
    			tabs_messaggi.add(new_tab);
        
    			is_stanza = true;
    			tab_attivo = nome_stanza;
        
    			// Imposto i valori per l'apertura della stanza
    			arr_chat[tab_attivo] = new Array();
    			last_id[tab_attivo] = null;
        
    			tabs_messaggi.activate(tab_attivo);
    			attivo[tab_attivo] = true;
        
    			if(apri_stanza== vip) {
    				stanza_vip[tab_attivo] = true;
    			}
        
    			if(false && !((stanza_vip) && (stanza_vip[tab_attivo]))){
    				InvioMsg(nick_name + tmsg2);
    			}
    			else{
    				msg_editor.enable();
    			}
    			rcvMessages();
        
    			UpdateUtenti();
    			UpdateStanze();
        
    			tabs_messaggi.activate(tab_attivo);
    			
    			// funzione per la gestione dell'attivazione del TAB appena creato
    			new_tab.on('activate', function(p){
    				tab_attivo = p.title;
    				is_stanza = true;
          
    				UpdateUtenti();
          
    				if(!attivo[tab_attivo]){
    					msg_editor.reset();
    					msg_editor.disable();
    				}
    				else{
    					msg_editor.enable();
    					if(document.getElementById(tab_attivo)){
    						// Posiziona la scrollbar verticale in fondo
    						document.getElementById(tab_attivo).scrollTop = document.getElementById(tab_attivo).scrollHeight;
    					}
    				}
    			});
    		}
      
    		// visualizzazione e rendering del client di RCHAT
    		win.show();
    		document.getElementById(tab_attivo).innerHTML = '';
    		renderChat();
    		rcv_moderatori = false;
    		stop_msg = false;
    	}
    };
    
    // funzione di supporto AJAX
    // ricezione dei messaggi dei moderatori
    // e apertura stanza di un alias
    // funzioni chiamate allo start del client
    var modResponseSuccess = function(o){
    	last_mod_id = 1;
      
    	// Se � stato specificato l'id viene effettuata l'entrata nella room
    	if(alias != null){
		
	        Ext.Ajax.request({
	          url: server_rchat + '/rooms/' + alias + '/users',
	          timeout: timeout,
	          method: 'PUT',
			  params : '{"token" : "' + token + '"}',
	          success: joinRoomCallback,
	          failure: responseFailure
	        });  
    	}
    	else if(richiesta == 1){ // � stata richiesta una chat 1-1
    		RichiestaChat(user_id, user_nick);
        }
    	else{ // apertura del client "secca" senza passargli nulla  
            win.show();
        }
        rcv_moderatori = false;
        stop_msg = false;  
    }
    
    
    // funzione di supporto AJAX
    // va a prendere il token e chiede il last id per i messaggi dei moderatori
    var initResponseSuccess = function(o){
    
    	if(o.responseText == '403'){ // utente barrato
    		messageAlert('barring');
    	}
    	else if(o.responseText == '400'){ // richiesta non valida
    		messageAlert('bad_request');
    	}
    	else if(o.responseText == '401'){ // utente non autorizzato
    		messageAlert('unauthorized_user');
    	}
    	else{ // entrata in chat consentita
    		
    		try{
    			var messages = Ext.util.JSON.decode(o.responseText);
    		} 
    		catch(e){
    			messageAlert('generico');
    		}
          
    		token = messages.token;
			url_chat_request = url_chat_request + "token=" + token + '&profile_id=' + profile_id;
			  
		    token_stop = false;
		    modResponseSuccess('');
    	}
    } 
    	
    // Richiedo una nuova sessione di RChat
    function Init_Sessione_RChat(){
    
      Ext.Ajax.request({
        url: url_richiesta_token,
        timeout: timeout,
        method: 'GET',
        success: initResponseSuccess,
        failure: responseFailure
      });
      
    }
    
    // chiusura di una sessione
    function End_Sessione_RChat(){
      stop_msg = true;
      session_chat_closed = true;
      client_closing = false;
    }
    
    // Accetta la sessione di chat dall'utente dest_profile_id
    function AccettaChat(profile_id, nick){
      var snd_url;
	  richiesta_chat = nick;
      id_richiesta_chat = profile_id;
      
      if(num_im < 3){ // OK - ci sono meno di tre chat personali, se ne pu� creare una nuova
          
    	  id_from_nick[richiesta_chat] = id_richiesta_chat;
          nick_from_id[id_richiesta_chat] = richiesta_chat;
          
          var new_tab = new Ext.Panel({
            title: richiesta_chat,
            id: richiesta_chat,
            iconCls: 'stanze',
            baseCls: 'boxmsg',
            closable: true
          });
          
          // Chiusura di una chat 1:1
          new_tab.on('beforedestroy', function(p){
        	  tab_attivo = p.title;
        	  stop_msg = true;
            
        	  if(attivo[tab_attivo]){
        		  //sndMessage(nick_name + msg_uscita_chat_one_one);
        	  }
        	  else{
        		  // Elimino la richiesta di chat dalla coda delle richieste in cache
        		  EliminaRichiestaChat(id_from_nick[tab_attivo]);
              
        		  if((client_closing) && (tabs_messaggi.items.keys.length == 0)){
        			  End_Sessione_RChat();
        		  }
        	  }
            
        	  //Uscita_Stanza(richiesta_stanza, nick_name + ' � uscito/a dalla stanza.');
        	  //tabs_messaggi.remove(richiesta_chat);
            
        	  UpdateUtenti();
        	  UpdateStanze();
            
        	  // Elimino il vettore dei messaggi della stanza
        	  arr_chat[tab_attivo] = null;
        	  msg_editor.reset();
        	  msg_editor.disable();
        	  nick_from_id[id_from_nick[tab_attivo]] = null;
        	  id_from_nick[tab_attivo] = null;
        	  attivo[tab_attivo] = null;
            
        	  // Decremento il numero di chat 1:1 attive
        	  num_im--;
            
        	  // la variabile attivo indica se il tab che hai creato
        	  // � attivo o meno
        	  if(!attivo[tab_attivo]){
        		  attesa_chat--; // non hai pi� richieste pending e faccio sparire il messaggio
        	  }
            
        	  if(!session_chat_closed){
        		  stop_msg = false;
        	  }
          });
          
          new_tab.on('activate', function(p){
			
        	tab_attivo = p.title;
		    is_stanza = false;
		    
		    UpdateUtenti();
		    
		    if(!attivo[tab_attivo]){
		    	msg_editor.reset();
		    	msg_editor.disable();
		    }
		    else{
		      msg_editor.enable();
		    }
          });
          
          // Aggiungo il tab al panel dei messaggi
          tabs_messaggi.add(new_tab);
          
          // Incremento il numero di chat 1:1 attive
          num_im++;
          
          arr_chat[richiesta_chat] = new Array();
          getLastMsgId(id_from_nick[richiesta_chat], richiesta_chat);
          is_stanza = false;
          tab_attivo = richiesta_chat;
          attivo[richiesta_chat] = true;
          tabs_messaggi.activate(richiesta_chat);
          document.getElementById(tab_attivo).innerHTML = '';
          
          //InvioMsg(nick_name+' ha accettato la richiesta di chat');
   
          if (richiesta != null){
            win.show();
          }
          // inizio la ricezione dei messaggi
          rcvMessages();
          
          richiesta = null;
      }
      else{ // KO - ci sono gi� tre chat personali
			messageAlert('max_private_chat');
      }
    }
    
    // Richiesta di chat verso l'utente dest_profile_id
    function RichiestaChat(user_id, user_nick){
 
		if(id_from_nick[user_nick]){ //  KO - richiesta a utente gi� in chat
			messageAlert('chat_already_request');
		}
		else if(user_id == profile_id){ //  KO - richiesta a se stesso
			messageAlert('no_chat_myself');
		}
		else{ // richiesta valida
			
			richiesta_chat = user_nick;
			id_from_nick[user_nick] = user_id;
			
			var new_tab = new Ext.Panel({
	            title: richiesta_chat,
	            id: richiesta_chat,
	            iconCls: 'stanze',
	            baseCls: 'boxmsg',
	            closable: true
	        });
	          
	        // Chiusura di una chat 1:1
	        new_tab.on('beforedestroy', function(p){
	            tab_attivo= p.title;
	            stop_msg = true;
	            
	            /*
	            if (attivo[tab_attivo]){
	              //sndMessage(nick_name + msg_uscita_chat_one_one);
	            }
	            else{
					// Elimino la richiesta di chat dalla coda delle richieste in cache
					EliminaRichiestaChat(id_from_nick[richiesta_chat]);
	          
					if ((client_closing) && (tabs_messaggi.items.keys.length == 0)){
						End_Sessione_RChat();
					}
	            }
	            */
	            
				// Elimino il vettore dei messaggi della stanza
				/*
	            arr_chat[richiesta_chat] = null;
	            
	            nick_from_id[id_from_nick[richiesta_chat]] = null;
	            id_from_nick[richiesta_chat] = null;
				*/
				arr_chat[tab_attivo] = null;
	            
	            nick_from_id[id_from_nick[tab_attivo]] = null;
	            id_from_nick[tab_attivo] = null;
	            
	            UpdateUtenti();
	            UpdateStanze();
	            
	            msg_editor.reset();
	            msg_editor.disable();
	            
				// Decremento il numero di chat 1:1 attive
	            num_im--;
	            
	            if(!attivo[richiesta_chat]){
	              attesa_chat--;
	            }
	            
	            //attivo[richiesta_chat] = null;
				//attivo[richiesta_chat] = true;
	            
	            if (!session_chat_closed){
	              stop_msg = false;
	            }
	            
	          });
	          
	          new_tab.on('activate', function(p){
	            tab_attivo = p.title;
				is_stanza = false;
	            
	            UpdateUtenti();
	          });
	          
	          // Aggiungo il tab al panel dei messaggi
	          tabs_messaggi.add(new_tab);
	          
	          // Incremento il numero di chat 1:1 attive
	          num_im++;
	          
	          // Incremento il numero di chat in attesa
	          attesa_chat++;
	          
	          arr_chat[richiesta_chat] = new Array();
	          attivo[richiesta_chat] = true;
	          
	          var Stamp = new Date();
	          
	          tabs_messaggi.activate(richiesta_chat);
	          tab_attivo = richiesta_chat;
	          attesa_chat++;
	          
	          if (richiesta != null) {
	            win.show();
	          }
	          
	          renderChat();
	          document.getElementById(tab_attivo).innerHTML = '';
	          richiesta = null;
		}
    }
    
    // funzione di supporto AJAX
    //  l'utente ne mette un altro in blacklist
    var sndBlackList = function(o){
    
    	if(o.responseText == 'KO'){
    		messageAlert('generic');
    	}
    }
    
    // funzione per il blacklisting
    function BloccaUtente(profile_id, nick){
      
    	var snd_url;
      
    	snd_url = url_base + client_chat + 'chat_block.php?profile_id=' + profile_id;
	  
    	Ext.Ajax.request({
    		url: snd_url,
    		timeout: timeout,
    		method: 'GET',
    		success: sndBlackList,
    		failure: responseFailure
    	});
    }
    
    // funzione di supporto AJAX
    // rifiuta una richiesta di chat
    var sndReject = function(o){
    
	    if(o.responseText != 'OK'){
	    	messageAlert('generic');
	    }

    }
    
    // funzione di rifiuto di una richiesta di chat
    function RifiutaChat(profile_id, nick){
   
      var snd_url;
      snd_url = url_base + client_chat + 'chat_reject.php?profile_id=' + profile_id + '@' + application_id;
      
      Ext.Ajax.request({
        url: snd_url,
        timeout: timeout,
        method: 'GET',
        success: sndReject,
        failure: responseFailure
      });
    }
    
    // funzione di supporto AJAX
    // riceve l'ultimo ID di un messaggio [per chat 1:1]
    var rcvLastId = function(o){
    	
    	if(o.status == '400'){ // richiesta non valida
    		messageAlert('bad_request');
    	}
    	else if(o.status == '401'){ // token non valido
    		messageAlert('bad_token');
    	}
    	else if(o.status == '404'){ // utente in nessuna stanza o destinatario chat privata assente
    		messageAlert('no_room_user');
    	}
    	else if(o.status == '405'){ // kicking
    		messageAlert('kicking');
    	}
    	else if(o.status == '500'){ // errore interno server
    		messageAlert('generic');
    	}
    	else{ // richiesta valida
    		
    		if(messages.length > 0){
    			
    			// TODO: settare valore significativo
    			last_id[chat_accettata] = messages[messages.length - 1].id;
        
    		}
    		else{
    			last_id[chat_accettata] = null;
    		}
      
    		attivo[chat_accettata] = true;
    		msg_editor.enable();
    	} 
    }
    
    // Prende l'id dell'ultimo messaggio nella chat 1:1
    function getLastMsgId(profile_id, nick){
   
      chat_accettata = nick;
      
      Ext.Ajax.request({
        url: server_rchat + '/users/current/messages/' + profile_id + '?token=' + token,
        timeout: timeout,
        method: 'GET',
        success: rcvLastId,
        failure: responseFailure
      });
      
    }
    
	var joinRoomCallback = function(o){
		
		if(o.status == '401'){ // token non valido
    		messageAlert('bad_token');
    	}
    	else if(o.status == '403'){ // richiesta non valida
    		messageAlert('banning');
    	}
    	else if(o.status == '405'){ // utente non autorizzato
    		messageAlert('full_room_wrong_channel');
    	}
    	else if(o.status == '500'){
    		messageAlert('generic');
    	}
    	else{ // entrata in chat consentita
		
    		try {
    			var response = Ext.util.JSON.decode(o.responseText);
    		} 
    		catch (e) {
    			messageAlert('generic');
    		}
    		
    		nome_stanza = response.name;
    		Ext.Ajax.request({
    			url: server_rchat + '/rooms/current/messages?token=' + token + '&verbose=high',
    			timeout: timeout,
    			method: 'GET',
    			success: rcvAliasSuccess,
    			failure: responseFailure
    		});
    	}
    }
    
    // funzione visualizzazione finestre di avviso
    function messageAlert(type){
    	
    	switch(type){
    		
    		case 'barring':
    			messageText = tmsg3;
    			break;
    		
    		case 'bad_request':
    			messageText = tmsg4;
    			break;
    			
    		case 'unauthorized_user':
    			messageText = tmsg5;
    			break;
    		
    		case 'generic':
    			messageText = tmsg6;
    			break;
    			
    		case 'no_room_user':
    			messageText = tmsg7;
    			break;
    		
    		case 'kicking':
    			nome_stanza = '';
    			receiving = true;
    			tabs_messaggi.remove(tab_attivo);
    			messageText = tmsg8;
    			break;
    			
    		case 'banning':
    			messageText = tmsg9;
    			break;
    			
    		case 'bad_token':
    			messageText = tmsg10;
    			break;
    			
    		case 'full_room_wrong_channel':
    			messageText = tmsg11;
    			break;
    			
    		case 'max_private_chat':
    			messageText = tmsg12;
    			break;
    			
    		case 'chat_already_request':
    			messageText = tmsg13;
    			break;
    			
    		case 'no_chat_myself':
    			messageText = tmsg14;
    			break;
    			
    		case 'no_user_online':
    			messageText = tmsg15;
    			break;
    			
    		case 'abuse_ok':
    			messageText = tmsg16;
    			break;
    			
    		default:
    			messageText = tmsg17;
    			break;
    		
    	}
    	
    	Ext.MessageBox.alert(head1, messageText);
    }
    
    // Errore di comunicazione con RChat
    function Errore_RChat(o) {
		
		switch(o.status){
		
			case 403:
				Ext.MessageBox.alert(head1, msg_user_banned);
				break;
				
			case 405:
				Ext.MessageBox.alert(head1, msg_user_kicked);
				break;
			
			 default:
				Ext.MessageBox.alert(head1, msg_error_connection);
				break;
		}
	}
  
  
    //Inizializzazione ExtJs Framework
    Ext.QuickTips.init();
    
    // Variabili utilizzate per la comunicazione il ChatEngine
    // Creazione interfaccia grafica ExtJs
    
    var msg_mod_editor = new Ext.form.TextField({
      id: 'msgmodeditor',
      //fieldClass: 'testo_moderatore',
      fieldLabel: tmsg18 ,
      //height: 20,
      width: 200
    });
    
    function msgInviato(){
      stop_msg = false;
    };
    
    var form_messaggi_mod = new Ext.FormPanel({
      labelAlign: 'top',
      width: 250,
      height: 150,
      labelWidth: 200,
      border: false,
      region: "center",
      items: [msg_mod_editor],
      //baseCls: 'testo_moderatore',
      bodyStyle: 'padding:5px 5px 0;background-color:#E0E8EF;font-weight:bold;font-size:13px;color:#6c3377;text-align:center;padding-top:10px;',
      buttons: [{
        text: tmsg19 ,
        handler: function(){
          sndMessage(msg_mod_editor.getValue());
          winModeratore.hide();
          Ext.MessageBox.alert('Info', tmsg20 , msgInviato);
        }
      }, {
        text: tmsg21 ,
        handler: function(){
          winModeratore.hide();
          stop_msg = false;
        }
      }]
    });
    
    
    var winModeratore = new Ext.Window({
      layout: "border",
      width: 270,
      height: 130,
      resizable: false,
      bodyBorder: false,
      closable: false,
      border: false,
      closeAction: 'hide',
      title: tmsg22,
      bodyStyle: 'background-color:#E0E8EF;',
      //baseCls: 'finestra_user',
      modal: true,
      items: [form_messaggi_mod]
    });
    
    var winUser = new Ext.Window({
      layout: "border",
      id: "FinestraUtente",
      width: 200,
      height: 130,
      resizable: false,
      bodyBorder: false,
      buttonAlign: 'center',
      closable: false,
      border: false,
      closeAction: 'hide',
      title: tmsg23,
      //baseCls: 'finestra_user',
      modal: true,
      items: [{
        region: "center",
        id: "info_utente",
        baseCls: 'finestra_user',
        html: '<div class="left_col chat_link"><img id="thumb" src="' + url_chat_thumb + '"></div><div class="right_col chat_link"><a id="link_utente" href="'+ url_base +'" target="_blank">'+ tmsg24 +'</a><br><a href="#" id="chat_privata">'+ tmsg25 +'</a><br><a href="#" id="blocca_chat">'+ tmsg26 +'</a><br><a href="#" id="segnala_abuso">'+ tmsg27 +'</a></div>'
      }],
      buttons: [{
        text: tmsg28,
        handler: function(){
          winUser.hide();
        }
      }]
    });
    
    var winRichiesta = new Ext.Window({
      layout: "border",
      id: "FinestraRichiesta",
      width: 200,
      height: 150,
      resizable: false,
      bodyBorder: false,
      buttonAlign: 'center',
      closable: false,
      border: false,
      closeAction: 'hide',
      title: tmsg29,
      //baseCls: 'finestra_user',
      modal: true,
      items: [{
        region: "center",
        id: "richiesta_utente",
        baseCls: 'finestra_user',
        html: '<div class="left_col chat_link"><img id="thumb2" src="' + url_chat_thumb + '"></div><div class="right_col chat_link"><a id="link_utente2" href="'+url_base+'" target="_blank">'+ tmsg24 +'</a><br><a id="accetta" href="#">'+ tmsg30 +'</a><br><a href="#" id="rifiuta">'+ tmsg31 +'</a><br><a id="blocca_richiesta_chat" href="#">'+ tmsg26 +'</a><br><a id="segnala_abuso" href="#">'+ tmsg27 +'</a></div>'
      }],
      buttons: [{
        text: tmsg28,
        handler: function(){
          winRichiesta.hide();
        }
      }]
    });
    
    var winStanza = new Ext.Window({
      layout: "border",
      width: 200,
      height: 100,
      resizable: false,
      bodyBorder: false,
      buttonAlign: 'center',
      closable: false,
      border: false,
      closeAction: 'hide',
      title: tmsg23 ,
      modal: true,
      items: [{
        region: "center",
        baseCls: 'finestra_user',
        html: '<div class="link_stanza">'+ tmsg32 +'</div>'
      }],
      buttons: [{
        text: tmsg33,
        handler: function(){
        
          var new_tab = new Ext.Panel({
            title: nome_stanza,
            id: richiesta_stanza,
            iconCls: 'stanze',
            baseCls: 'boxmsg',
            closable: true
          });
          
          // Chiusura di una stanza
          new_tab.on('beforedestroy', function(p){
            tab_attivo= p.title;
            
            stop_msg = true;
            //if ((stanza_vip) && (stanza_vip[tab_attivo])) {
            if(nome_stanza){
            	Uscita_Stanza(richiesta_stanza);
            }
            //} /* else {  
            //  Uscita_Stanza(richiesta_stanza, nick_name + ' � uscito/a dalla stanza.');
            //} */  
            //tabs_messaggi.remove(richiesta_stanza);
            
            // Elimino il vettore dei messaggi della stanza
            arr_chat[tab_attivo] = null;
            old_messages= null;
            tab_attivo = null;
            msg_editor.reset();
            msg_editor.disable();
			
			if(nome_stanza != ''){
				is_stanza = false;
				nome_stanza = '';
			}
            
            UpdateUtenti();
            UpdateStanze();
            
            if (!session_chat_closed) {
              stop_msg = false;
            }
          });
          
          
          // Aggiungo il tab al panel dei messaggi
          tabs_messaggi.add(new_tab);
          
          //tabs_messaggi.doLayout();
          winStanza.hide();
          is_stanza = true;
          tab_attivo = richiesta_stanza;
          
          // Comunico l'apertura della stanza ad RChat
          Entrata_Stanza(richiesta_stanza);
          tabs_messaggi.activate(tab_attivo);
          document.getElementById(tab_attivo).innerHTML = '';
          new_tab.on('activate', function(p){
            tab_attivo = p.id;
            is_stanza = true;
            
            UpdateUtenti();
            
            if (!attivo[tab_attivo]) {
              msg_editor.reset();
              msg_editor.disable();
            }
            else {
              msg_editor.enable();
              
              if (document.getElementById(tab_attivo)) {
                // Posiziona la scrollbar verticale in fondo
                document.getElementById(tab_attivo).scrollTop = document.getElementById(tab_attivo).scrollHeight;
              }
            }
            
          });
          
        }
      }, {
        text: tmsg34,
        handler: function(){
          winStanza.hide();
          stop_msg = false;
        }
      }]
    });
    
    var tab_stanza = new Ext.Panel({
      title: tmsg35,
      id: 'tab1',
      iconCls: 'stanze',
      closable: false,
      enabled: false
    });
    
    var tabs_messaggi = new Ext.TabPanel({
      activeTab: 0,
      autoScroll:false,
      tabPosition: "bottom",
      //width:timeout,
      height: 390,
      plugins: new Ext.ux.TabCloseMenu()
      //items: [tab_stanza]
    });
    
    var categorie = new Ext.data.Store({
      proxy: new Ext.data.HttpProxy({
        url: server_rchat + '/rooms/categories?application=' + application_id,
        method: 'GET'
      }),
      reader: new Ext.data.JsonReader({        //root: 'data',
        //id: 'macro'
      }, ['category']),
      autoLoad: true
    });
    
    var combo_stanze = new Ext.form.ComboBox({
      store: categorie,
      mode: 'remote',
      displayField: 'category',
      forceSelection: true,
      valueField: 'category',
      width: 175,
      height: 50,
      triggerAction: 'all',
      emptyText: tmsg36 ,
      editable: false
    });
    
    combo_stanze.on("select", function(){
      if (!first_time) {
        UpdateStanze();
      }  
    });
	
    
    var tree_stanze = new Ext.tree.TreePanel({
      animate: false,
      autoScroll: true,
      width: 175,
      height: 318,
      containerScroll: true,
      rootVisible: false,
      loader: new Ext.tree.TreeLoader({
        dataUrl: url_me + 'get_stanze.php',
        clearOnLoad: true,
        preloadChildren: true,
        baseParams: {
          macro: combo_stanze.getValue()
        }
      }),
      root: new Ext.tree.AsyncTreeNode({
        text: tmsg35 ,
        draggable: false,
        id: 'stanze'
      }),
      listeners: {
        click: function(t, e){
          if (t.attributes.leaf) {
            if (!nome_stanza) {
              if (t.attributes.iconCls == 'stanze_piene' || t.attributes.iconCls == 'stanze_piene_vip') {
                Ext.MessageBox.alert('Info', msg_stanza_full);
              }
              else {
                stop_msg = true;
                
                //richiesta_stanza = t.attributes.text;
                // Modifica a seguito dell'introduzione dei title nelle stanze
                richiesta_stanza = t.attributes.id;
				nome_stanza = t.attributes.text.substr(0, t.attributes.text.indexOf('('));
                
                // Se la stanza � VIP la memorizzo (controllo l'id dell'elemento del tree)
                if (t.attributes.vip== 1) {
                  stanza_vip[richiesta_stanza] = 1;
                }
                // Modifica a seguito dell'introduzione dei title nelle stanze
                /*
                else {
                  richiesta_stanza = richiesta_stanza.substring(0, richiesta_stanza.indexOf('(') - 1);
                }
                */
                
                winStanza.setPosition(e.getPageX(), e.getPageY());
                if (richiesta_stanza.indexOf('_wap') > -1) {
                  winStanza.setTitle( tmsg37 + nome_stanza.substring(0, richiesta_stanza.indexOf('_wap')));
                } else {
                  winStanza.setTitle( tmsg37 + nome_stanza);
                }
                winStanza.show();
              }  
            }
            else {
              Ext.MessageBox.alert('Info', msg_no_stanza);
            }
          }
        }
      }
    });
      
    tree_stanze.getLoader().on("beforeload", function(tl, node){
      tl.baseParams.macro = combo_stanze.getValue();
    });
        
    var tree_utenti = new Ext.tree.TreePanel({
      animate: false,
      autoScroll: true,
      width: 175,
      height: 340,
      containerScroll: true,
      rootVisible: false,
      loader: new Ext.tree.TreeLoader({
        dataUrl: url_me + 'get_utenti.php',
        baseParams: {
          stanza: tab_attivo,
          token: token
        },
        clearOnLoad: true,
        preloadChildren: true
      }),
      root: new Ext.tree.TreeNode({
        text: tmsg38 ,
        draggable: false,
        id: 'utenti'
      }),
      listeners: {
        click: function(t, e){
          // Se l'utente � un moderatore
          if (!((is_stanza) && (stanza_vip) && (stanza_vip[tab_attivo]))) {
            if (t.attributes.iconCls == 'moderatore') {
            	//openWinModeratore(e.getPageX(), e.getPageY(), t.attributes.id); 
            }
            else if(t.attributes.text.toLowerCase() != nick_name){
            
              var utente_nick = t.attributes.text;
              
              // Elimino il campo (wap) dal nick utente
              var pos = utente_nick.indexOf(' (');
              if (pos != -1) {
                utente_nick = utente_nick.slice(0, pos);
              }
              
              openWinUtente(e.getPageX(), e.getPageY(), t.attributes.id, utente_nick);
              
            }
          }  
        }
      }
    });
    
    // Apre la finestra del moderatore
    function openWinModeratore(xPos,yPos, idMod) {
      stop_msg = true;
      id_moderatore = idMod;
      winModeratore.setPosition(xPos - 100, yPos);
      winModeratore.show();
      msg_mod_editor.reset();
      msg_mod_editor.focus();
    }
    
    // Apre la finestra dell'utente
    function openWinUtente(xPos,yPos,id,nick) {
      
      if(id != null){
      winUser.setPosition(xPos, yPos);
      winUser.setTitle(tmsg23 + nick);
      winUser.show();
            
      // Aggiorno le informazioni nella finestra dell'utente
      Ext.get('thumb').dom.src = url_chat_thumb + '?nick=' + nick;
      Ext.get('link_utente').dom.href = 'http://' + nick + '.' + base_domain;
      Ext.get('chat_privata').removeAllListeners();
      Ext.get('chat_privata').on('click', function(){
        if (num_im < max_im) {
          RichiestaChat(id, nick);
          winUser.hide();
        }
        else {
          messageAlert('max_private_chat');
        }
      });
     
      Ext.get('blocca_chat').removeAllListeners();
      Ext.get('blocca_chat').on('click', function(){
        BloccaUtente(id, nick);
        winUser.hide();
      });
      
      Ext.get('segnala_abuso').removeAllListeners();
      Ext.get('segnala_abuso').on('click', function(){
        SegnalaAbuso(id, tab_attivo);
        winUser.hide();
      });
      }
    }
    
    tree_utenti.getLoader().on("beforeload", function(tl, node){
      tl.baseParams.stanza = tab_attivo;
      tl.baseParams.token = token;
    });
    
    var tree_richieste = new Ext.tree.TreePanel({
      animate: false,
      autoScroll: true,
      width: 175,
      height: 340,
      containerScroll: true,
      rootVisible: false,
      loader: new Ext.tree.TreeLoader({
        dataUrl: url_me + 'get_richieste.php',
        baseParams: {
          profile_id: profile_id,
          token: token
        },
        clearOnLoad: true
      }),
      root: new Ext.tree.TreeNode({
        text: tmsg39
      }),
      listeners: {
        click: function(t, e){
          var utente_nick = t.attributes.text;
          
          // Elimino il campo (wap) dal nick utente
          var pos = utente_nick.indexOf(' (');
          if (pos != -1) {
            utente_nick = utente_nick.slice(0, pos);
          }
          
          winRichiesta.setPosition(e.getPageX(), e.getPageY());
          
          winRichiesta.show();
          
          // Aggiorno le informazioni nella finestra dell'utente
          Ext.get('thumb2').dom.src = url_chat_thumb + '?profile_id=' + t.attributes.id;
          Ext.get('link_utente2').dom.href = 'http://' + utente_nick + '.' + base_domain;
          Ext.get('accetta').removeAllListeners();
          Ext.get('accetta').on('click', function(){
          
            getLastMsgId(t.attributes.id, utente_nick);
            AccettaChat(t.attributes.id, utente_nick);
            winRichiesta.hide();
            
          });
          Ext.get('rifiuta').removeAllListeners();
          Ext.get('rifiuta').on('click', function(){
            RifiutaChat(t.attributes.id, utente_nick);
            winRichiesta.hide();
          });
         
          Ext.get('blocca_richiesta_chat').removeAllListeners();
          Ext.get('blocca_richiesta_chat').on('click', function(){
            BloccaUtente(t.attributes.id, utente_nick);
            winRichiesta.hide();
          }); 
          
          Ext.get('segnala_abuso').removeAllListeners();
          Ext.get('segnala_abuso').on('click', function(){
            SegnalaAbuso(t.attributes.id, tab_attivo);
            winRichiesta.hide();
          });
        }
      }
    });
    
    tree_richieste.getLoader().on("beforeload", function(tl, node){
      tl.baseParams.profile_id = profile_id;
      tl.baseParams.token = token;
    });
    
    var tabs_stanze = new Ext.TabPanel({
      activeTab: 0,
      height: 390,
      defaults: {
        autoScroll: true
      },
      layoutOnTabChange: true,
      bodyStyle: 'background-color:#E0E8EF;',
      items: [{
        title: tmsg35 , // non so se si debba tradurre anche qui
        bodyStyle: 'background-color:#E0E8EF;',
        items: [combo_stanze, tree_stanze]
      }, {
        title: tmsg38, // non so se si debba tradurre anche qui
        bodyStyle: 'background-color:#E0E8EF;',
        items: [tree_utenti]
      }, {
        title: tmsg39, // non so se si debba tradurre anche qui
        bodyStyle: 'background-color:#E0E8EF;',
        items: [tree_richieste]
      }]
    });
    
    tabs_stanze.on('tabchange', function(){
    
      switch (tabs_stanze.getActiveTab().title) {
      
        case 'Stanze':
          if (!first_time) {
            UpdateStanze();
          } else {
            first_time=false;
          }  
          break;
          
        case 'Utenti':
          UpdateUtenti();
          break;
          
        case 'Richieste':
          UpdateRichieste();
          break;
      }
      
    });
    
    /* 
     var msg_editor = new Ext.form.HtmlEditor({
     id: 'msgeditor',
     hideLabel: true,
     height: 50,
     enableAlignments: false,
     enableFont: false,
     enableFontSize: false,
     enableLinks: false,
     enableLists: false,
     enableSourceEdit: false
     });
     */
    
    var button_color = new Ext.Toolbar.MenuButton({
      text: '<div id="button_color"></div>',
      tooltip: {text: tmsg40 , title:'Colori', autoHide:true},
      menu : { items: [new Ext.menu.ColorItem({selectHandler:function(cp, color){
                  document.getElementById('button_color').style.backgroundColor= '#'+color;
                  color_msg= color;  
                }})]}
    });
    
    var button_icon = new Ext.Toolbar.MenuButton({
      text: '<div id="button_icon"></div>',
      tooltip: {text: tmsg41, title:'Emoticon', autoHide:true},
      menu: { 
          id: 'mainMenu',
          items: [{
            text: ':)',
            iconCls: 'sorriso',
            handler: function() {
              setEmoticon(':)');
            }
          },{
            text: ':(',
            iconCls: 'triste',
            handler: function() {
              setEmoticon(':(');
            }
          },{
            text: ':o',
            iconCls: 'sorpreso',
            handler: function() {
              setEmoticon(':o');
            }
          },{
            text: ':D',
            iconCls: 'felice',
            handler: function() {
              setEmoticon(':D');
            }
          },{
            text: ':P',
            iconCls: 'sarcastico',
            handler: function() {
              setEmoticon(':P');
            }
          },{
            text: ':;',
            iconCls: 'occhiolino',
            handler: function() {
              setEmoticon(';)');
          }
          }]
      },
      handler: function(){
        msg_editor.setValue(msg_editor.getValue()+selected_emoticon);
      }
    });
    
    // Inserisce l'emoticon specificata alla fine del messaggio
    function setEmoticon(emoticon) {
      selected_emoticon= emoticon;
      msg_editor.setValue(msg_editor.getValue()+selected_emoticon);
      document.getElementById('button_icon').style.background= 'url('+dir_icon+icons[selected_emoticon]+')';
    }
    
    var msg_editor = new Ext.form.TextField({
      id: 'msgeditor',
      hideLabel: true,
      height: 25,
      width: 340,
      disabled: true,
      maxLength: max_length_text,
      maxLengthText: tmsg42 + max_length_text + tmsg43
    });
    
    var button_invio = new Ext.Button ({
      text: tmsg44,
      width: 100,
      height: 30,
      //bodyStyle: 'padding:5px 5px 0;background-color:#e6cbe9;font-weight:bold;font-size:13px;color:#6c3377;text-align:center;padding-top:10px;',
      handler: function(){
        InvioMsg(msg_editor.getValue());
      }      
    });
    
    var form_messaggi = new Ext.Panel({
      region: 'south',
      width: 490,
      height: 90,
      layout:'table',
      layoutConfig: {columns:4},
      border: false,
      id: 'form_msg',
      // modCri : tolta combo scelta colori
      items: [msg_editor,/*button_color,*/button_icon,button_invio],
      bodyStyle: 'padding:5px 5px 0;background-color:#E0E8EF;font-weight:bold;font-size:14px;color:#6c3377;text-align:center;padding-top:10px;',
      keys: [{
        key: Ext.EventObject.ENTER,
        fn: function(){
          if(msg_editor.disabled == false)
            InvioMsg(msg_editor.getValue());
        }
      }]
    });
    
    
    var panel_richieste = new Ext.Panel({
      region: 'south',
      width: 200,
      height: 90,
      bodyStyle: 'padding:5px 5px 0;background-color:#E0E8EF;font-weight:bold;font-size:13px;color:#1c4674;text-align:center;padding-top:10px;',
      html: '<div id="box_richiesta"></div>'
    });
    
    var win = new Ext.Window({
      layout: "border",
      constrain : true,
      width: 700,
      modal: true,
      height: 480,
      resizable: false,
      title: tmsg45,
      bodyStyle: 'background-color:#E0E8EF;',
      //closeAction: 'hide',
      items: [{
        region: "center",
        width: timeout,
        height: 480,
        bodyStyle: 'background-color:#E0E8EF;',
        items: [tabs_messaggi, form_messaggi]
      }, {
        region: "east",
        width: 200,
        height: 480,
        bodyStyle: 'background-color:#f5cfb0;',
        items: [tabs_stanze, panel_richieste]
      }]
    });
    
    win.on('beforeclose', function(){
    
      stop_msg = true;
      token_stop = true;
      client_closing = true;
      
      while (tabs_messaggi.items.keys.length > 0) {
        tab_attivo = tabs_messaggi.items.keys[0];
        tabs_messaggi.remove(tabs_messaggi.items.keys[0]);
      }
      
      arr_chat = null;
      tab_attivo = null;
      attivo = null;
      
      // Attivo il polling delle richieste di chat nella community
      chat_request = true;
    });
    
    
    // Gestione degli Eventi
    function InvioMsg(msg){
    
      if (msg != '') {
        msg_editor.reset();
        msg_editor.disable();
        button_invio.disable();
        //sndMessage(msg.replace(/\'/g, "\\'"));
        if ((is_stanza) && (stanza_vip) && (stanza_vip[tab_attivo])) {
          data_invio = new Date();
        }  
        sndMessage(msg.substr(0,80));
      }
      
    }
    
    // Aggiorna l'albero delle stanze 
    function UpdateStanze(){
      if (!first_time) {
        tree_stanze.getLoader().load(tree_stanze.root);
      }
      //tree_stanze.render();
    }
    
    // Aggiorna l'albero degli utenti   
    function UpdateUtenti(){
      //if (is_stanza) {
        tree_utenti.getLoader().load(tree_utenti.root);
      //}
      //tree_utenti.render();
    }
    
    
    var rcvRequest = function(o){
    
    	try{
    		var req = Ext.util.JSON.decode(o.responseText);
    	} 
    	catch(e){
    		messageAlert('generic');
    	}
	  
    	var nuove_richieste = 0;
      
    	for(i = 0; i < req.length; i++){
    		if(req[i].userType == 'STANDARD' && arr_chat[req[i].nick] == null){
    			nuove_richieste++;
    		}
    		else if(req[i].userType == 'MOD'){
    			alert(req[i].userType);
    		}
    	}
      
    	if(nuove_richieste != num_richieste){
    		tree_richieste.getLoader().load(tree_richieste.root);
    		if(req.length == 0){
    			testo_richieste = "";
    		}	
    		else{
    			testo_richieste = tmsg46;
    		}
        
    		document.getElementById('box_richiesta').innerHTML = testo_richieste;
    		num_richieste = nuove_richieste;
    	}
    };
    
    function UpdateRichieste(){
    
    	var snd_url;
		snd_url = url_chat_request;
		  
		Ext.Ajax.request({
		   url: snd_url,
		   timeout: timeout,
		   method: 'GET',
		   success: rcvRequest,
		   failure: responseFailure
		});
    }
    

    // -----------------------------------------
    // SEGNALAZIONE ABUSO
    // -----------------------------------------
    function SegnalaAbuso(profile_id, room){
    
    	Ext.Ajax.request({
 		   url: url_base + client_chat + 'report_abuse.php?profile_id=' + profile_id + '&room=' + room,
 		   timeout: timeout,
 		   method: 'GET',
 		   success: SegnalaAbusoCallback,
 		   failure: responseFailure
 		});
    }
    
    function SegnalaAbusoCallback(o){
    	
    	if(o.responseText != 'OK'){
    		messageAlert('generic');
    	}
    	else{
    		messageAlert('abuse_ok');
    	}
    }   
    // -----------------------------------------
    // FINE SEGNALAZIONE ABUSO
    // -----------------------------------------
    
    // ---------------------------------------------------------------
    // MAIN
    // ---------------------------------------------------------------
    
    
    //Inzializzo client chat engine
    Init_Chat();
    
    
    Init_Sessione_RChat();
    
    //Imposto il timer
    //modCri : visualizzazione countdown 
    var timeLeft = delay_chat_vip / 1000;
    var task = {
      run: function(){
      
        if (!stop_msg) {
        
          // Se � attivo un tab stanza o chat 1:1
          if ((tab_attivo != null) && attivo[tab_attivo]) {
            rcvMessages();
            //msg_editor.focus();
          }
          
          if ((is_stanza) && (stanza_vip) && (stanza_vip[tab_attivo])) {
            if ((msg_editor.disabled) && (data_invio)) {
              data_attuale = new Date();
              
              if (data_attuale.getTime() - data_invio.getTime() > delay_chat_vip) {
                msg_editor.enable();
                button_invio.enable();
                //msg_editor.focus();
                msg_editor.setValue('');
                timeLeft = delay_chat_vip / 1000;
              }
              else
                msg_editor.setValue(wait_message_vip);
            }    
          }
                 
        }
        
      },
      interval: 5000 //5 second
    };
    
    var task_moderatore = {
      run: function(){
        if (!stop_msg) {
          if (!rcv_moderatori) {
            // Ricezione messaggi dai moderatori
            rcvModMessages();
          }
        }
      },
      interval: 15000 //9000 //9 second
    };
    
    var task_richieste_chat = {
      run: function(){
        if (!stop_msg) {
          // Controllo richieste di chat 1:1  
          UpdateRichieste();
        }
      },
      interval: 8000 //8 second
    };
    
    var task_utenti = {
    	run: function(){
    		if(is_stanza){
    			UpdateUtenti();
    		}
      	},
      	interval: 30000 //30 second
    };
    
    		
    
    // Task ricezione messaggi stanze e chat 1:1
    Ext.TaskMgr.start(task);
  
    // Task ricezione richieste di chat
    Ext.TaskMgr.start(task_richieste_chat);
    
    // Task aggiornamento utenti in stanza
    Ext.TaskMgr.start(task_utenti);
    
  });
  
}
}

