/* chatURL - URL per aggiornamento dei messaggi */
var chatURL = "server.php";

/* intervallo per la ricchiesta nuovi messaggi */
var updateInterval = 4000; // how many miliseconds to wait to get new message

// debug attivo ?
var debugMode = true;

/* init del cache dei messaggi (lato client)  */
var cache = new Array();

/* lastMessageID - ID del messaggio piu recente */
var lastMessageID = -1;

/* userID - ID del utente in caso sia stablita la chat */
var userID = -1;

/* operatorID - ID del operatore in caso sia stablita la chat */
var operatorID = -1;

/* Proprietario della chat e user */
var chatOwner = 'user';

/* pe - Punatore a Periodical Executer */
var pe;

var bufferAjax = 0;
var bufferErr = 0;

/**
 * Questa funzione inizia la chat, carica tutto nella pagina chat
 */
function init()
{
  $('#chatwindow').hide();
  $('#mailform').hide();
  $('#waitbox').show();
  $("#messageBox").attr("autocomplete", "off");

  // inizializza utente
  var oUser=$("userName");
  var hiddenUser = $('hiddenUserName');

  if($("#userName").val() == "")
  {
    $('#hiddenUserName').val('Ospite');
  }

  // impostazione del flag per nuovo utente
  var params = {
    mode : 'startUser'
  };

  $.post(chatURL, params,
    function(response)
    {
      if (response == false)
      {
        alert('Errore durante elaborazione dei dati. Riprova');
        return false;
      }

      switch(response.mode)
      {
        case 'startUser':
          // risposta contiene anche codice del utente e operatore
          userID = response.user_id;
          operatorID = response.operator_id;

          // qui parte la chat con operatore
          startChatWindow( response );
          break;
        case 'noOperator':
          startMailWindow( response );
          break;
      }

  },'json');
}

/**
 * Chiusura della chat
 */
function endSession()
{
  // prima di tutto chiamo requester per chiudere la chat
  // anche se la risposta non arriva in tempo, non mi preocupo
  // perche in ogni caso la sessione chat viene terminata per TIMEOUT
  // impostazione del flag per nuovo utente
  params = "mode=endUser&user_id=" + encodeURIComponent(userID);
  $.post(chatURL, params);

  if (opener != null) {
    //opener.document.getElementById('attiva').style.display = 'block';
  }
  window.close();
}

/**
 * Start Chat
 */
function startChatWindow( response )
{
  // barre dei messaggi
  preloadImages('images/barra_sistema.gif','images/barra_operatore.gif','images/barra_utente.gif');

  // carico emoticons
  initEmoticons();

  // costruzione contenuto dello stato chat
  $('#inizio_chat').text(response.time);
  $('#durata_chat').text('00:00:00');
  $("#opimg").attr({src : response.operator_image });
  $('address').text(response.address);

  displayFormatedMessage('operator', response.operator_name, response.time, response.message.toString());

  // viene nascosto messaggio attesa
  $('#waitbox').hide();
  // scoperta chat
  $('#chatwindow').show();

  // parte la ricerca periodica dei messaggi
  pe = setInterval("requestNewMessages()",updateInterval);
}

/**
 * Se nessun operatore e attivo, viene visualizzato modulo mail
 */
function startMailWindow( response )
{
  // viene nascosto messaggio attesa
  $('#o_address').html(response.address);
  // nscosto chat
  $('#chatwindow').hide();
  $('#waitbox').hide();

  // visulizza form invio mail
  $('#mailform').show();
}

/**
 * Funzione viene chiamata al pressione del INVIA
 */
function sendMessage( )
{
  // Salva messaggio in una variabile locale e pulisce casella di testo
  var oCurrentMessage = $("#messageBox");


  if ($("#hiddenUserName").val() != $("#userName").val())
  {
    if ($("#userName").val() != '')
    {
      $("#hiddenUserName").val($("#userName").val());
    }
  }
  var currentUser = $("#hiddenUserName").val();
  // previene invio messaggi vuoti
  if ($.trim(oCurrentMessage.val()) != "" && $.trim(currentUser) != "")
  {
    if ((chatOwner == 'user')||(chatOwner == 'operator'))
    {
      // se ce bisogno di inviare e ricevere messaggi
      params = "mode=SendAndRetrieveNew" +
            "&id=" + encodeURIComponent(lastMessageID) +
            "&name=" + encodeURIComponent(currentUser) +
            "&user_id=" + encodeURIComponent(userID) +
            "&operator_id=" + encodeURIComponent(operatorID) +
            "&owner=" + encodeURIComponent(chatOwner) +
            "&message=" + encodeURIComponent(oCurrentMessage.val());

      // aggiunta messaggio in coda
      cache.push(params);
      // pulizia casella di testo
      oCurrentMessage.value = "";
    }
  }
  oCurrentMessage.val('');
}

/**
 * Funzione chiamata alla pressione del bottone "Elimina messaggi"
 */
function deleteMessages()
{
  // impostazione del flag per pulizia
  params = "mode=DeleteAndRetrieveNew";
  // aggingi azione nella coda
  cache.push(params);
}

/**
 * Funzione CORE che fa la chiamata in background per ricevere, inviare oppure cancellare messaggi
 */
function requestNewMessages()
{
  // utente e colore
  if ($("#hiddenUserName").val() != $("#userName").val())
  {
    if ($("#userName").val() != '')
    {
      $("#hiddenUserName").val($("#userName").val());
    }
  }
  var currentUser = $("#hiddenUserName").val();

  var params = "";
  // se ci sono le operazioni in coda, viene preso piu vecchio
  if (cache.length>0)
  {
    params = cache.shift();
  }
  // se la cache e vuota, ricerca solo nuovi messaggi
  else
  {
    params = {
      mode        : 'RetrieveNew',
      id          : lastMessageID,
      user_id     : userID,
      operator_id : operatorID
    };
  }

  if (bufferAjax < 20)
  {
    bufferAjax  += 1;
    $.ajax({
      url: chatURL,
      data: params,
      type: "POST",
      dataType: "json",

      // se la risposta da server e coretta
      // vengono visualiazzati risultati
      // (se ce ne sono nuovi messaggi ad esmpio)
      success: function( response )
      {
        try
        {
          readMessages(response);
          bufferAjax -= 1;
          //$('#bufferAjax').text(bufferAjax);
          if ((pe=='-1')&&(bufferAjax<1))
          {
            pe = setInterval("requestNewMessages()",updateInterval);
          }
        }
        catch(e)
        {
          displayError(e.toString());
        }
      },

      // nel caso che server ci mette troppo a rispondere
      // o la risposta non e coretta (intestazioni)
      // cancello "pe" - periodical executer
      error: function( request )
      {
        bufferErr += 1;
        if (bufferErr>2)
        {
          clearInterval(pe);
          pe = '-1';
          alert('Attenzione!!! '+"\n"+
                'Chat scollegata. '+"\n"+
                'Si prega di effettuare nuovamente l\'accesso.');
        }
      }
    });
  }
  else
  {
    clearInterval(pe);
    pe = '-1';
  }
}

/**
 * Fuzione che processo la risposta del server durante aggiornamento messaggi
 */
function readMessages(responseJSON)
{
  if (responseJSON[0].mode)
  {
    var func = responseJSON[0].mode;
    if ( eval(func+'('+$.toJSON(responseJSON)+')') ) {
      return;
    }
  }

  $('#durata_chat').text(responseJSON[0].elapsed);

  // verifica se ce un flag di pulizia schermo chat
  clearChat = responseJSON[0].clear;
  if(clearChat == "true")
  {
    // pulizia della finestra e reimpostazione del ID messaggio
    $("#scroll").text("");
    lastMessageID = -1;
  }

  idArray = new Array();
  ownerArray = new Array();
  nameArray = new Array();
  timeArray = new Array();
  messageArray = new Array();

  for(i=0;i<responseJSON[1].results.length;i++)
  {
    idArray[i] = responseJSON[1].results[i].id;
    ownerArray[i] = responseJSON[1].results[i].owner;
    nameArray[i] = responseJSON[1].results[i].name;
    timeArray[i] = responseJSON[1].results[i].time;
    messageArray[i] = responseJSON[1].results[i].message;
  }

  // aggiunta nuovi messaggi nella finestra chat
  displayMessages(idArray, ownerArray, nameArray, timeArray, messageArray);

  // ID ultimo messaggio ricevuto viene aggiornato localmente
  if(idArray.length>0) {
    lastMessageID = idArray[idArray.length - 1]; // restart sequence
  }
}

/**
 * Aggiunta nuovi messaggi nella finestra chat
 */
function displayMessages(idArray, ownerArray, nameArray, timeArray, messageArray)
{
  // ogini ciclo aggiunge singolo messaggio
  for(var i=0; i<idArray.length; i++)
  {
    // dettagli singolo messaggio
    var owner = ownerArray[i];
    var time = timeArray[i];
    var name = nameArray[i];
    var message = messageArray[i];

    displayFormatedMessage(owner, name, time, message.toString())
  }
}

/**
 * visualizza singolo messaggio
 */
function displayMessage(message)
{
  // visualizza HTML messaggio
  $("#scroll").html($("#scroll").html()+message);

  // scroll in basso della finestra messaggi
  $("#scroll").attr({ scrollTop: $("#scroll").attr("scrollHeight") });
}

/**
 * Funzione per gestione visualizazzione messaggi di errore
 */
function displayError(message)
{
  displayMessage("Error accessing the server! "+ (debugMode ? "<br/>" + message : ""));
}

/**
 * Gestione del loout operatore
 */
function operatorGoesOffline( response )
{
  clearInterval(pe);
  //var data = response[0];
  // viene nascosto messaggio attesa

  // viene nascosto messaggio attesa
  // nscosto chat
  $('#chatwindow').hide();
  // visulizza form invio mail
  $('#mailform').show();
  operatorID = 0;
  alert('Attenzione.\nPer motivi tecnici la conversazione con operatore e stata interrotta.\nVi preghiamo di lasciare vostri dati, sarete contattati.');
  return true;
}

/**
 *
 */
function endUser( response )
{
  clearInterval(pe);
  //var data = response[0];
  alert('Fine chat');
  if (opener != null) {
    opener.document.getElementById('attiva').style.display = 'block';
  }
  return true;
}

/**
 * Handler del evento tastiera
 */
function handleKey(e)
{
  e = (!e) ? window.event : e;

  // codice del tasto premuto
  code = (e.charCode) ? e.charCode : ((e.keyCode) ? e.keyCode : ((e.which) ? e.which : 0));

  if (e.type == "keydown")
  {
    // se premuto enter (codice 13)
    if(code == 13)
    {
      // invia messaggio corente
      this.e = undefined;
      sendMessage();
      return false;
    }
  }
}

/**
 *
 */
function displayFormatedMessage(owner, owner_name, time, message)
{
  switch(owner) {
    case 'user':
      cssClass = 'banner_user';
      cssMsg = 'text_user';
      break;
    case 'operator':
      cssClass = 'banner_operator';
      cssMsg   = 'text_operator';
      break;
    case 'system':
      cssClass = 'banner_system';
      cssMsg   = 'text_system';
      break;
  }

  $("#scroll")
    .append(
      $('<div>')
        .addClass(cssClass)
        .append(
          $('<span>').addClass('n').text(owner_name)
        )
        .append(
          $('<span>').addClass('o').text(time)
        )
    )
    .append(
      $('<div>').addClass(cssMsg).html(parseMessage( $.trim(message) ))
    );

  $("#scroll").attr({ scrollTop: $("#scroll").attr("scrollHeight") });
}
