function LoginClass(userNameElementId, passwordElementId, captchaImageElementId, captchaTextElementId, loginPage, loginButtonElementId, loginServlet) 
{   
  var _login = this;
  
  var _LoginStatus = { NONE : 'NONE', DOS_LIMIT : 'DOS_LIMIT', EMPTY_USERNAME : 'EMPTY_USERNAME', EMPTY_PASSWORD : 'EMPTY_PASSWORD', WRONG_DATA : 'WRONG_DATA', MYSQL_ERROR : 'MYSQL_ERROR', KO : 'KO', OK : 'OK'};  	
  
  this.userNameElementId = userNameElementId;
  this.passwordElementId = passwordElementId;
  this.captchaImageElementId = captchaImageElementId;
  this.captchaTextElementId = captchaTextElementId;
  this.loginButtonElementId = loginButtonElementId;
  this.loginPage = loginPage;
  this.loginServlet = loginServlet;
  
  this.loginButton = null;
                
  this.captchaImageUpdate = function() 
  {
    var captchaImageElement = document.getElementById(_login.captchaImageElementId);
  	captchaImageElement.src = UIObj.absBaseRoot + '/MakeCaptchaImage.svt' + UIObj.addJSessionId() + "?" + new Date();
  };

  this.fieldsValidate = function() 
  {
  	var fieldElement = null;
    var fieldError = false;
    var validationError = false;
   
    fieldElement = document.getElementById(_login.userNameElementId);
    fieldError = ((fieldElement == 'undefined') || (fieldElement.value == ''));
    if (fieldError)
    {
      UIObj.setUIMessage('Impostare il valore del campo: Nome utente', _login.userNameElementId, false);
    }  
    validationError = (validationError || fieldError);  
  
    if (!validationError)
    {
      fieldElement = document.getElementById(_login.passwordElementId);
      fieldError = ((fieldElement == 'undefined') || (fieldElement.value == ''));
      if (fieldError)
      {
    	UIObj.setUIMessage('Impostare il valore del campo: Password', _login.passwordElementId, false);
      }
      validationError = (validationError || fieldError);
    }  
  
    if (!validationError)
    {
      fieldElement = document.getElementById(_login.captchaTextElementId);
      fieldError = ((fieldElement == 'undefined') || (fieldElement.value == ''));
      validationError = (validationError || fieldError);
      if (fieldError)
      {
    	UIObj.setUIMessage('Impostare il valore del campo: Immagine di controllo', _login.captchaTextElementId, false);
      }
    }  
      
    return (!validationError);
  };
    
  this.loginValidate = function()
  {
    var userNameElement = document.getElementById(_login.userNameElementId);
    var passwordElement = document.getElementById(_login.passwordElementId);
  	var url = UIObj.absBaseRoot + _login.loginServlet + UIObj.addJSessionId();
  	
  	var handleSuccess = function(oResponse)
  	{
  	  var xmlResponse = oResponse.responseXML
      
  	  if(UIObj.isDefined(xmlResponse))	
	  {
		var loginStatus = _login.loginStatusXMLResponseParser(xmlResponse);
		
        switch(loginStatus)
      	{
      	  case _LoginStatus.NONE: {
      		UIObj.setUIMessage('Accesso negato. Impossibile effettuare la verifica', null, false);
      	  	_login.captchaImageUpdate();
      	  	break;
      	  }
      	  case _LoginStatus.DOS_LIMIT: {
      		UIObj.setUIMessage('Accesso negato. Limite richiesta superiore al consentito', null, false);
      	  	_login.captchaImageUpdate();
      	  	break;
      	  }	
      	  case _LoginStatus.EMPTY_USERNAME: {
      		UIObj.setUIMessage('Accesso negato. Impostare il valore del campo nome utente', _login.userNameElementId, false);
      	  	_login.captchaImageUpdate();
      	  	break;
      	  }	
      	  case _LoginStatus.EMPTY_PASSWORD: {
      	    UIObj.setUIMessage('Accesso negato. Impostare il valore del campo password', _login.passwordElementId, false);
      	  	_login.captchaImageUpdate();
      	  	break;
      	  }	
      	  case _LoginStatus.WRONG_DATA: {
      	    UIObj.setUIMessage('Accesso negato. Dati errati', _login.passwordElementId, true);
      	  	_login.captchaImageUpdate();      	  	
      	  	break;
      	  }	
      	  case _LoginStatus.MYSQL_ERROR: {
      	    UIObj.setUIMessage('Accesso negato. Impossibile accedere al database', null, false);
      	  	_login.captchaImageUpdate();
      	  	break;
      	  }
          case _LoginStatus.KO: {
      	    UIObj.setUIMessage('Accesso negato. Impossibile effettuare la verifica', null, false);
      	  	_login.captchaImageUpdate();
      	  	break;
      	  }
      	  case _LoginStatus.OK: {
      	  	UIObj.setUIMessage('Accesso accordato', null, false);
      	  	window.location.href = UIObj.absBaseRoot + "/" + _login.loginPage + UIObj.addJSessionId();
      	  	break;
      	  }
      	  default: {
      		UIObj.setUIMessage('Accesso negato. Impossibile effettuare la verifica', null, false);
      	    _login.captchaImageUpdate();
      	    break;
      	  }
      	}
      	UIObj.displayLoader(false);      	
	  }
	};

    var handleFailure = function(oResponse)
    {
      UIObj.setUIMessage(I18NMessagesObj.messageFormat(I18NMessagesObj.messages['XHRMessages.error'], [oResponse.status]), null, false);
      _login.captchaImageUpdate();
      UIObj.displayLoader(false);	
    };

    new Ajax.Request(
	  url, 
	  { 
	    method: 'post',
	    parameters: 
	    {
	      userName: encodeURIComponent(userNameElement.value),
	      password: encodeURIComponent(passwordElement.value)
	    },  
	    onFailure: handleFailure,
	    onComplete: handleSuccess
	  }
	);

  };
  
  this.captchaXMLResponseParser = function(xmlResponse)
  {
    var validateNode = xmlResponse.getElementsByTagName('validate');
    return (validateNode[0].firstChild.nodeValue == 1);        
  };
  
  this.loginStatusXMLResponseParser = function(xmlResponse)
  {
    var statusNode = xmlResponse.getElementsByTagName('status');
    return (statusNode[0].firstChild.nodeValue);        
  };
  
  this.login = function() 
  {
    UIObj.displayLoader(true);
    UIObj.setUIMessage('Attendere prego...', null, false);
    
    var captchaTextElement = document.getElementById(_login.captchaTextElementId);
    
    if (_login.fieldsValidate())
    {
      UIObj.setUIMessage('Verifica immagine di controllo', null, false);
      
      var url = UIObj.absBaseRoot + "/ValidateCaptcha.svt" + UIObj.addJSessionId();

      var handleSuccess = function(oResponse)
  	  {
  	    if(oResponse.responseText !== undefined)
	    {
	      if (_login.captchaXMLResponseParser(oResponse.responseXML))
          {
	    	UIObj.setUIMessage('Verifica dati', null, false);
            _login.loginValidate();
          }
          else
          { 
            _login.captchaImageUpdate();
            UIObj.setUIMessage('Controllare il valore del campo: Immagine di controllo', _login.captchaTextElementId, true);
            UIObj.displayLoader(false);	 	                        
          } 	  	
    	}
  	  }
  	    
  	  var handleFailure = function(oResponse)
	  {
  	    UIObj.setUIMessage('Errore ajax: ' + oResponse.status, null, false);
	    _login.captchaImageUpdate();
	    UIObj.displayLoader(false);	
	  }
	  
	  new Ajax.Request(
	    url, 
	    { 
	      method: 'post',
	      parameters: 
	      {
	        captcha: encodeURIComponent(captchaTextElement.value)          
	      },  
	      onFailure: handleFailure,
	      onComplete: handleSuccess
	    }
	  );
    }
    else
    {
  	  UIObj.displayLoader(false);
    }      
  };
  
  return true;
}
