( function( $ ) {

	// plugin definition
	$.fn.overlabel = function( options ) {

		// build main options before element iteration
		var opts = $.extend( { }, $.fn.overlabel.defaults, options );

		var selection = this.filter( 'label[for]' ).map( function( ) {

			var label = $( this );
			var id = label.attr( 'for' );
			var field = document.getElementById( id );

			if ( ! field ) return;

			// build element specific options
			var o = $.meta ? $.extend( { }, opts, label.data( ) ) : opts;

			label.addClass( o.label_class );

			var hide_label = function( ) { label.css( o.hide_css ) };
			var show_label = function( ) { this.value || label.css( o.show_css ) };

			$( field )
				.parent( ).addClass( o.wrapper_class ).end( )
				.focus( hide_label ).blur( show_label )
				.each( hide_label ).each( show_label );

			return this;

		} );

		return opts.filter ? selection : selection.end( );
	};

	// publicly accessible defaults
	$.fn.overlabel.defaults = {

		label_class:   'overlabel-apply',
		wrapper_class: 'overlabel-wrapper',
		hide_css:      { 'text-indent': '-10000px' },
		show_css:      { 'text-indent': '0px', 'cursor': 'text' },
		filter:        false

	};

} )( jQuery );