(function($){
	
	$.InFieldLabels = function(label,field, options){
		var base = this;
		base.$label = $(label);
		base.label = label;
		base.$field = $(field);
		base.field = field;
		base.$label.data("InFieldLabels", base);
		base.showing = true;
		base.init = function(){
			base.options = $.extend({},$.InFieldLabels.defaultOptions, options);
			if(base.$field.val() != ""){
				base.$label.hide();
				base.showing = false;
			};
			
			base.$field.focus(function(){
				base.fadeOnFocus();
			}).blur(function(){
				base.checkForEmpty(true);
			}).bind('keydown.infieldlabel',function(e){
				base.hideOnChange(e);
			}).change(function(e){
				base.checkForEmpty();
			}).bind('onPropertyChange', function(){
				base.checkForEmpty();
			});
		};

		base.fadeOnFocus = function(){
			if(base.showing){
				base.setOpacity(base.options.fadeOpacity);
			};
		};
		
		base.setOpacity = function(opacity) {
			
			base.showing = (opacity > 0.0);
			
			if (jQuery.browser.msie && jQuery.browser.version == "6.0") {
				return;
			}
			
			base.$label.stop().animate({ opacity: opacity }, base.options.fadeDuration);
		};

		base.checkForEmpty = function(blur){
			if(base.$field.val() == ""){
				base.prepForShow();
				base.setOpacity( blur ? 1.0 : base.options.fadeOpacity );
			} else {
				base.setOpacity(0.0);
			};
		};
		
		base.prepForShow = function(e){
			if(!base.showing) {

				base.$label.css({opacity: 0.0}).show();
				

				base.$field.bind('keydown.infieldlabel',function(e){
					base.hideOnChange(e);
				});
			};
		};

		base.hideOnChange = function(e){
			if(
				(e.keyCode == 16) || 
				(e.keyCode == 9)
			  ) return; 
			
			if(base.showing){
				base.$label.hide();
				base.showing = false;
			};

			base.$field.unbind('keydown.infieldlabel');
		};

		base.init();
	};
	
	$.InFieldLabels.defaultOptions = {
		fadeOpacity: 0.3, 
		fadeDuration: 150 
	};
	

	$.fn.inFieldLabels = function(options){
		return this.each(function(){
			
			var for_attr = $(this).attr('for');
			if( !for_attr ) return;

			var $field = $(
				"input#" + for_attr + "[type='text']," + 
				"input#" + for_attr + "[type='password']," + 
				"textarea#" + for_attr
				);
				
			if( $field.length == 0) return; 
			
			
			(new $.InFieldLabels(this, $field[0], options));
		});
	};
	
})(jQuery);

