(function($){


    $.fn.jqKviewer = function(options)
    {
        this.options = {};

        options = this.options = $.extend({}, $.jqKviewer.defaultOptions, options);

        $("body").delegate("a."+options.sClass, "click",
            function(event)
            {
                $("iframe").hide();
                new $.jqKviewer($(this), options);
                event.preventDefault();
            });
    };
    $.jqKview = function(item,options){
        var y = Math.ceil($(window).height()/2);
        var x = Math.ceil($(window).width()/2);

        this.refresh = function(item,options)
        {

            this.loadImg = function(url){
                var img = new Image();
                img.src = url;

                var wait = setInterval(function(){
                    if(img.complete)
                    {
                        clearInterval(wait);
                        var size = countSize(img);

                        removeLoader();


                        $("#jqKviewer-window").animate({
                            "top": (y-(size.height/2))+"px",
                            "left": (x-(size.width/2))+"px"
                        },options.imgAnimation);

                        $(".jqKviewer-full-image").animate({
                            width: size.width+"px",
                            height: size.height+"px"
                        },options.imgAnimation);

                        $(img).hide();

                        if ($(".jqKviewer-full-image").find('img').length > 0)
                        {
                            $(".jqKviewer-full-image img").fadeOut(options.imgAnimation,function(){

                                $(".jqKviewer-full-image img").replaceWith(img);
                                $(img).fadeIn(options.imgAnimation);
                            });
                        }
                        else
                        {
                            $(".jqKviewer-full-image").append(img);
                            $(img).fadeIn(options.imgAnimation);
                        }
                    }
                    else
                    {
                        showLoader();
                    }
                },200);
                return img;
            };

            this.loadImg($(item).attr('href'));
        }

        this.refresh(item,options);
    }

    $.images = function(item,options)
    {
        var images = $("a."+options.sClass+"[rel="+$(item).attr('rel')+"]");

        var position = $(images).index(item);
        var imageArea, windowx,img,size;

        var y = Math.ceil($(window).height()/2);
        var x = Math.ceil($(window).width()/2);


        this.init = function(){
            img = this.loadImg($(item).attr("href"));
            size = this.countSize(img);
            $(img).hide();
        }

        this.getSize = function()
        {
            var s = new Object();
            s.top = y-(Math.ceil(size.height/2));
            s.left = x-(Math.ceil(size.width/2));
            return s;
        }

        this.add = function ()
        {
            imageArea = $("<div/>").addClass("kimage");

            windowx.animate({
                top: (y-(size.height/2))+"px",
                left: (x-(size.width/2))+"px"
            },options.imgAnimation);

            imageArea.animate({
                width: size.width,
                height: size.height
            },options.imgAnimation, function(){

                imageArea.append($(img).fadeIn(options.imgAnimation));
            });

            this.control((images.length-1), position);
            this.setAlt();
            return imageArea;
        }

        this.replace = function ()
        {
            img = this.loadImg($(images).eq(position).attr("href"));
            size = this.countSize(img);

            $(img).hide();
            var img2 = imageArea.find("img").fadeOut(options.imgAnimation);

            windowx.animate({
                top: (y-(size.height/2))+"px",
                left: (x-(size.width/2))+"px"
            },options.imgAnimation);

            imageArea.animate({
                width: size.width,
                height: size.height
            },options.imgAnimation);
            this.setAlt();

            imageArea.append($(img).fadeIn(options.imgAnimation,function(){
                $(img2).remove();
            }));
        }

        this.setAlt = function()
        {
            if (position >=0)
            {
                var alt = $(images).eq(position).find(".kimg").attr('alt');
                if (alt != 'undefined')
                {
                    $(".jqKviewer-alt").show().text(alt);
                }
                else
                    $(".jqKviewer-alt").hide();
            }
            else
            {
                var ialt = $(item).find(".kimg").attr('alt');
                if (ialt !== 'undefined')
                    $(".jqKviewer-alt").show().text(ialt);
                else
                    $(".jqKviewer-alt").hide();
            }
        }

        this.next = function ()
        {
            if (position < (images.length-1))
            {
                position++;
                this.replace();
            }
            this.control((images.length-1), position);

        }

        this.prev = function ()
        {
            if (position > 0)
            {
                position--;
                this.replace();
            }
            this.control((images.length-1), position);
        }

        this.control = function(count,pos)
        {
            if (count< 0)
            {
                $(".jqKviewer-next").hide();
                $(".jqKviewer-prev").hide();
            }

            if (pos == count)
            {
                $(".jqKviewer-next").hide();
            }

            if (pos < count && pos > 0)
            {
                $(".jqKviewer-next").show();
                $(".jqKviewer-prev").show();
            }

            if (pos == 0)
            {
                $(".jqKviewer-prev").hide();
            }
        }

        this.count = function()
        {
            return images.length;
        }

        this.countSize = function(img)
        {
            var size = new Object();
            size.width = $(window).width();
            size.height = $(window).height();

            if (img.width > size.width || img.height > size.height)
            {
                if (img.width>img.height)
                {
                    var ratio = size.width/1024;
                    img.width = size.width = 1024;
                    img.height = size.height = (img.height*ratio);
                }
                else
                {
                    var ratio = size.height/768;
                    img.width = size.width = img.width*ratio;
                    img.height = size.height = 768;
                }
            }
            else
            {
                if (img.width == 0 || img.width > 1024 || img.height == 0 || img.height > 768)
                {
                    img.width = 1024;
                    img.height = 768;
                }
                    

                size.width = img.width;
                size.height = img.height;
            }



            return size;
        }

        this.close = function ()
        {
            imageArea.find("img").fadeOut(options.imgAnimation, function(){
                $(this).remove();
            });
        }

        this.setWindow = function(win)
        {
            windowx = win;
        }

        this.loadImg = function(url){


            var img = new Image();
            showLoader();
            // wrap our new image in jQuery, then:
            $(img)
            // once the image has loaded, execute this code
            .load(function () {
                removeLoader();
            }
            ).error(function () {
                })
            .attr('src', url);





            var img = new Image();
            img.src = url;
            
            showLoader();

            var wait = setInterval(function(){
                if(img.complete)
                {
                    clearInterval(wait);
                    removeLoader();
                }
                else
                {
                    showLoader();
                }
            },200);
            return img;
        };

        this.init();
    }

    function showLoader()
    {
        if ($("#jqKviewer-loader").length == 0)
        {
            var loader = $("<div/>").attr("id","jqKviewer-loader").hide();
            var img = $("<img/>").attr("src","./ajax-loader.gif");
            loader.append(img);
            $("body").append(loader);
            loader.fadeIn(50);
        }
    }

    function removeLoader()
    {
        $("#jqKviewer-loader").remove();
    }

    $.jqKviewer = function(element, options)
    {

        this.init = function(element, options)
        {
            var images = new $.images(element,options);

            var overlay = this.addOverlay(element, options,images);
            var windowx = this.addWindow(element, options,images, overlay);

            overlay.click(
                function(){
                    images.close();
                    $(windowx).remove();
                    $("iframe").show();
                    $(this).remove();
                });
        };

        this.addWindow = function(element, options, images, overlay)
        {

            var prev = $("<div/>").addClass("jqKviewer-prev").click(function(){
                images.prev();
            });
            var next = $("<div/>").addClass("jqKviewer-next").click(function(){
                images.next();
            });
            //var adv = $("<div/>").addClass("jqKviewer-adv").text("reklama");
            var img = $("<div/>").addClass("jqKviewer-image-div");
            var fimg = $("<div/>").addClass("jqKviewer-full-image");
            var cimg = $("<div/>").addClass("jqKviewer-close").click(function(){
                images.close();
                $(windowx).remove();
                $("iframe").show();
                overlay.remove();
            });
            ;

            //img.append(adv);
            img.append(cimg);
            img.append(fimg);
            img.append(prev);
            img.append(next);


            var info = $("<div/>").addClass("jqKviewer-info-text").html($("."+options.info+"[rel2="+$(element).attr('rel2')+"]").clone().removeClass('hidden'));
            if (images.count() > 0)
                var count = $("<div/>").addClass("jqKviewer-info-count").html("Celkem <span>"+images.count()+"</span> fotografií");

            var top = $("<div/>").addClass("jqKviewer-info-place").append(info).append(count);

            var alt = $("<div/>").addClass("jqKviewer-alt").hide();

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

            var s = images.getSize();
            windowx.css("top", s.top+"px");
            windowx.css("left", s.left+"px");


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

            //windowx.fadeIn(options.openAnimation);
            images.setWindow(windowx);
            fimg.append(images.add());
            windowx.fadeIn(options.openAnimation);

            return windowx;
        }

        this.addOverlay = function (element, options, images)
        {
            var overlay = $("<div/>").attr("id","jqKviewer-overlay");
            $("body").append(overlay);

            return overlay;
        }

        this.init(element, options);
    }

    $.jqKviewer.defaultOptions = {
        sClass:         'kviewer',
        openEvent:      'click',
        sImg:           'kimg',
        info:           'kinfo',
        openAnimation:  500,
        imgAnimation:  300,
        leftAct:       '',
        rightAct:       ''
    }

})(jQuery);
