/**
 * 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
 *
 *  EDIT: 2010.11.09 PL - fixed conflict w/ prototype.js
 *
 * 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.
 *  
 */
 (function($){ 
	$.fn.labelify = function(settings) {
	  settings = $.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(){
		  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) {
		  // user already started typing; don't overwrite their work!
		  return;
		}
		// actually set the value
		this.value = $(this).data("label");
		$(this).addClass(settings.labelledClass);

	  });
	};
})(jQuery);

