(function($){  
    $.fn.extend({   
     //plugin name - showMovingPreview  
        showMovingPreview: function(options) {
            var className = 'previewHover';
            var oWidth, oHeight;
   
            var defaults = {  
                topOffset: -30,
                margin:  10
            };  
               
            var opt = $.extend(defaults, options);  
           
            return this.each(function() {
                var o = opt;
                var obj = $(this);
                var windowInfo = '';
                var mouseEvent;
                
                obj.hover(function() {
                    var pos = $(this).position();
                    windowInfo = getWindowInfo();                   
                    
                    $(this).attr({title: ''});
                    var img = $(document.createElement('img'))
                        .addClass(className)
                        .attr({src: $(this).attr('src')})
                        .css({opacity: 0,
                             position: 'absolute',
                             zIndex: 20});      
                    $(this).after(img);  
                        
                    oWidth = img.width();
                    oHeight = img.height();
                    
                    if (windowInfo.height < oHeight + o.margin + o.margin) {
                        //if image is taller that page
                        var scale = windowInfo.height / (oHeight + o.margin + o.margin);
                        oHeight = Math.round(oHeight * scale);
                        oWidth = Math.round(oWidth * scale);               
                    }                   
                    
                    img.css({width: $(this).width() / 2,
                            height: $(this).height() / 2})
                        .animate({
                            opacity: 1.0,
                            width: oWidth,
                            height: oHeight
                        }, 750);
                        
                    } , function() {
                        $('.previewHover').remove();
                })
                .mousemove(function(event) {
                    mouseEvent = event;
                    previewMouseFollow(event,$('.' + className), windowInfo, oWidth, oHeight, $(this).position().top + o.topOffset);
                });  
            });
            
            function getWindowInfo() {
                var currentWindow=$(window);
                var windowObj = new Object();
                    windowObj.width = currentWindow.width();
                    windowObj.height = currentWindow.height();
                    windowObj.scrollTop = currentWindow.scrollTop();
                return windowObj;
            }
            
            function previewMouseFollow(event, wrapper, windowInfo, width, height, topSourceOffset) {
//                var width = wrapper.css('width');
//                var height = wrapper.css('height');
                var winWidth = windowInfo.width;
                var winHeight = windowInfo.height;
                pageX=event.pageX;
                pageY=event.pageY;
                previewOffsetTop=(winHeight-height)/2;
                previewOffsetLeft=(winWidth-width)/2;
                correctedTopOffset=previewOffsetTop+topSourceOffset;
                offset=30;
                centered=false;

                if (height + opt.margin + topSourceOffset > winHeight + windowInfo.scrollTop) {
                    //if image is  but off page bottom
                    pageY = winHeight + windowInfo.scrollTop - height - opt.margin;                   
                } else if(topSourceOffset < windowInfo.scrollTop + opt.margin) {
                    pageY = windowInfo.scrollTop + opt.margin;
                } else {
                    pageY=topSourceOffset;
                }
                
//                if (centered) {
                    if (pageX<winWidth/2) {pageX+=offset;}
                    else {pageX=pageX-width-offset;}
//                }
//                else {
//                    if (pageX<previewOffsetLeft-offset) {pageX=pageX+offset;}
//                    else if (pageX>previewOffsetLeft+width+offset) {pageX=pageX-width-offset;}
//                    else {pageX=previewOffsetLeft;}
//                }
                wrapper.css({left: pageX + 'px',
                            top: pageY + 'px'});
            }
            
            return null;
        },
        
        showVideoPreview: function(options) {
   
            var defaults = {
                offset      : 30,
                mySpeed     : 500,
                width       : 300,
                height      : 300,
                centerVert  : true,
                centerHoriz : true,
                bgAlpha     : 0.5,
                origSuffix  : '',
                origExt     : '',
                newSuffix   : '',
                newExt      : '',
                newMovExt   : '',
                player      : '',
                onStart     : function(){},
                onClose     : function(){}
            };  
               
            var opt = $.extend(defaults, options);
            var player;
            
            function calcTopPos(scrollTop){
                return (($(window).height() - opt.height) / 2) + $(window).scrollTop() - 50;
			}

            
            return this.each(function() {
                var o = opt;
                var obj = $(this);
                var windowInfo = '';

                obj.click(function() {
                    o.onStart();
                    
                    var src = obj.find('IMG').attr('src').replace(o.origSuffix + o.origExt, '');
                    var window_height = $(window).height();
                    
                    var corners = '<tr>' +
                        '<td colspan="3" class="video_preview_up"></td>' +
                        '</tr>' +
                        '<tr>' +
                        '<td class="t_l"></td>' +
                        '<td class="t_c"></td>' +
                        '<td class="t_r"></td>' +
                        '</tr>' +
                        '<tr>' +
                        '<td class="c_l"></td>' +
                        '<td class="c_c"><span><span></span></span><div id="border"><div id="videoDiv"><div id="videoObj"><div id="video"></div></div></div></div></td>' +
                        '<td class="c_r"></td>' +
                        '</tr>' +
                        '<tr>' +
                        '<td class="b_l"></td>' +
                        '<td class="b_c"></td>' +
                        '<td class="b_r"></td>' +
                        '</tr>' +
                        '<tr>' +
                        '<td colspan="3" class="video_preview_down"></td>' +
                        '</tr>';
                    
                    
                    var bg_overlay = $(jQuery('<div class="video_preview_overlay">test</div>').hide().css({
                        'opacity'   : +o.bgAlpha,
                        'height'    : window_height + 'px'
                    }));
                    
                    var main_cont = $(jQuery('<table class="video_preview_content" cellpadding="0" cellspacing="0"></table>'));
                    var piro_close = $(jQuery('<div class="video_preview_close"></div>'));
                    
                    $('body').append(bg_overlay).append(main_cont);
                    main_cont.append(corners);
                    $('.video_preview_up').append(piro_close);
                    
                    bg_overlay.click(function() {
                        close();
                    });
                    
                    piro_close.click(function() {
                        close();
                    });
                    
                    $(window).resize(function(){
                        var new_w_bg = $(window).height();
                        bg_overlay.css({
                            'visibility': 'visible',
                            'height': +new_w_bg + 'px'
                        });
                    });
                    
                    bg_overlay.fadeIn(300, function(){
						var objH = o.height;
                        var objW = o.width;
                        var w_H = $(window).height();
                        var w_W = $(window).width();
                        
                        $('.c_c #videoDiv').animate({
                            height: objH + 'px',
                            width: objW + 'px'
                        }, o.mySpeed);
                        
                        var pl = parseInt($('.c_c #border').css('paddingLeft').replace('px', ''));
                        var pr = parseInt($('.c_c #border').css('paddingRight').replace('px', ''));
                        var pt = parseInt($('.c_c #border').css('paddingTop').replace('px', ''));
                        var pb = parseInt($('.c_c #border').css('paddingBottom').replace('px', ''));
                        
                        main_cont.animate({
                            height: (objH + 20 + pb + pt) + 'px',
                            width: (objW + 20 + pr + pl) + 'px',
                            marginLeft: '-' + ((objW + pr + pl) / 2 + 10) + 'px',
                            marginTop: calcTopPos($(document).scrollTop()) + 'px'
                        }, o.mySpeed, function(){
                            piro_close.css('display', 'block');                       
                            flowplayer("video", o.player, {
                                clip: {
                                    url: src + o.newSuffix + o.newMovExt,
                                    autoPlay: true,
                                    autoBuffering: true
                                }
                            });
                                
                        });

                    });
                    
                    function close(){
                        $f('video').stop().stopBuffering();
                        $('#videoObj').css({ display: 'none' });

                        main_cont.animate({
                            opacity: 0
                        }, o.mySpeed);
                        bg_overlay.animate({
                            opacity: 0
                        }, o.mySpeed, function(){
                            main_cont.remove();
                            bg_overlay.remove();
                        });
                        o.onClose();
                    }
                });
            });
        }
    });  
})(jQuery);
