var FormRegistry = {

  init: function(form) {

    var obj = {
      form     : $(form)[0],
      elements : this.collect(form),
      errors   : []
    }

    $(form).submit(
      function() {
        return FormRegistry.check(obj);
      }
    );

  },


  collect: function(form) {

    var elements = [];

    $(".req", form).each(function() {

      var elementType = FormRegistry.determineType($(this)[0]);

      elements[elements.length] = {
        element : $(this)[0],
        type    : elementType,
        label   : $("label[@for='" + $(this).id() + "']"),
        text    : $("label[@for='" + $(this).id() + "']").text()
      }

    });

    return elements;

  },


  determineType: function(element) {

    if ($(element).is(".checks")) {
      return "Checked";
    }
    else if ($(element).is(".email")) {
      return "Email";
    }
    else if ($(element).is(".pass1")) {
      return "Password";
    }
    else {
      return "NotEmpty";
    }

  },


  check: function(obj) {

    for (i in obj.elements) {
      obj.elements[i].label.removeClass("error");
      if (FormValidator.isValid(obj.elements[i]) === false) {
        obj.elements[i].label.addClass("error");
        obj.errors[obj.errors.length] = obj.elements[i].text;
      }
    }

    if (obj.errors.length) {

      alert(ErrorMessages.failedFields + ": \n\n- " + obj.errors.join("\n- "));
      this.reset(obj);
      return false;

    }

  },

  reset: function(obj) {

    obj.errors = [];

  }

}


var FormValidator = {

  isValid: function(obj) {

    return eval("this.validate" + obj.type + "(obj);");

  },


  validateChecked: function(obj) {

    return $(obj.element).find("input[@checked]").size() > 0;

  },


  validateEmail: function(obj) {

    return /^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*\.(([0-9]{1,3})|([a-zA-Z]{2,3})|(aero|coop|info|museum|name))$/.test($(obj.element).val());

  },


  validateNotEmpty: function(obj) {

    return $(obj.element).val() != "";

  },

  validatePassword: function(obj) {

    if ($(obj.element).is(".skip")) {
      return $(obj.element).val() == $("input.pass2:eq(0)").val();
    }
    else {
      return $(obj.element).val() != "" && $(obj.element).val() == $("input.pass2:eq(0)").val();
    }

  }

}
