(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('paste',function(e){base.setOpacity(0.0);}).bind('onPropertyChange',function(){base.checkForEmpty();});
			base.checkForEmpty(true);
		};
		base.fadeOnFocus=function(){
			if(base.showing){
				base.setOpacity(base.options.fadeOpacity);
			};
		};
		base.setOpacity=function(opacity){	
			base.$label.stop().animate({opacity:opacity},base.options.fadeDuration);
			base.showing=(opacity>0.0);
		};		
		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.0,fadeDuration:300};
			
	$.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);



