/** 
 * login.js - File che permette la gestione del form per il login al sito.
 *
 * @client FERRETTI GIORGIO - via Cagli, 14 - 60019 Senigallia (AN) - Italy - <info@ferrettigiorgio.com>   
 * @author Antonio Bencivenga <a.bencivenga@mahs.it>, Marco Giammarini <m.giammarini@mahs.it>
 * @version 0.1.0
 * @copyright 2009-2010 - MAHS di Antonio Bencivenga - www.mahs.it - ALL RIGHT RESERVED  
 * @package 005.002.005.2009-10
 */ 
var LogIn = 
{
  /*
   * Funzione di inizializzazione dell'oggetto. Necessaria per funzionare con mahs.js
   */
  init: function()
  { 
    var loginButton = document.getElementById("login-button");

    if(loginButton != null)
    {	
      MAHSCore.addEventListener(loginButton, "click", LogIn.loginListener);
    }
  },

  redirectListener: function(event)
  { 
	MAHSCore.preventDefault(event);

	var redirect = document.getElementById("login-redirect").value;
    location.href = redirect;
  },
  

  /*
   * Questa funzione viene richiamata quando l'utente clicca sul submit del form di login.
   * Si occupa innanzi tutto di bloccare l'evento, poi acquisisce ed elabora username e password per poi passarle ad una richiesta AJAX.
   *
   * @param event E' l'evento di submit del form di login.
   */
  loginListener: function(event)
  {
	MAHSCore.preventDefault(event);

	// acquisisco tutti gli elementi presenti nel form.
    var logStatus = document.getElementById("login-report");

	var logUser = document.getElementById("login-username");
    if((logUser.value == "") || (MAHSCore.hasClass(logUser,"not-validate")))
    {
      // Avverto l'utente dell'errore.
      LogIn.writeError(logStatus,"Lo UserName non &egrave; valido o &egrave; vuoto!");	
      return;
    }

    var logPass = document.getElementById("login-password");
    if((logPass.value == "") || (MAHSCore.hasClass(logPass,"not-validate")))
    {
      // Avverto l'utente dell'errore.
      LogIn.writeError(logStatus,"La PassWord non &egrave; valida o &egrave; vuota!");	
      return;
    }
	  
	  
    // acquisisco tutti gli elementi presenti nel form.
    var logStatus = document.getElementById("login-report");

    //var logUser = document.getElementById("login-username");
    //var logPass = document.getElementById("login-password");
    var logKey = document.getElementById("login-key");

    var userV = logUser.value;	
    var passV = logPass.value;
    var keyV = logKey.value;

    if(passV)
    {
      passV = SHA1(passV);
      passV = SHA1(passV + keyV);
      // Svuoto i campi input della key e della password.
      //logKey.value = "";
      logPass.value = "";
      // Chiamo la funzione che si occupa della chiamata asincrona.
      LogIn.ajaxConnection(userV, passV);
    }
  },

  /*
   * Questa funzione gestisce la chiamata asincrona.
   *
   * @param userV Lo username inserito dall'utente.
   * @param passV La password inserita dall'utente ed elaborata da js.
   */
  ajaxConnection: function(userV, passV)
  {
    // Creo la richiesta ajax.
    var req = null;

    if (typeof XMLHttpRequest != "undefined")
      req = new XMLHttpRequest();

    if (!req && typeof ActiveXObject != "undefined")
    {
      try
      {
        req=new ActiveXObject("Msxml2.XMLHTTP");
      }
      catch (e1)
      {
        try
        {
          req=new ActiveXObject("Microsoft.XMLHTTP");
        }
        catch (e2)
        {
          try
          {
            req=new ActiveXObject("Msxml2.XMLHTTP.4.0");
          }
          catch (e3)
          {
            req=null;
          }
        }
      }
    }

    if(!req && window.createRequest)
      req = window.createRequest();

    if (!req)
      alert("Il browser non supporta AJAX");

    var loginForm = document.getElementById("form-login");
    var loginUrl = document.getElementById("login-url");
    var logStatus = document.getElementById("login-report");
    var logButton = document.getElementById("login-button-row");

    if (req != null)
    {
      loginForm._timer = setTimeout(function()
      {
        req.abort();
        LogIn.writeError(logStatus, "Time Out");

      }, 10000);

      // Viene creata la striga da passare durante la richiesta.
      var parameters = "name=" + encodeURIComponent(userV) + "&pass=" + encodeURIComponent(passV);
      // Viene inviata la richiesta.
      req.open("POST", loginUrl.value, true);
      req.setRequestHeader("content-type", "application/x-www-form-urlencoded");
      req.setRequestHeader("Content-length", parameters.length);
      req.setRequestHeader("Connection", "close");
      req.onreadystatechange = function()
      {
        clearTimeout(loginForm._timer);

        if (req.readyState == 4)
        {
          if (req.status == 200 || req.status == 304)
          {
            LogIn.writeSuccess(req.responseXML, logStatus, logButton);
          }
          else
          {
            LogIn.writeError(logStatus, "Errore nella connessione con il Server");
          }
        }
      };
      req.send(parameters);
    }
  },

  /*
   * Questa funzione si occupa di gestire la risposta della richiesta asincrona nel caso la connessione e trasmissione siano andati a buon fine.
   *
   * @param responseXML La risposta xml fornita dal server.
   * @param report L'elemento in cui verrà riportata la notifica all'utente.
   * @param button L'elemento che contiene il pulsante per effettuare il login.
   */  
  writeSuccess: function(responseXML, report, button)
  {
    // Dalla risposta xml controllo che il processo di login sia andato a buon fine.
    var validateNode = responseXML.getElementsByTagName("validate")[0];
    var validateTextNode = validateNode.firstChild;
    var validate = validateTextNode.nodeValue;

	if(responseXML != null)
    {
      if(validate == "no")
      {
        // Se i dati non sono validi, lo notifico all'utente.
        MAHSCore.removeClass(report,"report-valid");
        MAHSCore.addClass(report,"report-error");
        report.innerHTML = "Username e/o Password <strong>errati</strong>";
      }
      else
      {
        // Notifico all'utente che il processo di login è andato a buon fine.
        var nomeNode = responseXML.getElementsByTagName("nome")[0];
        var nomeTextNode = nomeNode.firstChild;
        var nome = nomeTextNode.nodeValue;

        var cognomeNode = responseXML.getElementsByTagName("cognome")[0];
        var cognomeTextNode = cognomeNode.firstChild;
        var cognome = cognomeTextNode.nodeValue;

        MAHSCore.removeClass(report,"report-error");
        MAHSCore.addClass(report,"report-valid");

        // Sostituisco senza badare al DOM
        //var redirect = document.getElementById("login-redirect");
        report.innerHTML = "Benvenuto <strong>"+nome + " " +cognome +"</strong>";
        //button.innerHTML = "<input type='image' class='button' id='login-button' src='images/entra.png' value='' onclick=\"location.href='" + redirect.value + "'\" />";
      	MAHSHtml.truncateNode(button);
        var entra = MAHSHtml.tagINPUT("", "login-button", "image", "", "", 0);
        entra.setAttribute("src","images/entra.png");
        MAHSCore.addEventListener(entra, "click", LogIn.redirectListener);
        button.appendChild(entra);

        var logUser = document.getElementById("login-username");
        var logPass = document.getElementById("login-password");
        var logKey = document.getElementById("login-key");

        // Disabilito i campi di inserimento di username e password.
        logUser.disabled = true;
        logPass.disabled = true;
        // Svuoto il campo input della chiave.
        logKey.value = "";
      }
    }
	else
	{
      // Se c'è un errore di conssione
      MAHSCore.removeClass(report,"report-valid");
      MAHSCore.addClass(report,"report-error");
      report.innerHTML = "Errore di conssessione con il server, ritenta!";		
	}
  },

  /*
   * Questa funzione si occupa di avvertire l'utente nel caso si presentasse un errore.
   *
   * @param report Il campo dove inserire la notifica all'utente.
   * @param msg il messaggio che si vuole visualizzare.
   */
  writeError: function(report, msg)
  {
    MAHSCore.removeClass(report,"report-valid");
    MAHSCore.addClass(report,"report-error");
    report.innerHTML = msg;
  },

  /*
   * Questa funzione cancella tutto il contenuto di un elemento.
   *
   * @param obj L'elemento che si vuole svuotare.
   */
  delContent: function(obj)
  {
    for(var j = (obj.childNodes.length - 1); j > -1 ; j--)
    {
      obj.removeChild(obj.childNodes[j]);
    }
  }
  
};

MAHSCore.start(LogIn);
