jQuery.fn.labelify = function(settings) {
	settings = jQuery.extend({text:"rel",labelledClass:""}, settings);
	var lookups = {rel:function(input) {
		return $(input).attr("rel");
	},label:function(input) {
		return $("label[for=" + input.id + "]").text();
	}};
	var lookup;
	var jQuery_labellified_elements = $(this);
	return $(this).each(function() {
		if (typeof settings.text === "string") {
			lookup = lookups[settings.text];
		} else {
			lookup = settings.text;
		}
		;
		if (typeof lookup !== "function") {
			return;
		}
		var lookupval = lookup(this);
		if (!lookupval) {
			return;
		}
		$(this).data("label", lookup(this).replace(/\n/g, ''));
		$(this).focus(
				function() {
					if (this.value === $(this).data("label")) {
						this.value = this.defaultValue;
						$(this).removeClass(settings.labelledClass);
					}
				}).blur(function() {
			if (this.value === this.defaultValue) {
				this.value = $(this).data("label");
				$(this).addClass(settings.labelledClass);
			}
		});
		var removeValuesOnExit = function() {
			jQuery_labellified_elements.each(function() {
				if (this.value === $(this).data("label")) {
					this.value = this.defaultValue;
					$(this).removeClass(settings.labelledClass);
				}
			})
		};
		$(this).parents("form").submit(removeValuesOnExit);
		$(window).unload(removeValuesOnExit);
		if (this.value !== this.defaultValue) {
			return;
		}
		this.value = $(this).data("label");
		$(this).addClass(settings.labelledClass);
	});
};
