(function($) {
	// Privata
	function validator(fn, value) {
		var email_pattern = /^([a-zA-Z0-9])+([\.a-zA-Z0-9_-])*@([a-zA-Z0-9])+(\.[a-zA-Z0-9_-]+)+$/;
		switch(fn) {
			case "email":
				return email_pattern.test(value);
				break;
			case "text":
				if(value !== "") {
					return true;
				}
				else {
					return false;
				}
				break;
			case "checkbox":
				if(value == "true") {
					return true;
				}
				else {
					return false;
				}
				break;
			default:
				break;
		}
	}
	
	var messages = function() {
		var messages = [],
		fields = [],
		config = new settings(),
		getMessage = function(i) {
				var replace = /\[\$name\]|\[\$type\]|\[\$value\]/gi;
				return config.messages[form_validator.fields[i].type].replace(replace, function(v) {
					switch(v) {
						case "[$name]":
							return form_validator.fields[i].name;
							break;
						case "[$type]":
							return form_validator.fields[i].type;
							break;
						case "[$value]":
							return form_validator.fields[i].value;
							break;
						default:
							break;
					}
				});
		};
		
		var viewMessages = function() {
			$("#validation_messages").remove();
			
			var html = "<div id=\"validation_messages\">\n<ul id=\"messages\">\n";
			
			for(i = 0; i < messages.length; i++) {
				html += "<li>" + messages[i] + "</li>";
			}
			html += "</ul>\n</div>\n";

			$(html).appendTo(form_validator.form);
			$("#validation_messages").hide();
			
			for(i = 0; i < messages.length; i++) {
				form_validator.fields[fields[i]].field.attr("title", "You have to fill in this field.").addClass("error");
			}
			
			fields.length = 0;
			messages.length = 0;
		};
		return {
			add : function(i) {
				fields.push(i);
				messages.push(getMessage(i));
			},
			get : function() {
				viewMessages();
			}
		};
	};
	
	var settings = function() {
		return {
			messages : {
				"email" : "Du måste fylla i en korrekt mailadress.",
				"text" : "Du måste fylla i fältet för [$name].",
				"checkbox" : "Du måste kryssa i kryssboxen."
			}
		};
	};
	
	var form = function(form, arguments) {
		this.fields = [];
		this.form = form;
		this.field = function(form, field) {
			this.name = field.name;
			this.value = form.find("input[name=" + this.name + "]").val();
			this.field = form.find("input[name=" + this.name + "]");
			this.type = (field.type == undefined) ? form.find("input[name=" + this.name + "]").attr("type") : field.type;
			this.valid = false;
			this.field.removeClass("error");
		};
		for(var i = 0; i < arguments.length; i++) {
			this.fields.push(new this.field(form, arguments[i]));
		}
	};
	
	form.prototype.validate = function() {
		var length = this.fields.length;
		for(i = 0; i < length; i++) {
			if(!validator(this.fields[i].type, this.fields[i].value)) {
				this.fields[i].valid = false;
				$.fn.validation.messages["add"](i);
			}
			else {
				this.fields[i].valid = true;
			}
		}
		for(i = 0; i < length; i++) {
			if(!this.fields[i].valid) {
				return false;
			}
		}
		return true;
	};
	
	$.fn.validation = function() {
		form_validator = new form($(this), arguments);
		return form_validator.validate();
     	
	};
	
	$.fn.validation.config = new settings();
	$.fn.validation.messages = new messages();
})(jQuery);
 
 
