(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 : -195,
				left : 50
			},
			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), $collection = this
				.filter(':linkingToImage(' + s.srcAttr + ')');
		function addPrefix(src) {
			if(src!=undefined){
			return src.replace(/(\/?)([^\/]+)$/, '$1' + s.thumbPrefix + '$2');
			}
		}
		if (s.preloadImages) {
			(function(i) {
				var tempIMG = new Image(), callee = arguments.callee;
				tempIMG.src = addPrefix($($collection[i]).attr(s.srcAttr));
				tempIMG.onload = function() {
					$collection[i + 1] && callee(i + 1);
				};
			})(0);
		}
		$collection.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);
				$img.show();
				s.onLoad.call($img[0], link);
			}).attr('src', addPrefix($(link).attr(s.srcAttr)));
			s.onShow.call($container[0], link);

		}, function() {
			$container.hide();
			$img.unbind('load').attr('src', '').hide();
			s.onHide.call($container[0], this);
		});
		return this;
	};
})(jQuery);

$(document).ready(function() { $('a.imgenlarge').imgPreview( { imgCSS : {width : 225}});});
