(function() {
	function stripHtml(value) {
		return value.replace(/<.[^<>]*?>/g, ' ').replace(/&nbsp;|&#160;/gi, ' ')
		.replace(/[0-9.(),;:!?%#$'"_+=\/-]*/g,'');
	}
	jQuery.validator.addMethod("maxWords", function(value, element, params) { 
	    return this.optional(element) || stripHtml(value).match(/\b\w+\b/g).length < params; 
	}, jQuery.validator.format("Vul alstublieft maximaal {0} woorden in.")); 
	 
	jQuery.validator.addMethod("minWords", function(value, element, params) { 
	    return this.optional(element) || stripHtml(value).match(/\b\w+\b/g).length >= params; 
	}, jQuery.validator.format("Vul alstublieft minimaal {0} woorden in.")); 
	 
	jQuery.validator.addMethod("rangeWords", function(value, element, params) { 
	    return this.optional(element) || stripHtml(value).match(/\b\w+\b/g).length >= params[0] && value.match(/bw+b/g).length < params[1]; 
	}, jQuery.validator.format("Vul alstublieft alleen tussen de {0} en {1} woorden in."));
})();

jQuery.validator.addMethod("lettersonly", function(value, element) {
		return this.optional(element) || /^[a-z]+$/i.test(value);
	}, "Alleen letters alstublieft"); 

jQuery.validator.addMethod("nowhitespace", function(value, element) {
		return this.optional(element) || /^\S+$/i.test(value);
	}, "Geen spaties alstublieft"); 

jQuery.validator.addMethod("postcode", function(value, element) {
		return this.optional(element) || /^\d{4}[\s-]?[a-zA-Z]{2}$/.test(value);
	}, "De opgegeven postcode is niet juist");

jQuery.validator.addMethod("integer", function(value, element) {
		return this.optional(element) || /^-?\d+$/.test(value);
	}, "Alleen een positief of negatief getal zonder komma alstublieft");

jQuery.validator.addMethod("datum", function(value, element) {
		return this.optional(element) || /^\d\d?[\.\/-]\d\d?[\.\/-]\d\d\d?\d?$/.test(value);
	}, "Vul hier een geldige datum in.");

jQuery.validator.addMethod("tijd", function(value, element) {
		return this.optional(element) || /^([01][0-9])|(2[0123]):([0-5])([0-9])$/.test(value);
	}, "Vul een geldige tijd in alstublieft: Tussen 00:00 en 23:59");

jQuery.validator.addMethod('telefoonnummer', function(phone_number, element) {
	return this.optional(element) || phone_number.length > 9 &&
	(phone_number.match(/^[0-9]{2}-?[0-9]{8}$/) || phone_number.match(/^[0-9]{3}-?[0-9]{7}$/) || phone_number.match(/^[0-9]{4}-?[0-9]{6}$/));
	}, 'Vul een geldig telefoonnummer in alstublieft');

jQuery.validator.addMethod("require_one", function(value, element) {
	return $('.require_one:checked').size() != 0;
	}, jQuery.format("Vul ten minste 1 veld in alstublieft."));

jQuery.validator.addMethod("removespaces", function(value, element) {
	value.replace(/^\s\s*/, '').replace(/\s\s*$/, ''); 
	element.value = value.split(' ').join(''); 
    return true;
	}, jQuery.format(""));

jQuery.validator.addMethod("trim", function(value, element) {
	element.value = value.replace(/^\s\s*/, '').replace(/\s\s*$/, ''); 
    return true;
	}, jQuery.format(""));

jQuery.fn.limitMaxlength = function(options){
	var settings = jQuery.extend({
		attribute: "maxlength",
		onLimit: function(){},
		onEdit: function(){}
	}, options);

	var onEdit = function(){
		var textarea = jQuery(this);
		var maxlength = parseInt(textarea.attr(settings.attribute));

		if(textarea.val().length > maxlength){
			textarea.val(textarea.val().substr(0, maxlength));
			jQuery.proxy(settings.onLimit, this)();
		}

		jQuery.proxy(settings.onEdit, this)(maxlength - textarea.val().length);
	};
	this.each(onEdit);
	return this.keyup(onEdit)
				.keydown(onEdit)
				.focus(onEdit)
				.live('input paste', onEdit);
}
