function ContactFormClass(formElementId, requiredFieldsList, emailFieldsList, captchaImageElementId, captchaTextElementId, loaderElementId, messagesElementId, jSessionId, contexPath) 
{   
  var _contactForm = this;
  this.requiredFieldsList = requiredFieldsList;
  this.emailFieldsList = emailFieldsList;
  
  this.emailRegExp = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-]{2,})+\.)+([a-zA-Z0-9]{2,})+$/;

  this.backColorError = "#ff8244";
  this.backColorWrong = "#ffbd33";
  this.backColorValid = "#FFFFFF";
  
  this.formElementId = formElementId; 
  
  this.captchaImageElementId = captchaImageElementId;
  this.captchaTextElementId = captchaTextElementId;
  this.loaderElementId = loaderElementId;
  this.messagesElementId = messagesElementId;
  
  this.jSessionId = jSessionId; 
  this.contexPath = contexPath;
  
  this.addJSessionId  = function() 
  {
	if (document.cookie == '')
	{
	  return ';jsessionid=' + _contactForm.jSessionId;
	}
	else
	{
	  return '';
	}     
  }
  
  this.captchaImageUpdate = function() 
  {
    var captchaImageElement = document.getElementById(_contactForm.captchaImageElementId);
  	captchaImageElement.src = _contactForm.contexPath + '/MakeCaptchaImage.svt' + _contactForm.addJSessionId() + "?" + new Date();
  }

  this.captchaXMLResponseParser = function(xmlResponse)
  {
    var validateNode = xmlResponse.getElementsByTagName('validate');
    return (validateNode[0].firstChild.nodeValue == 1);        
  }
  
  this.setDisplayStyle = function(fieldElement, display)
  {
    if (display)
    {
      fieldElement.style.display = 'inline';
    }
    else
    {
      fieldElement.style.display = 'none';
    }
  }
    
  this.setVisibilityStyle = function(fieldElement, visibility)
  {
    if (visibility)
    {
      fieldElement.style.visibility = 'visible';
    }
    else
    {
      fieldElement.style.visibility = 'hidden';
    }
  }

  this.setFieldStyle = function(fieldElementId, error, requiredError, wrongError)
  {  
    var fieldElement = document.getElementById(fieldElementId);  
    if (error)
    {
      if (requiredError)
        fieldElement.style.backgroundColor = _contactForm.backColorError;
      if (wrongError)
        fieldElement.style.backgroundColor = _contactForm.backColorWrong;
    }
    else
    {
      fieldElement.style.backgroundColor = _contactForm.backColorValid;
    }
    
    fieldElement = document.getElementById(fieldElementId + 'ReqIcon');
    _contactForm.setDisplayStyle(fieldElement, requiredError);
    fieldElement = document.getElementById(fieldElementId + 'WrIcon');
    _contactForm.setDisplayStyle(fieldElement, wrongError);
  }
        
  this.fieldsValidate = function() 
  {
    var fieldElement = null;
    var formError = false;    
    var fieldError = false;
    var formRequiredError = false;
    var formWrongError = false;
        
    for(i=0; i<_contactForm.requiredFieldsList.length; i++)
    {
      fieldError = false;  
      fieldElement = document.getElementById(_contactForm.requiredFieldsList[i]);
          
      if ((fieldElement == 'undefined') || (fieldElement.value == ''))
      {
        fieldError = true;  
        formRequiredError = true;
      }
      _contactForm.setFieldStyle(_contactForm.requiredFieldsList[i], fieldError, fieldError, false);
    }
    
    for(i=0; i<_contactForm.emailFieldsList.length; i++)
    { 
      fieldElement = document.getElementById(_contactForm.emailFieldsList[i]);
      if ((fieldElement != 'undefined') && (fieldElement.value != ''))
      {
        fieldError = false;    
        if (!_contactForm.emailRegExp.test(fieldElement.value))
        {
          fieldError = true;    
          formWrongError = true;
        } 
        _contactForm.setFieldStyle(_contactForm.emailFieldsList[i], fieldError, false, fieldError);
      }  
          
    }
    formError = formRequiredError || formWrongError;
        
    _contactForm.setVisibilityStyle(document.getElementById('requiredFields'), formRequiredError);
    _contactForm.setVisibilityStyle(document.getElementById('wrongFields'), formWrongError);
      
    return (!formError);
  }
  this.setLoader = function(visibility) 
  {
    var loaderElement = document.getElementById(_contactForm.loaderElementId);
    if (loaderElement != 'undefined')
    {    
      _contactForm.setVisibilityStyle(loaderElement, visibility); 	
    }
  }
  
  
  this.reset = function() 
  {
	var formElement = document.getElementById(_contactForm.formElementId);
	formElement.reset();
  }
  
  
  this.setMessage = function(message, focusElementId, select) 
  {
	var messagesElement = document.getElementById(_contactForm.messagesElementId);    
	var focusElement = document.getElementById(focusElementId);
	    
	if (messagesElement != null)
	{	
	  messagesElement.innerHTML = message;
	  if (focusElement != null)
	  {
	   	focusElement.focus();
	  	if (select)
	  	{
	   	  focusElement.select();
	   	}  
	  }
	}
  }
  
  this.send = function()
  {
	_contactForm.setLoader(true);
	_contactForm.setMessage('Verifica dati...', '', false);
	
	var captchaTextElement = document.getElementById(_contactForm.captchaTextElementId);
	if (_contactForm.fieldsValidate())
    {
	  _contactForm.setMessage('Verifica scritta...', '', false);
	  var url = _contactForm.contexPath + "/ValidateCaptcha.svt" + _contactForm.addJSessionId();
	  
	  var handleComplete = function(oResponse)
  	  {
  	    if (oResponse.responseText !== undefined)
	    {  	      	
	      if (_contactForm.captchaXMLResponseParser(oResponse.responseXML))
          {	    	
    	    _contactForm.setMessage('Invio richiesta in corso...', '', false);
    	    var formElement = document.getElementById(_contactForm.formElementId);
    	    formElement.submit();	    	
          }
          else
          { 
        	_contactForm.captchaImageUpdate();
        	_contactForm.setMessage('Scritta errata', _contactForm.captchaTextElementId, true);
        	_contactForm.setLoader(false);
          } 	  	
    	}
  	  }
  	    
  	  var handleFailure = function(oResponse)
	  {
  		_contactForm.setMessage('Errore ajax: ' + oResponse.status, '', false);  
  		_contactForm.captchaImageUpdate();
  		_contactForm.setLoader(false);
	  }
  	  
	  new Ajax.Request(
	    url, 
	    { 
	      method: 'post',
	      parameters: 
	      {
	        captcha: encodeURIComponent(captchaTextElement.value)          
	      },  
	      onFailure: handleFailure,
	      onComplete: handleComplete
	    }
	  );
	  
	}
	else
	{
	  _contactForm.setMessage('Controllare i dati', '', false);
	  _contactForm.setLoader(false);
	}
	
	
  }
}  

