var jform =
{
  Stage: { Start: 1, ErrorReceived: 2, AllErrorsReceived: 3, NoErrors: 4 },

  bindButton: function(button, validation)
  {
    $(button).click(function() { jform.submitForm($(button)[0].form, $(button).attr("name"), validation); return false; });
  },
  
  clearForm: function()
  {
    var $summary = $(".ValidationSummary ul");

    $summary.parent().hide();
    $summary.empty();

    $("form .Failure").removeClass("Failure");
    
    $(".Success").hide();
  },

  disableEnter: function(textbox)
  {
    $(textbox).keypress(function() { return window.event.keyCode != 13; });
  },

  submitForm: function(form, button, validation, callback)
  {
    if (!callback)
      callback = this.updateLayout;

    callback(jform.Stage.Start);

    var validate = eval(validation);

    validate($(form), function(result)
    {
      if (result.Success)
      {
        callback(jform.Stage.NoErrors);

        if (button && button.length > 0)
          $("<input type='hidden' value='*' />").prependTo($(form)).attr("name", button).val($("[name=" + button + "]").val());

        $(form).submit();

        return;
      }

      $.each(result.Messages, function(i, message) { callback(jform.Stage.ErrorReceived, message.Message, message.ControlNames); });

      callback(jform.Stage.AllErrorsReceived);
    });
  },

  updateLayout: function(stage, message, fields)
  {
    var $summary = $(".ValidationSummary ul");

    if (stage == jform.Stage.Start)
    {
      $summary.parent().hide();
      $summary.empty();

      $("form .Failure").removeClass("Failure");

      $(".Success").hide();

      return;
    }

    if (stage == jform.Stage.ErrorReceived)
    {
      $("<li>").appendTo($summary).text(message);

      $.each(fields, function(i, name) { $("[name=" + name + "]").addClass("Failure"); });

      return;
    }

    if (stage == jform.Stage.AllErrorsReceived)
    {
      $summary.parent().fadeIn("medium");

      return;
    }
  }
}