(function($) {
	$.extend($.fn, {
		validate: function(options) {

			// if nothing is selected, return nothing; can't chain anyway
			if (!this.length) {
				options && options.debug && window.console && console.warn( "nothing selected, can't validate, returning nothing" );
				return;
			}
		
			this.submit(function(event) {
                var form = $(event.target);

				form.find('label.error').filter('[generated=true]').empty()
				
                $('label').removeClass("invalid");

                var req_fields = form.find('.required');
                var first = true;

                req_fields.each(function(i, input){
                    var el = $(input);
                    var v = el.val();
                    var min = el.attr('minChars');
                    var max = el.attr('maxChars');
                    var error = null;

                    if(v == "" || !v){
                        error = 'This field is required';
                    }
                    else if(min && v.length < min){
                        error = 'This field requires at least ' + min + ' characters';
                    }
                    else if(max && v.length > max){
                        error = 'This field cannot have more than ' + max + ' characters';
                    }

                    if(error){

                        el.after('<label class="error" generated="true">' + error + '</label>')

                        if(first){

                            first = false;

                            var label = $('label[for=' + input.id + ']')[0];
                            $(label).addClass("invalid");
                            $(document).scrollTo(label);

                            // IE throws an error if you focus non-visible fields
                            if(el.css("display") != "none"){
                                input.focus();
                            }
                            else {
                                req_fields.each(function(i, field){ field.blur() });
                            }
                        }
                    }
                });

                return first
			})
		}
	})
})(jQuery);
