(function ($)
{
    var i = function (e)
    {
        if (!e) {
            var e = window.event;
        }
        e.cancelBubble = true;
        if (e.stopPropagation) {
            e.stopPropagation();
        }
    };
    $.fn.checkbox = function (f)
    {
        try {
            document.execCommand('BackgroundImageCache', false, true)
        }
        catch (e) {}
        var g = {
            cls : 'jquery-checkbox', empty : 'empty.png'
        };
        g = $.extend(g, f || {});
        var h = function (a)
        {
            var b = a.checked;
            var c = a.disabled;
            var d = $(a);
            if (a.stateInterval) {
                clearInterval(a.stateInterval);
            }
            a.stateInterval = setInterval(function ()
            {
                if (a.disabled != c) {
                    d.trigger((c = !!a.disabled) ? 'disable' : 'enable');
                }
                if (a.checked != b) {
                    d.trigger((b = !!a.checked) ? 'check' : 'uncheck');
                }
            }, 10);
            return d;
        };
        return this.each(function ()
        {
            var a = this;
            var b = h(a);
            if (a.wrapper) {
                a.wrapper.remove();
            }
            a.wrapper = $('<span class="' + g.cls + '"><span class="mark"><img src="' + g.empty + '" /></span></span>');
            a.wrapperInner = a.wrapper.children('span:eq(0)');
            a.wrapper.hover(function (e)
            {
                a.wrapperInner.addClass(g.cls + '-hover');
                i(e)
            },
            function (e)
            {
                a.wrapperInner.removeClass(g.cls + '-hover');
                i(e)
            });
            b.css({
                position : 'absolute', zIndex :- 1, visibility : 'hidden'
            }).after(a.wrapper);
            var c = false;
            if (b.attr('id')) {
                c = $('label[for=' + b.attr('id') + ']');
                if (!c.length) {
                    c = false;
                }
            }
            if (!c) {
                c = b.closest ? b.closest('label') : b.parents('label:eq(0)');
                if (!c.length) {
                    c = false;
                }
            }
            if (c)
            {
                c.hover(function (e)
                {
                    a.wrapper.trigger('mouseover', [e])
                },
                function (e)
                {
                    a.wrapper.trigger('mouseout', [e])
                });
                c.click(function (e)
                {
                    b.trigger('click', [e]);
                    i(e);
                    return false;
                })
            }
            a.wrapper.click(function (e)
            {
                b.trigger('click', [e]);
                i(e);
                return false;
            });
            b.click(function (e)
            {
                i(e)
            });
            b.bind('disable', function ()
            {
                a.wrapperInner.addClass(g.cls + '-disabled')
            }).bind('enable', function ()
            {
                a.wrapperInner.removeClass(g.cls + '-disabled')
            });
            b.bind('check', function ()
            {
                a.wrapper.addClass(g.cls + '-checked')
            }).bind('uncheck', function ()
            {
                a.wrapper.removeClass(g.cls + '-checked')
            });
            $('img', a.wrapper).bind('dragstart', function ()
            {
                return false;
            }).bind('mousedown', function ()
            {
                return false;
            });
            if (window.getSelection) {
                a.wrapper.css('MozUserSelect', 'none');
            }
            if (a.checked) {
                a.wrapper.addClass(g.cls + '-checked');
            }
            if (a.disabled) {
                a.wrapperInner.addClass(g.cls + '-disabled');
            }
        })
    }
})(jQuery);
