/**
 * Arpamet Web Client
 *
 * Web based jabber client to use with Arpamet
 * accounts.
 *
 * @author Marcos Gabarda <marcos@arpamet.com>
 */

//JQuery is required.
//JSJaC is required.

/**
 * Clase ArpaWebClient.
 */
var arpaWebClient;
function ArpaWebClient(arpametUser, arpametPassword)
{

  if (arpaWebClient) return arpaWebClient;
  arpaWebClient = this;
  
  /**************
   * Atributos. *
   **************/
  this.con = null;
  
  this.lastError = '';
  this.currentStatus = '';
  
  this.arpametUser = arpametUser;
  this.arpametPassword = arpametPassword;
  this.arpametJabberUser = '';
  this.arpametJabberPassword = '';
  this.arpametJabberServer = '';

  this.enableOut = true;
  this.enableStatus = true;
  this.enableMsg = true;

  this.connectingText = "Conectando...";
  this.availableText = "Disponible";
  this.unavailableText = "No disponible";
  this.disconnectedText = "Desconectado";
  
  this.outId = "awc_out";
  this.statusId = "awc_status";
  this.msgId = "awc_msg";

  /***********
   * Métodos *
   ***********/
  this.proccessMessage = awc_proccessMessage;
  this.connect = awc_connect;
  this.quit = awc_quit;
  return false; 
}

/*********************************
* Métodos de gestion de estado. *
*********************************/
function setConnecting()
{
  arpaWebClient.currentStatus = 'connecting';
  if (arpaWebClient.enableStatus)
    $('#' + arpaWebClient.statusId).html('<img src="'+URL_ROOT+'/awc/img/loop.png" />' + arpaWebClient.connectingText);
}
function setAvailable()
{  
  $.cookie("arpamet_last_presence", "available", { path: '/', domain: 'arpamet.com' });
  arpaWebClient.currentStatus = 'available';
  if (arpaWebClient.enableStatus)
    $('#' + arpaWebClient.statusId).html('<a href="javascript:toggleStatus();" class="toggle"><img src="'+URL_ROOT+'/awc/img/green.png" />'  + arpaWebClient.availableText + '</a>');
  var p = new JSJaCPresence();
  con.send(p);
}
function setUnavailable()
{
  $.cookie("arpamet_last_presence", "unavailable", { path: '/', domain: 'arpamet.com' });
  arpaWebClient.currentStatus = 'unavailable';
  if (arpaWebClient.enableStatus)
    $('#' + arpaWebClient.statusId).html('<a href="javascript:toggleStatus();" class="toggle" ><img src="'+URL_ROOT+'/awc/img/red.png" />' + arpaWebClient.unavailableText + '</a>');
  var p = new JSJaCPresence();
  p.setType("unavailable");
  con.send(p);
}
function toggleStatus()
{
  if (arpaWebClient.currentStatus == 'available')
  {
    setUnavailable();
  }
  else if (arpaWebClient.currentStatus == 'unavailable')
  {
    setAvailable();
  }
}

function reSetStatus()
{
  if (arpaWebClient.currentStatus == 'unavailable')
  {
    setUnavailable();
  }
  else if (arpaWebClient.currentStatus == 'available')
  {
    setAvailable();
  }
}

/**************************************
* Métodos de manejadores de eventos. *
**************************************/
function handlePresence(aJSJaCPacket) {
  if (aJSJaCPacket.getType() && aJSJaCPacket.getType() == "subscribe")
  {
    var p = new JSJaCPresence();
    p.setTo(aJSJaCPacket.getFromJID());
    p.setType("subscribed");
    con.send(p);
  }
}
function handleConnected()
{
  /**
   * Recovery previous status.
   */
  if ($.cookie("arpamet_last_presence"))
  {
    var lastPresence = $.cookie("arpamet_last_presence");
    if (lastPresence == "available")
    {
      setAvailable();
    }
    else if (lastPresence == "unavailable")
    {
      setUnavailable();
    }
    else 
    {
      setAvailable();
    }
  }
  else
  {
    setAvailable();
  }
  /**
   * Add arpamet@arpamet.com bot.
   * TODO Only if is not added.
   */
  var p = new JSJaCPresence();
  if (URL_ROOT == "http://arpamet.com")
  {
	  p.setTo("arpamet@arpamet.com");
  }
  else
  {
	  p.setTo("arpamet.unstable@dev.arpamet.com");
  }
  p.setType("subscribe");
  con.send(p);
  /**
   * Refreshing the status.
   */
  window.setInterval ("reSetStatus();", 60000 );

}
function handleDisconnected()
{  
  arpaWebClient.currentStatus = 'disconnected';
  if (arpaWebClient.enableStatus)
    $('#' + arpaWebClient.statusId).html('<a href="javascript:void(0)" onclick="_connect();" class="connect"><img src="'+URL_ROOT+'/awc/img/grey.png" />' + arpaWebClient.disconnectedText + '</a>');
  if (arpaWebClient.lastError != '')
  {
    arpaWebClient.lastError = '';
    _connect();
  }
}
function handleError(e)
{
  var src = "An error occured:<br />"+
  ("Code: "+e.getAttribute('code')+"\nType: "+e.getAttribute('type')+
  "\nCondition: "+e.firstChild.nodeName).htmlEnc();
  if (arpaWebClient.enableOut)
    $('#' + arpaWebClient.outId).html(src);
  if (con.connected())
  {
    arpaWebClient.lastError = e.getAttribute('code');
    con.disconnect();
  }
}
// Sobrescribir para darle un tratamiento a la llamada distinto.
function awc_proccessMessage(msg, link)
{
  var html = '';
  html += msg;
  html += '<button class="close" onclick="$(\'#' + arpaWebClient.msgId + '\').fadeOut();">Ignorar</button>';
  $('#' + arpaWebClient.msgId).html(html);
  $('#' + arpaWebClient.msgId).fadeIn();
}
function handleMessage(aJSJaCPacket)
{
  var txt = aJSJaCPacket.getBody().htmlEnc();
  msg = txt.replace(/http:\/\/lite.arpamet.com\/(.*)\/(.{8})(\/?)/, "<a href=\"http://lite.arpamet.com/$1/$2/\" target=\"_blank\" onclick=\"$('#" + arpaWebClient.msgId + "').fadeOut();\" >http://lite.arpamet.com/$1/$2/</a>");
  link = txt.match(/http:\/\/lite.arpamet.com\/.*\/.{8}\/?/);
  var html = "<embed src=\"" + URL_ROOT + "/awc/sound/ring.swf\" width=\"1\" height=\"1\" quality=\"high\" pluginspage=\"http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash\" type=\"application/x-shockwave-flash\">";
  $("#" +  arpaWebClient.outId).html(html);
  arpaWebClient.proccessMessage(msg, link);
}

/*********************************
* Configuración de la conexion. *
*********************************/
function setupCon(con)
{
  con.registerHandler('message', handleMessage);
  con.registerHandler('presence', handlePresence);
  con.registerHandler('onconnect', handleConnected);
  con.registerHandler('ondisconnect', handleDisconnected);
  con.registerHandler('onerror', handleError);
}

/***********************
* Loogin into Jabber. *
***********************/
function _connect() {
  setConnecting();
  if (arpaWebClient.enableOut) $('#' + arpaWebClient.outId).html('');
  try {
    // setup args for contructor
    oArgs = new Object();
    oArgs.httpbase = URL_ROOT + '/http-bind'; //Value: http-bind <- aForm.http_base.value;
    oArgs.timerval = 2000;
    
    con = new JSJaCHttpBindingConnection(oArgs);
    
    setupCon(con);
    if (!con.resume()) //Needed if don't close correct the session.
    {
      oArgs = new Object();
      oArgs.domain = arpaWebClient.arpametJabberServer;
      oArgs.username = arpaWebClient.arpametJabberUser;
      
      oArgs.resource = 'ArpametWebClient' + Math.floor(Math.random()*10001); //
      oArgs.pass = arpaWebClient.arpametJabberPassword;
      oArgs.register = false; // aForm.register.checked;
      con.connect(oArgs);
    }
  } catch (e) {
    if (arpaWebClient.enableOut) $('#' + arpaWebClient.outId).html(e.toString());
  } finally {
    return false;
  }
}
function awc_connect()
{
  $.post( URL_ROOT + "/awc/get_jabber_info.php",
          {user: arpaWebClient.arpametUser, pass: arpaWebClient.arpametPassword},
          function (data)
          {
            var arpametJID = data;
            arpaWebClient.arpametJabberUser = arpametJID.split("@")[0];
            arpaWebClient.arpametJabberServer = arpametJID.split("@")[1];
            if (arpaWebClient.arpametJabberPassword == '') arpaWebClient.arpametJabberPassword = arpaWebClient.arpametPassword;
            if ((arpaWebClient.arpametJabberServer == "arpamet.com" || arpaWebClient.arpametJabberServer == "dev.arpamet.com") && (URL_ROOT != "http://localhost" && URL_ROOT != "http://local.arpamet.com" && URL_ROOT != "http://arpametlocal.com")) {
              _connect();
            }
          } );
}

function awc_quit()
{
  var p = new JSJaCPresence();
  p.setType("unavailable");
  con.send(p);
  con.disconnect();
}

/*
NOTAS
$('#awc_status img').onclick <- toogleStatus
*/


  
