SendMail = Class.create({
  initialize: function(options) {
    this.options = Object.extend({
      form : 'contactForm',
      action: 'sendMailAction',
      serverAction: '/actions/mailto.php',
      actionImage: '/actions/action.gif', 
      requiredFields: [ 
        { field: 'name', flabel: 'nameLabel', message: 'missingName' }, 
        { field: 'email', flabel: 'emailLabel', format: /^[a-zA-Z0-9._-]+@([a-zA-Z0-9.-]+\.)+[a-zA-Z0-9.-]{2,4}$/, message: 'illegalEmail' }, 
        { field: 'comments', flabel: 'commentsLabel', message: 'missingComment' } 
      ],
      requiredClass: 'requiredField'      
    }, options || {});
    $(this.options.action).observe('click', this.sendMail.bindAsEventListener(this));
    
    this.actionImage = document.createElement("img");
    $(this.actionImage).hide();
    $(this.actionImage).src = this.options.actionImage;
    
    $(this.options.action).parentNode.appendChild(this.actionImage);
  },
  
  sendMail: function(event) {
    Event.stop(event);
    var required = 0;
    for(var rfi =0; rfi < this.options.requiredFields.length; rfi++) {
      $(this.options.requiredFields[rfi].flabel).removeClassName(this.options.requiredClass)
      var failed = false;
      if (this.options.requiredFields[rfi].format) {
        if (!this.options.requiredFields[rfi].format.test($(this.options.requiredFields[rfi].field).value)) {
      	  failed = true;
        } 
      } else {
      	if (!$(this.options.requiredFields[rfi].field).value) {
      	  failed = true;
      	}
      }
      if (failed) {
        $(this.options.requiredFields[rfi].flabel).addClassName(this.options.requiredClass);
        required++;
        if (this.options.requiredFields[rfi].message && required == 1) {
          alert(SendMail.Messages[this.options.requiredFields[rfi].message]);
        }
      }
    }
    if (required == 0) {
      this.contactServer();
    }
  },
  
  contactServer: function(event) {
    $(this.options.action).hide();
    $(this.actionImage).show();
    var thiso = this;
    var mailParameters = $(this.options.form).serialize(true);
    mailParameters.siteReferrer = getreft();
    new Ajax.Request(this.options.serverAction, { 
        parameters: mailParameters,
        onSuccess: function(transport, json) {
          thiso.onServerResponse(transport, json);
        },
        onFailure: function() {
          thiso.onContactServerError();
        }
    });
  },
  
  onContactServerError: function() {
    $(this.actionImage).hide();
    $(this.options.action).show();
    alert(SendMail.Messages['error']);
  },
  
  onServerResponse: function(transport, json) {
    var response = transport.responseText;
    alert(SendMail.Messages[response] ? SendMail.Messages[response] : response);
    $(this.actionImage).hide();
    $(this.options.action).show();
    if (response == 'success') {
      for(var rfi =0; rfi < this.options.requiredFields.length; rfi++) {
        $(this.options.requiredFields[rfi].field).value = '';
      }
    }
  }
  
});