(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 );
						label.css({'top': $(field).position().top});
						label.css({'lineHeight': '18px'});
 
            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);

jQuery.fn.extend({
  trueWidth: function() {
    // return this.width() + this.margin;
		return this.width() + this.getCssInt('margin-left') + this.getCssInt('margin-right') + this.getCssInt('padding-left') + this.getCssInt('padding-right');
  },
	trueHeight: function() {
    // return this.width() + this.margin;
		return this.height() + this.getCssInt('padding-top') + this.getCssInt('padding-bottom');
  },
	getCssInt: function(attr) {
		return parseInt(this.css(attr).replace('px',''));
	}
});
