/* JQUERY RESHOW */
/* simple gallery by republik */


// settings
var galSel = "#gallery";
var popisky=false;
var fadeInit = 100;
var moveDuration = 400;

$.fn.reshow = function() {
    // running values
    var title='';
    var itemIndex = 0;
    var imgBuffer;
    var galleryOn = false;
    var moving = false;
    var showing = false;
    var loaded = false;
    // get initial dimensions
    var gal = $(galSel);
    var gWidth = gal.width();
    var gHeight = gal.height();
    var gFullW = gal.outerWidth();
    var gFullH = gal.outerHeight();
    var gPadTop = parseInt(gal.css("padding-top"), 10);
    var gPadLeft = parseInt(gal.css("padding-left"), 10);
    var gPadRight = parseInt(gal.css("padding-right"), 10);
    var gPadBottom = parseInt(gal.css("padding-bottom"), 10);

    var photos = $(this);     
    var currentIndex = 0;
    var count = photos.length;
    photos.click(openReshow);

    function openReshow(event) {
        if(event.preventDefault) event.preventDefault(); else event.returnValue = false;
        if(galleryOn) {return false;} else {galleryOn = true; showing=false; moving=false;}        
        var link = $(this); 
        // get dimension object
        var dim = getDims(gWidth, gHeight);                 
        // set image for preload
        currentIndex = photos.index(link);
        title=link.attr('title');
        gal.css({
            'width' : dim.w + 'px',
            'height' : dim.h + 'px',
            'top' : ($(window).scrollTop() + dim.t) + 'px', 
            'left' :  ($(window).scrollLeft() + dim.l) + 'px' 
        });
        gal.find('.progress').show();
        gal.find(".next").hide().unbind('click');
        gal.find(".prev").hide().unbind('click');
        gal.find(".popisek").hide();
        gal.find(".close").click(galClose);
        gal.find("#img").hide();
        
        loaded=false;
        showing=true;
        gal.fadeIn(fadeInit, function(){showing=false; if(loaded) onImageDone();});
        imgBuffer = $("<img>").attr('src', link.attr('href'));
        if(imgBuffer.attr('complete')) {loaded=true; if(!showing) onImageDone();} else {
            imgBuffer.load(function(){loaded=true; if(!showing) onImageDone();});
        }
    }
    
    // go for moving animation
    function onImageDone() {
        // change dimensions 
        var newDims;
        if(galleryOn && !moving) {
            newDim= getDims(imgBuffer.attr('width'), imgBuffer.attr('height'));
            moving = true;
            gal.animate({
            'width' : newDim.w + 'px',
            'height' : newDim.h + 'px',
            'top' : ($(window).scrollTop() + newDim.t) + 'px', 
            'left' :  ($(window).scrollLeft() + newDim.l) + 'px' 
            }, moveDuration, showingDone);                                 
        }
    }
    
    // go for last fade and prepare arrows
    function showingDone() {
        gal.find(".next").hide();
        gal.find(".prev").hide();
        gal.find('.progress').hide();
        if(title != '' && popisky) {
            gal.find('.popisek').html(title).show();
        }
        gal.find('#img').attr('src', imgBuffer.attr('src'))
            .css({  'width' : gal.width(),
                    'height' : gal.height() })
            .fadeIn(fadeInit, function(){moving=false; updateArrows();});
        imgBuffer.remove();                        
    }
    
    function updateArrows() {
        // is there previous photo?
        if(currentIndex > 0 && currentIndex < count) {
            gal.find('.prev').click(function(event){
                if(event.preventDefault) event.preventDefault(); else event.returnValue = false;
                switchImage(photos.eq(currentIndex-1));
            }).show();
                        
        }
        // is there next photo?
        if(currentIndex < count-1 && currentIndex >= 0) {
            gal.find('.next').click(function(event){
                if(event.preventDefault) event.preventDefault(); else event.returnValue = false;
                switchImage(photos.eq(currentIndex+1));
            }).show();                            
        }
    }
    
    // roughly equivalent to openReshow(), but switching
    function switchImage(newLink) {
        if(!galleryOn) {return false;} 
        
        gal.find('.progress').show();
        gal.find(".next").hide().unbind('click');
        gal.find(".prev").hide().unbind('click');
        currentIndex = photos.index(newLink);
        title = newLink.attr('title');
        loaded=false;
        showing=true;
        gal.find('#img').fadeOut(fadeInit, function(){showing=false; if(loaded) onImageDone();});
        imgBuffer = $("<img>").attr('src', newLink.attr('href'));
        if(imgBuffer.attr('complete')) {loaded=true; if(!showing) onImageDone();} else {
            imgBuffer.load(function(){loaded=true; if(!showing) onImageDone();});
        }         
    }
    
    function galClose() {
        if(galleryOn) {
            gal.find(".next").hide();
            gal.find(".prev").hide();
            gal.find(".popisek").hide();
            gal.find(".progress").hide();
            gal.find("#img").hide();
            gal.fadeOut(fadeInit);
            galleryOn = false;  
            imgBuffer.remove();                 
        }    
    }
    
    function getDims(width, height) {
        var dims = {t:0, l:0, w:width, h:height}
        var scrW = $(window).width();
        var scrH = $(window).height();
        var wDiff = gFullW - gWidth;
        var hDiff = gFullH - gHeight;
        if(dims.w > scrW - wDiff) {
            var aspect = dims.w / dims.h;
            dims.w = scrW - wDiff;
            dims.h = Math.floor(dims.w / aspect);
        }
        if(dims.h > scrH - hDiff) {
            var aspect = dims.w / dims.h;
            dims.h = scrH - hDiff;
            dims.w = Math.floor(dims.h * aspect);   
        }        
        dims.t = Math.floor((scrH - hDiff - dims.h) / 2);
        dims.l = Math.floor((scrW - wDiff - dims.w) / 2);
        return dims;
    }
};



 
