jQuery.fn.decorateForm = function() {
  var validateForm = function(form) {
    var validationPassed = true;

    var callValidationMethod = function(name, check) {
      $(form).find(name).each(function() {
        value = $(this).find("input, textarea, select").val();
        if(check(value, this)) {
          $(this).removeClass("error");
        } else {
          $(this).addClass("error");
          validationPassed = false;
        }
      });
    };

    callValidationMethod(".required:visible", function(val) { return val; });
    callValidationMethod(".date:visible", function(val) {
      val = val.split("-"); 
      var year = parseInt(val[0], 10);
      var month = parseInt(val[1], 10) - 1;
      var day = parseInt(val[2], 10);
      var date = new Date(year, month, day);
      return ((day == date.getDate()) && (month == date.getMonth()) && (year == date.getFullYear()));
    });
    callValidationMethod(".email-list:visible", function(val, field) {
      var userLimitEnforced = $(field).attr("data-user-limit-enforced") == "true";
      if (userLimitEnforced) {
        var matchedEmails = val.match(/([^\s,]+@[^\s,]+\.\w+)/g);
        var numEmails = matchedEmails ? matchedEmails.length : 0;
        var maxEmails = parseInt($(field).attr("data-max-emails"));
        return numEmails > 0 && numEmails <= maxEmails;
      } else {
        return true;
      }
    });
    
    return validationPassed;
  };
  
  return this.each(function(){
    var form = this;
    var disabled = false;
    var submitButton = $(form).find('input.btn, input.btn-onwhite, input.btn-gray, input.blue-btn-onwhite');
    var hasSpinner = submitButton.hasClass('with-spinner');
    var submitLink = $('<a href="#" class="btn-onwhite btn"><span>' + submitButton.val() + '</span></a>');
    submitLink.attr("class", submitButton.attr("class"));
    submitButton.after(submitLink);
    submitButton.hide();
    var spinner = $('<img class="spinner" src="/images/spinner-circle.gif"/>').hide();
    submitLink.after(spinner);
    
    submitLink.click(function() {
      if(disabled) {
        return false;
      } else if(validateForm(form)) {
        // this makes sure that the submit event is sent, even though 
        // we're submitting via javascript
        $(form).trigger("submit");
        if(hasSpinner) {
          spinner.show();
        }
        submitLink.addClass("disabled");
        disabled = true;
      } else {
        spinner.hide();
        submitLink.removeClass("disabled");
        disabled = false;
      }
      
      return false;
    });
  });
}

$(function() {
  $("form").decorateForm();
});