(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: 'imgPreviewWithStyles',
            containerLoadingClass: 'loading',
            thumbPrefix: '',
            srcAttr: 'rel'
            
        }, 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) {
            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){  	
            	var pos = $.fn.fancybox.getViewport();
            	posTop = pos[3] + Math.round((pos[1] - $container.height()	- 50)	/ 2);
            	
                $container.css({
                    top: posTop,
                    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(){

	var h = document.compatMode == 'CSS1Compat'
		&& !window.opera ? document.documentElement.clientHeight
		: document.body.clientHeight;
	h -= 100;
	var w = document.compatMode == 'CSS1Compat'
		&& !window.opera ? document.documentElement.clientWidth
		: document.body.clientWidth;
	w -= 100;	
	$("img.preview").imgPreview();
	$("a.iframe").fancybox({ 'frameWidth': w, 'frameHeight' : h}); 	
});
