﻿(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);

            // AS: Parent div check in IE6-7 (IE6-7 wants inline-block to work correctly)
            if ($.browser.msie && $.browser.version > 5 && $.browser.version < 8) {
                var tagname = $(field).parent()[0].tagName.toLowerCase();
                if (tagname == 'div') {
                    $(field).parent().css("display", "inline-block");
                }
            }

            // AS: position label relative to wrapper 
            var field_position = $(field).position();
            label.css({
                'visibility': 'visible',
                'left': (field_position.left + 5) + 'px',
                'top': (field_position.top + 2) + 'px',
                'margin-left': $(field).css("margin-left"),
                'margin-top': $(field).css("margin-top"),
                'float': 'none' ,
                'width' : 'auto'
            });

            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);
