/** 
 * @name labelhint
 * @author Tyler Larson
 * @version 1.0
 * 
 */
(function($){	
	var version='1.0';
	var DATAKEY = "LABELHINT_";
		
	$.fn.labelhint = function(options,text) {
		var opts = {};
		if (typeof options == "object") opts = options;
		else if (typeof options == "string") text = options;				
		opts = $.extend($.fn.labelhint.defaults,opts);
		return this.each(function() {
			set_labelhint($(this),opts,text);			
		});
	};
	
	
	// Attach a label hint to the given element
	function set_labelhint($input,opt,text) {		
		if ($input.data(DATAKEY+"label")) return; // already watermarked
		
		// assign ID if one isn't already set
		var newid = opt.id_prefix+Math.random().toString(32).replace('.','');		
		if (!$input.attr('id')) $input.attr('id',newid);
		
		var inputid = $input.attr('id');
		if (!text) {
			if ($input.attr('title')) {
				text = $input.attr('title'); 
				$input.removeAttr('title');
			} else if ($input.attr('name')) {
				text = $input.attr('name');
			}
		}

		var $label = $('<label style="position:absolute;display:none"></label>');
		var labelid = inputid+opt.id_suffix;
		$label
			.attr('id',labelid)                    // set id
			.attr('for',inputid)                   // associate with input
			.data(DATAKEY+"inputid",inputid)       // save input ID
			.addClass(opt.class_label)             // attach label class
			.text(text);                           // set content
		$input
			.data(DATAKEY+"labelid",labelid)       // save label id
			.addClass(opt.class_input)             // attach input class
			.bind('click',do_focus)
			.bind('focusin',do_focus)
			.bind('focusout',do_blur)
			.data(DATAKEY+'focus',opt.class_focus)
			.data(DATAKEY+'blur',opt.class_blur)
			.before($label);						// place label after input

		var that = $input.get(0);
		do_focus.call(that);
		do_blur.call(that);			
	}
	
	function do_focus() {
		var $input = $(this);
		var $label = $("#"+$input.data(DATAKEY+"labelid"));
		$label.css('display','none');
		$input
			.removeClass($input.data(DATAKEY+"blur"))
			.addClass($input.data(DATAKEY+"focus"));
	}
	
	function do_blur() {
		var input = this;
		// use timout to let validators, etc. bound to the control to work first
		setTimeout(function() {
			var $input = $(input);
			if (!$input.val()) {
				var $label = $("#"+$input.data(DATAKEY+"labelid"));
				$label
					.css('width',$input.width())
					.css('height',$input.height())
					//.css('margin-right',0-$label.width() + "px")
					//.css('margin-bottom', 0-$label.innerHeight()+'px')				
					.css('top', $input.position().top + 'px')
					.css('left',$input.position().left + 'px')				
					.css('display', 'block');
				$input
					.addClass($input.data(DATAKEY+"blur"))
					.removeClass($input.data(DATAKEY+"focus"));				
			} else {
				do_focus.call(this);
			}
		}, 100);
	}
	
	// Default options
	$.fn.labelhint.defaults = {
		class_label: "labelhint",
		class_input: "labelhinted",
		class_focus: "labelhint_focus",
		class_blur: "labelhint_blur",		
		id_prefix: "label_",
		id_suffix: "__labelhint"
	};
		
	
})(jQuery);
