var Validator = {
  reset_element: function(_element) {
    _element.removeClassName('invalid');
    return _element;
  },
  is_invalid: function(_element) {
    var invalid = false;

    if(_element.hasClassName('required') && !_element.present()) {
      invalid = true;
      _element.addClassName('invalid');
    }

    var minimum = _element.readAttribute('minimum');
    var maximum = _element.readAttribute('maximum');

    if(minimum && Number(_element.value) < minimum) {
      invalid = true;
      _element.addClassName('invalid');
    }
    else if(maximum && Number(_element.value) > maximum) {
      invalid = true;
      _element.addClassName('invalid');
    }

    var message = _element.readAttribute('message');
    message = message ? message : 'This is a required field';

		var confirms = _element.readAttribute('confirms');
		if(confirms) {
			if($(confirms).value != _element.value) {
				invalid = true;

				$(confirms).addClassName('invalid');
				_element.addClassName('invalid');
			}
		}

		var matches = _element.readAttribute('matches');
		if(matches) {
			var exp = new RegExp(matches);

			if(!exp.test(_element.value)) {
				invalid = true;
				_element.addClassName('invalid');
			}
		}

    var message_div = $(_element.id + '_message');

    if(invalid) {
      if(!message_div) {
        var new_message_div = document.createElement('div');

        with(new_message_div) {
          id = _element.id + '_message';
          className = 'error';
          appendChild(document.createTextNode(message));
        }        

        Element.insert(_element, {after:new_message_div});
      }
      else {
        message_div.innerHTML = message;
      }
    }
    else {
      if(message_div) {
        message_div.parentNode.removeChild(message_div);
      }
    }

    return invalid;
  },
	do_validation: function(_event) {
		var form = _event.findElement('form');
		var elements = form.getElements();

		elements.each(Validator.reset_element);

		var results = elements.map(Validator.is_invalid);

		if(results.any()) {
			_event.stop();
			return false;
		}
		else {
			return true;
		}	
	}
};

Event.observe(window, 'load', function() {
  var forms = $A(document.getElementsByTagName('form'));

  forms.each(function(_form) { 
    Event.observe(_form, 'submit', Validator.do_validation);
  });
});
