(function($){
    $.fn.jqKviewer = function(options)
    {
        var settings = {
            sClass:         'kviewer',
            openEvent:      'click',
            sImg:           'kimg',
            imgAttr:         'href',
            info:           'kinfo',
            windowRatio:    0.7,
            maxWidth:       0,
            maxHeight:      0
        };

        if ( options ) {
            $.extend( settings, options );
        }

        var images, position, cnt, overlay, img, fimg, windowx;
        var y = Math.ceil($(window).height()/2);
        var x = Math.ceil($(window).width()/2);
        var w = settings.maxWidth = $(window).width()*settings.windowRatio;
        var h = settings.maxHeight = $(window).height()*settings.windowRatio;

        if ( options ) {
            $.extend( settings, options );
        }

        $("body").undelegate("a."+settings.sClass, "click").delegate("a."+settings.sClass, "click",
            function(event)
            {
                setup($(this));
                event.preventDefault();
                return false;
            });

        function setup(item)
        {
            catchImages(item);
            bindActions();
            establishOverlay();
            $("object").hide();
            showImage();

        }

        function establishOverlay()
        {

            var overlay = $("<div/>").attr("id","jqKviewer-overlay");
            $("body").append(overlay);



            var prev = $("<a/>").addClass("jqKviewer-prev");
            var next = $("<a/>").addClass("jqKviewer-next");
            //var adv = $("<div/>").addClass("jqKviewer-adv").text("reklama");
            var img = $("<div/>").addClass("jqKviewer-image-div");
            fimg = $("<div/>").addClass("jqKviewer-full-image");
            var cimg = $("<div/>").addClass("jqKviewer-close");
            //img.append(adv);
            img.append(fimg);
            img.append(prev);
            img.append(next);
            img.append(cimg);



            var info = $("<div/>").addClass("jqKviewer-info-text");
            if (cnt > 0)
                var count = $("<div/>").addClass("jqKviewer-info-count").html("Celkem <br>"+cnt+"</b> fotografií");
            var top = $("<div/>").addClass("jqKviewer-info-place").append(info).append(count);

            var alt = $("<div/>").addClass("jqKviewer-alt").hide();
            windowx = $("<div/>").attr("id","jqKviewer-window").append(top).append(img).append(alt);

            if($.browser.msie)
            {
                var prev2 = $("<a/>").addClass("jqKviewer-prev").text('<');
                var next2 = $("<a/>").addClass("jqKviewer-next").text('>');
                var alt_nav = $("<div/>").addClass("jqKviewer-nav");
                alt_nav.append(next2);
                alt_nav.append(prev2);

                windowx.append(alt_nav);
            }


            windowx.css("top", (y)+"px");
            windowx.css("left", (x)+"px");


            $("body").append(windowx);

            windowx.fadeIn(500);
        }

        function showImage()
        {
            var img_i = new Image();


            img_i.onload = function(){
                // Fit item to viewport
                var height = img_i.height;
                var width = img_i.width;

                if(fimg.find("img").length != 0)
                {
                    fimg.find("img").replaceWith($(this));
                }
                else
                {
                    $(fimg).append($(this));
                    $(".jqKviewer-info-text").append(($("."+settings.info+"[rel2="+$(images).eq(position).attr("rel2")+"]").clone().removeClass('hidden')));
                }

                $(".jqKviewer-info-text .kinfo").remove();
                $(".jqKviewer-info-text").append(($("."+settings.info+"[rel2="+$(images).eq(position).attr("rel2")+"]").clone().removeClass('hidden')));

                if (img_i.width > settings.maxWidth || img_i.height > settings.maxHeight || img_i.height == 0 || img_i.width == 0)
                {
                    if (img_i.width < img_i.height)
                    {
                        img_i.width = w = Math.ceil((settings.maxHeight/img_i.height)*img_i.width);
                        img_i.height = h = settings.maxHeight;

                    }
                    else
                    if(img_i.width > img_i.height)
                    {
                        img_i.height = h = Math.ceil((settings.maxWidth/img_i.width)*img_i.height);
                        img_i.width = w = settings.maxWidth;
                    }
                    else
                    {
                        w = img_i.width = settings.maxWidth;
                        h = img_i.height = settings.maxHeight;
                    }
                }
                else
                {
                    w = img_i.width;
                    h = img_i.height;
                }

                windowx.css("top", (y - Math.ceil(h/2))+"px");
                windowx.css("left", (x - Math.ceil(w/2))+"px");



                $(this).fadeIn(500);
            };

            img_i.src = $(images).eq(position).attr(settings.imgAttr);

            var ialt = $(images).eq(position).find(".info_text").text();
            if (ialt !== 'undefined')
                $(".jqKviewer-alt").show().text(ialt);
            else
                $(".jqKviewer-alt").hide();


            var p = $(img_i).ready(function(){



                });

        }

        function bindActions()
        {
            $("body").delegate(".jqKviewer-close", "click",function(){
                cleanUp();
            });
            $("body").delegate("#jqKviewer-overlay", "click",function(){
                cleanUp();
            });
            $("body").delegate(".jqKviewer-prev", "click",function(){
                shiftImage(-1);
            });

            $("body").delegate(".jqKviewer-next", "click",function(){
                shiftImage(1);
            });

            $('body').keyup(function(e) {
                if (e.which == 37)
                    shiftImage(-1);
                if (e.which == 39)
                    shiftImage(1);
                if (e.which == 27)
                    cleanUp();
            });

        }

        function cleanUp()
        {
            unbindActions();
            $("object").show();
            $("#jqKviewer-window").remove();
            $("#jqKviewer-overlay").remove();
        }

        function catchImages(item)
        {
            images = $("a."+settings.sClass+"[rel="+$(item).attr('rel')+"]");
            cnt = $(images).length;
            position = $(images).index(item);
        }

        function unbindActions()
        {
            $("body").undelegate(".jqKviewer-prev", "click");
            $("body").undelegate(".jqKviewer-next", "click");
            $("body").undelegate("#jqKviewer-overlay", "click");
            $("body").undelegate(".jqKviewer-close", "click");

            $('body').unbind('keyup');
        }

        function shiftImage(value)
        {
            position=position+value;
            if (position < 0)
                position = (cnt-1);
            if (position == cnt)
                position = 0;
            showImage();
        }

    };
})(jQuery);
