
(function($) {
	// Privata
	
	var pw;
	
	function validator(fn, value) {
		var email_pattern = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
		var swedish_phone_pattern = /^((\+|00)[1-9][0-9] ?)?[0-9]{1,4}(-| )?[0-9]{5,8}$/;
		var pw_pattern = /^[\w\W]{6,}$/;
		var ks_variabel = /^[a-z]\w*$/;
		
		var length = value.length;

		if(fn == "email-strong") {
			return email_pattern.test(value);
		}

		else if(fn == "email") {
			if(length > 0) {
				return email_pattern.test(value);
			}
			return true;
		}
		else if(fn == "text") {
			if(value !== "") {
				return true;
			}
			return false;
		}
		else if(fn == "numeric") {
			value = value.replace(",",".");
			//return (value - 0) == value;
			return !isNaN(value);
		}
		else if(fn == "numeric-strong") {
			return (value - 0) == value && length > 0;
		}

		else if(fn == "password") {
			pw = value;
			return pw_pattern.test(value);
		}
		
		else if(fn == "password2") {
			return (pw == value);
		}

		else if(fn == "phone") {
			return swedish_phone_pattern.test(value);
		}
		else if(fn == "ks_variabel") {
			if(length > 0) {
				return ks_variabel.test(value);
			}
			return true;
		}
		else if(fn == "checkbox") {
			if(value == "true") {
				return true;
			}
			return false;
		}
	}
	var messages = function() {
		var config = new settings();
		return {
			get : function(i) {
				return (settings.messages[form_validator.fields[i].type] === undefined) ? config.messages[form_validator.fields[i].type] : settings.messages[form_validator.fields[i].type];
			}
		};
	};
	var settings = function() {
		return {
			classes : {
				"email" : "email",
				"email-strong" : "email-strong",
				"text" : "text",
				"password" : "password",
				"password2" : "password2",
				"phone" : "phone",
				"ks_variabel" : "ks_variabel",
				"checkbox" : "checkbox",
				"numeric" : "numeric",
				"numeric-strong" : "numeric-strong"
			},
			messages : {
				"email" : "Du måste ange en giltig e-mailadress",
				"email-strong" : "Du måste ange en giltig e-mailadress", 
				"text" : "Du måste fylla i detta fält.",
				"password" : "Du måste ange ett lösenord med minst 6 tecken",
				"password2" : "De angivna lösenorden stämmer inte överens",
				"phone" : "Du måste ange ett giltigt telefonnummer",
				"ks_variabel" : "Du måste ange ett ord i gemener och som inte börjar med en siffra",
				"checkbox" : "Du måste markera rutan.",
				"numeric" : "Du måste ange ett numeriskt värde.",
				"numeric-strong" : "Du måste ange ett numeriskt värde."
			}
		};
	};
	var form = function(form) {
		this.fields = [];
		this.form = form;
		this.field = function(field) {
			this.name = field.attr("name");
			this.field = field;
			this.value = field.val();
			this.valid = true;
			this.type = "text";
			for(mandatory_class in settings.classes) {
				if(this.field.hasClass(mandatory_class)) {
					this.type = mandatory_class;
				}
			}
		};
	};
	form.prototype.validate = function() {
		var length = this.fields.length;
		var status = true;
		var error_count = 0;
		for(var i = 0; i < length; i++) {
			if(!validator(this.fields[i].type, this.fields[i].value)) {
				this.fields[i].valid = false;
				error_count++;
			}
		}
		for(i = 0; i < length; i++) {
			if(!this.fields[i].valid) {
				status =  false;
				var message =  $.fn.validation.messages.get(i);
				//this.fields[i].field.parent().next(".error-message").remove();
				$("label[for='"+this.fields[i].field.attr("id")+"']").contents().remove(".error-message");
				this.fields[i].field.addClass("error");
				//$("<span class=\"error-message\">"+ message + "</span>").insertAfter(this.fields[i].field.parent()).hide().fadeIn(1000);
				$("label[for='"+this.fields[i].field.attr("id")+"']").append("<span class=\"error-message\">"+ message + "</span>");
			}
			else {
				this.fields[i].field.removeClass("error");
				//this.fields[i].field.parent().next(".error-message").remove();
        		$("label[for='"+this.fields[i].field.attr("id")+"']").contents().remove(".error-message");

			}
		}
		
		if(error_count > 0) {
		  this.form.contents().remove(".error-alert");
		  this.form.append("<div class=\"error-alert\">Det finns " + error_count + " fel i formuläret. Fyll i rätt uppgifter och skicka igen.</div>");
		}
		return status;
	};
	
	// Publik
	$.fn.validation = function() {
		if (arguments) {
			settings = $.extend({}, $.fn.validation.config, arguments);
		}
		else {
			settings = $.fn.validation.config;
		}
		form_validator = new form($(this));
		$(this).find(":input[class*='validate']").each(function() {
			form_validator.fields.push(new form_validator.field($(this)));
		});
		return form_validator.validate();
	};
	$.fn.validation.config = new settings();
	$.fn.validation.messages = new messages();
})(jQuery);
 
 
