﻿(function(c) {
    c.expr[':'].linkingToImage = function(a, g, e) {
        return !!(c(a).attr(e[3]) && c(a).attr(e[3]).match(/\.(gif|jpe?g|png|bmp)$/i))
    };
    c.fn.imgPreview = function(j) {
        var b = c.extend({
            imgCSS: {},
            distanceFromCursor: {
                top: 10,
                left: 10
            },
            preloadImages: true,
            onShow: function() { },
            onHide: function() { },
            onLoad: function() { },
            containerID: 'imgPreviewContainer',
            containerLoadingClass: 'loading',
            thumbPrefix: '',
            srcAttr: 'alt'
        }, j),
            d = c('<div/>').attr('id', b.containerID).append('<img/>').hide().css('position', 'absolute').appendTo('body'),
            f = c('img', d).css(b.imgCSS),
            h = this.filter(':linkingToImage(' + b.srcAttr + ')');

        function i(a) {
            return a.replace(/(\/?)([^\/]+)$/, '$1' + b.thumbPrefix + '$2')
        }
        if (b.preloadImages) {
            (function(a) {
                var g = new Image(),
                    e = arguments.callee;
                g.src = i(c(h[a]).attr(b.srcAttr));
                g.onload = function() {
                    h[a + 1] && e(a + 1)
                }
            })(0)
        }
        h.mousemove(function(a) {
            d.css({
                top: a.pageY + b.distanceFromCursor.top + 'px',
                left: a.pageX + b.distanceFromCursor.left + 'px'
            })
        }).hover(function() {
            var a = this;
            d.addClass(b.containerLoadingClass).show();
            f.load(function() {
                d.removeClass(b.containerLoadingClass);
                f.show();
                b.onLoad.call(f[0], a)
            }).attr('src', i(c(a).attr(b.srcAttr)));
            b.onShow.call(d[0], a)
        }, function() {
            d.hide();
            f.unbind('load').attr('src', '').hide();
            b.onHide.call(d[0], this)
        });
        return this
    }
})(jQuery);
