/**
* jQuery.labelify - Display in-textbox hints
* Stuart Langridge, http://www.kryogenix.org/
* Released into the public domain
* Date: 25th June 2008
* @author Stuart Langridge
* @version 1.3
*
*
* Basic calling syntax: $("input").labelify();
* Defaults to taking the in-field label from the field's title attribute
*
* You can also pass an options object with the following keys:
*   text
*     "title" to get the in-field label from the field's title attribute 
*      (this is the default)
*     "label" to get the in-field label from the inner text of the field's label
*      (note that the label must be attached to the field with for="fieldid")
*     a function which takes one parameter, the input field, and returns
*      whatever text it likes
*
*   labelledClass
*     a class that will be applied to the input field when it contains the
*      label and removed when it contains user input. Defaults to blank.
*  
*/
jQuery.fn.labelify = function(settings) {
	settings = jQuery.extend({
		text: "title",
		labelledClass: ""
	}, settings);

	var lookups = {
		title: function(input) {
			return $(input).attr("title");
		},
		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]; // what if not there?
		} else {
			lookup = settings.text; // what if not a fn?
		}
		
		// bail if lookup isn't a function or if it returns undefined
		if (typeof lookup !== "function") { return; }
		var lookupval = lookup(this);
		if (!lookupval) { return; }

		// need to strip newlines because the browser strips them
		// if you set textbox.value to a string containing them
		$(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(){
			//	console.log('this.defaultValue = (' + this.defaultValue + ') this.value = (' + this.value + ') $(this).data("label") = (' + $(this).data('label') + ')');

			// I'm not sure what this next conditional was working around but it was ruining everything so Joel restored the "old" way.
			//if ($.trim(this.defaultValue).length == 0 || this.value !== this.defaultValue) {
			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);

		//	console.log('this.defaultValue = (' + this.defaultValue + ') this.value = (' + this.value + ') $(this).data("label") = (' + $(this).data('label') + ')');
		if ($.trim(this.defaultValue).length > 0 || this.value !== this.defaultValue) {
			// user already started typing; don't overwrite their work!
			return;
		}

		// actually set the value
		this.value = $(this).data("label");
		$(this).addClass(settings.labelledClass);
	});
};

