/*
 * imgPreview jQuery plugin
 * Copyright (c) 2009 James Padolsey
 * j@qd9.co.uk | http://james.padolsey.com
 * Dual licensed under MIT and GPL.
 * Updated: 08/02/09
 * @author James Padolsey
 * @version 0.2
 */
(function($){
    
    $.expr[':'].linkingToImage = function(elem, index, match){
        return !! ($(elem).attr(match[3]) && $(elem).attr(match[3]).match(/\.(gif|jpe?g|png|bmp)$/i));
    };
    
    $.fn.imgPreview = function(userDefinedSettings){
        
        var s = $.extend({
            imgCSS: {},
            distanceFromCursor: {top:10, left:10},
            preloadImages: true,
            onShow: function(){},
            onHide: function(){},
            onLoad: function(){},
            containerID: 'imgPreviewContainer',
            containerLoadingClass: 'loading',
            thumbPrefix: '',
            srcAttr: 'href'
        }, userDefinedSettings),
        
        $container = $('<div/>').attr('id', s.containerID)
                        .append('<img/>').hide()
                        .css('position','absolute')
                        .appendTo('body'),
            
        $img = $('img', $container).css(s.imgCSS);
        
        if (s.preloadImages) {
            this.each(function(){
                if ( $(this).is(':linkingToImage(' + s.srcAttr + ')') ) {
                    (new Image()).src = $(this).attr(s.srcAttr).replace(/(\/?)([^\/]+)$/,'$1' + s.thumbPrefix + '$2');
                }
            });
        }
        
        this.filter(':linkingToImage(' + s.srcAttr + ')')
            .mousemove(function(e){
                $container.css({
                    top: e.pageY + s.distanceFromCursor.top + 'px',
                    left: e.pageX + s.distanceFromCursor.left + 'px'
                });
            })
            .hover(function(){
                var link = this;
                $container.addClass(s.containerLoadingClass).show();
                $img.load(function(){
                    $container.removeClass(s.containerLoadingClass);
                    s.onLoad.call($img[0], link);
                }).attr('src', $(link).attr(s.srcAttr).replace(/\/([^\/]+)$/,'/' + s.thumbPrefix + '$1'));
                s.onShow.call($container[0], link);
            }, function(){
                $container.hide();
                $img.unbind('load').attr('src','');
                s.onHide.call($container[0], this);
            })
			.mousedown(function(){
				$container.hide();
                $img.unbind('load').attr('src','');
			});
            
        return this;
        
    }
    
})(jQuery);
