function CustomerLoginClass(jSessionId, collectionCode, customerCodeElementId, passwordElementId, captchaImageElementId, captchaTextElementId, accessPage, loaderElementId, messagesElementId, pageContext) 
{   
  var _customerLogin = this;
  
  var _CustomerLoginStatus = { NONE : 'NONE', DOS_LIMIT : 'DOS_LIMIT', EMPTY_CUSTOMER_CODE : 'EMPTY_CUSTOMER_CODE', EMPTY_PASSWORD : 'EMPTY_PASSWORD', WRONG_DATA : 'WRONG_DATA', MYSQL_ERROR : 'MYSQL_ERROR', OK : 'OK' };  	
  
  this.jSessionId = jSessionId;
  this.collectionCode = collectionCode;
  this.customerCodeElementId = customerCodeElementId;
  this.passwordElementId = passwordElementId;
  this.captchaImageElementId = captchaImageElementId;
  this.captchaTextElementId = captchaTextElementId;
  this.accessPage = accessPage;
  this.loaderElementId = loaderElementId;
  this.messagesElementId = messagesElementId;
  this.pageContext = pageContext;
   
  this.addJSessionId  = function() 
  {
	if (document.cookie == '')
	{
	  return ';jsessionid=' + _customerLogin.jSessionId;
	}
	else
	{
	  return '';
	}     
  }
  
  this.displayLoader = function(display) 
  {
    var loaderElement = document.getElementById(_customerLogin.loaderElementId);
    if (loaderElement != 'undefined')
    {    
      if (display)
	  {		
    	loaderElement.style.visibility = 'visible';	    
	  }
	  else
	  {	  	  
		loaderElement.style.visibility = 'hidden';
	  }
    }
  }
  
  this.setMessage = function(message, focusElementId, select) 
  {
	var messagesElement = document.getElementById(_customerLogin.messagesElementId);    
	var focusElement = document.getElementById(focusElementId);
	    
	if (messagesElement != null)
	{	
	  messagesElement.innerHTML = message;
	  if (focusElement != null)
	  {
	   	focusElement.focus();
	  	if (select)
	  	{
	   	  focusElement.select();
	   	}  
	  }
	}
  }
  
  this.captchaImageUpdate = function() 
  {
    var captchaImageElement = document.getElementById(_customerLogin.captchaImageElementId);
  	captchaImageElement.src = this.pageContext + '/MakeCaptchaImage.svt' + _customerLogin.addJSessionId() + "?" + new Date();
  }

  this.captchaXMLResponseParser = function(xmlResponse)
  {
    var validateNode = xmlResponse.getElementsByTagName('validate');
    return (validateNode[0].firstChild.nodeValue == 1);        
  }
  
  this.customerLoginStatusXMLResponseParser = function(xmlResponse)
  {
    var statusNode = xmlResponse.getElementsByTagName('status');
    return (statusNode[0].firstChild.nodeValue);        
  }
  
  this.fieldsValidate = function() 
  {
  	var fieldElement = null;
    var fieldError = false;
    var validationError = false;
   
    fieldElement = document.getElementById(_customerLogin.customerCodeElementId);
    fieldError = ((fieldElement == 'undefined') || (fieldElement.value == ''));
    if (fieldError)
    {
      _customerLogin.setMessage('Inserire il numero tessera', _customerLogin.customerCodeElementId, true);
    }  
    validationError = (validationError || fieldError);  
  
    if (!validationError)
    {
      fieldElement = document.getElementById(_customerLogin.passwordElementId);
      fieldError = ((fieldElement == 'undefined') || (fieldElement.value == ''));
      if (fieldError)
      {
    	_customerLogin.setMessage('Inserire la password', _customerLogin.passwordElementId, true);
      }
      validationError = (validationError || fieldError);
    }  
  
    if (!validationError)
    {
      fieldElement = document.getElementById(_customerLogin.captchaTextElementId);
      fieldError = ((fieldElement == 'undefined') || (fieldElement.value == ''));
      validationError = (validationError || fieldError);
      if (fieldError)
      {
    	_customerLogin.setMessage('Inserire la scritta letta', _customerLogin.captchaTextElementId, true);
      }
    }  
      
    return (!validationError);
  }
  
  this.loginValidate = function()
  {
    var customerCodeElement = document.getElementById(_customerLogin.customerCodeElementId);
    var passwordElement = document.getElementById(_customerLogin.passwordElementId);
  	var url = this.pageContext + '/CustomerLogin.svt' + _customerLogin.addJSessionId();
  	
  	var handleComplete = function(oResponse)
  	{
  	  var xmlResponse = oResponse.responseXML 
      if(oResponse !== undefined)	
	  {
		var customerLoginStatus = _customerLogin.customerLoginStatusXMLResponseParser(xmlResponse);
    
        switch(customerLoginStatus)
      	{
      	  case _CustomerLoginStatus.NONE: {
      		_customerLogin.setMessage('Accesso negato. Impossibile verificare i dati', '', false);  
      	  	_customerLogin.captchaImageUpdate();
      	  	break;
      	  }
      	  case _CustomerLoginStatus.DOS_LIMIT: {
      		_customerLogin.setMessage('Accesso negato. Limite richiesta superiore al consentito', '', false);  
      	  	_customerLogin.captchaImageUpdate();
      	  	break;
      	  }	
      	  case _CustomerLoginStatus.EMPTY_CUSTOMER_CODE: {
      		_customerLogin.setMessage('Accesso negato. Impostare il valore del campo: Numero Tessera', _customerLogin.customerCodeElementId, true);  
      	  	_customerLogin.captchaImageUpdate();
      	  	break;
      	  }	
      	  case _CustomerLoginStatus.EMPTY_PASSWORD: {
      	    _customerLogin.setMessage('Accesso negato. Impostare il valore del campo: Password', _customerLogin.passwordElementId, true);
      	  	_customerLogin.captchaImageUpdate();
      	  	break;
      	  }	
      	  case _CustomerLoginStatus.WRONG_DATA: {
      	    _customerLogin.setMessage('Accesso negato. Dati richiesta errati', _customerLogin.passwordElementId, true);
      	  	_customerLogin.captchaImageUpdate();      	  	
      	  	break;
      	  }	
      	  case _CustomerLoginStatus.MYSQL_ERROR: {
      	    _customerLogin.setMessage('Accesso negato. Impossibile accedere al database', '', false);
      	  	_customerLogin.captchaImageUpdate();
      	  	break;
      	  }	
      	  case _CustomerLoginStatus.OK: {
      		_customerLogin.setMessage('Accesso accordato', '', false);
      	  	window.location.href = _customerLogin.accessPage + _customerLogin.addJSessionId();
      	  	break;
      	  }	
      	}
        _customerLogin.displayLoader(false);      	
	  }
	}

    var handleFailure = function(oResponse)
    {
      _customerLogin.setMessage('Errore ajax: ' + oResponse.status, '', false);
      _customerLogin.captchaImageUpdate();
      _customerLogin.displayLoader(false);	
    }
    
    new Ajax.Request(
      url, 
      { 
        method: 'post',
        parameters: 
        {
    	  collectionCode: encodeURIComponent(_customerLogin.collectionCode),
    	  customerCode: encodeURIComponent(customerCodeElement.value),          
          password: encodeURIComponent(passwordElement.value)
        },  
        onFailure: handleFailure,
        onComplete: handleComplete
      }
    );

  }
  
  this.login = function() 
  {
	_customerLogin.displayLoader(true);
	_customerLogin.setMessage('Autenticazione in corso', '', false);
	
	var captchaTextElement = document.getElementById(_customerLogin.captchaTextElementId);
	
	if (_customerLogin.fieldsValidate())
    {
	  _customerLogin.setMessage('Verifica scritta', '', false);
      
      var url = this.pageContext + "/ValidateCaptcha.svt" + _customerLogin.addJSessionId();
      
      var handleComplete = function(oResponse)
  	  {
  	    if(oResponse.responseText !== undefined)
	    {
	      if (_customerLogin.captchaXMLResponseParser(oResponse.responseXML))
          {
	    	_customerLogin.setMessage('Verifica dati', '', false);
            _customerLogin.loginValidate();
          }
          else
          { 
            _customerLogin.captchaImageUpdate();
            _customerLogin.setMessage('Scritta errata', _customerLogin.captchaTextElementId, true);
            _customerLogin.displayLoader(false);
          } 	  	
    	}
  	  }
  	    
  	  var handleFailure = function(oResponse)
	  {
  		_customerLogin.setMessage('Errore ajax: ' + oResponse.status, '', false);  
	    _customerLogin.captchaImageUpdate();
	    _customerLogin.displayLoader(false);
	  }
  	  
	  new Ajax.Request(
	    url, 
	    { 
	      method: 'post',
	      parameters: 
	      {
	        captcha: encodeURIComponent(captchaTextElement.value)          
	      },  
	      onFailure: handleFailure,
	      onComplete: handleComplete
	    }
	  );
    }
	else
    {
	  _customerLogin.displayLoader(false);
    }  	
  }
}
