/*!	ColorBox v1.3.1 - a full featured, light-weight, customizable lightbox based on jQuery 1.3 */
//	(c) 2009 Jack Moore - www.colorpowered.com - jack@colorpowered.com
//	Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php

(function ($) {
    //Shortcuts (to increase compression)
    var colorbox = 'colorbox',
    hover = 'hover',
    TRUE = true,
    FALSE = false,
    cboxPublic,
    isIE = !$.support.opacity,
    isIE6 = isIE && !window.XMLHttpRequest,

    //Event Strings (to increase compression)
    cbox_click = 'click.colorbox',
    cbox_open = 'cbox_open',
    cbox_load = 'cbox_load',
    cbox_complete = 'cbox_complete',
    cbox_cleanup = 'cbox_cleanup',
    cbox_closed = 'cbox_closed',
    cbox_resize = 'resize.cbox_resize',
    cbox_ie6 = 'resize.cboxie6 scroll.cboxie6',

    //Cached jQuery Object Variables
    $overlay,
    $cbox,
    $wrap,
    $content,
    $topBorder,
    $leftBorder,
    $rightBorder,
    $bottomBorder,
    $related,
    $window,
    $loaded,
    $loadingOverlay,
    $loadingGraphic,
    $title,
    $current,
    $slideshow,
    $next,
    $prev,
    $close,

    //Variables for cached values or use across multiple functions
    interfaceHeight,
    interfaceWidth,
    loadedHeight,
    loadedWidth,
    maxWidth,
    maxHeight,
    element,
    index,
    settings,
    open,
    callback,

    // ColorBox Default Settings.
    // See http://colorpowered.com/colorbox for details.
    defaults = {
        transition: "elastic",
        speed: 350,
        width: FALSE,
        height: FALSE,
        initialWidth: "400",
        initialHeight: "400",
        maxWidth: FALSE,
        maxHeight: FALSE,
        scalePhotos: TRUE,
        scrollbars: TRUE,
        inline: FALSE,
        html: FALSE,
        iframe: FALSE,
        photo: FALSE,
        href: FALSE,
        title: FALSE,
        rel: FALSE,
        opacity: 0.9,
        preloading: TRUE,
        current: "zdjęcie {current} z {total}",
        previous: "poprzednie",
        next: "następne",
        close: "zamknij",
        open: FALSE,
        overlayClose: TRUE,
        slideshow: FALSE,
        slideshowAuto: TRUE,
        slideshowSpeed: 2500,
        slideshowStart: "start pokaz slajdów",
        slideshowStop: "stop pokaz slajdów"
    };

    // ****************
    // HELPER FUNCTIONS
    // ****************

    // Set Navigation Key Bindings
    function cbox_key(e) {
        if (e.keyCode === 37) {
            e.preventDefault();
            $prev.click();
        } else if (e.keyCode === 39) {
            e.preventDefault();
            $next.click();
        }
    }

    // Convert % values to pixels
    function setSize (size, dimension) {
        dimension = dimension === 'x' ? document.documentElement.clientWidth : document.documentElement.clientHeight;
        return (typeof size === 'string') ? (size.match(/%/) ? (dimension / 100) * parseInt(size, 10) : parseInt(size, 10)) : size;
    }

    // Checks an href to see if it is a photo.
    // There is a force photo option (photo: true) for hrefs that cannot be matched by this regex.
    function isImage (url) {
        return settings.photo || url.match(/\.(gif|png|jpg|jpeg|bmp)(?:\?([^#]*))?(?:#(\.*))?$/i);
    }

    // Assigns functions results to their respective settings.  This allows functions to be used to set ColorBox options.
    function process () {
        for (var i in settings) {
            if (typeof(settings[i]) === 'function') {
                settings[i] = settings[i].call(element);
            }
        }
    }

    // ****************
    // PUBLIC FUNCTIONS
    // Usage format: $.fn.colorbox.close();
    // Usage from within an iframe: parent.$.fn.colorbox.close();
    // ****************

    cboxPublic = $.fn.colorbox = function (options, custom_callback) {

        if (this.length) {
            this.each(function () {
                var data = $(this).data(colorbox) ? $.extend({},
                    $(this).data(colorbox), options) : $.extend({}, defaults, options);
                $(this).data(colorbox, data).addClass("cboxelement");
            });
        } else {
            $(this).data(colorbox, $.extend({}, defaults, options));
        }

        $(this).unbind(cbox_click).bind(cbox_click, function (event) {

            element = this;

            settings = $(element).data(colorbox);

            process();//process settings functions

            $().bind("keydown.cbox_close", function (e) {
                if (e.keyCode === 27) {
                    e.preventDefault();
                    cboxPublic.close();
                }
            });
            if (settings.overlayClose) {
                $overlay.css({"cursor": "pointer"}).one('click', cboxPublic.close);
            }

            //remove the focus from the anchor to prevent accidentally calling
            //colorbox multiple times (by pressing the 'Enter' key
            //after colorbox has opened, but before the user has clicked on anything else)
            element.blur();

            callback = custom_callback || FALSE;

            var rel = settings.rel || element.rel;

            if (rel && rel !== 'nofollow') {
                $related = $('.cboxelement').filter(function () {
                    var relRelated = $(this).data(colorbox).rel || this.rel;
                    return (relRelated === rel);
                });
                index = $related.index(element);

                if (index < 0) { //this checks direct calls to colorbox
                    $related = $related.add(element);
                    index = $related.length - 1;
                }

            } else {
                $related = $(element);
                index = 0;
            }
            if (!open) {
                open = TRUE;
                $.event.trigger(cbox_open);
                $close.html(settings.close);
                $overlay.css({"opacity": settings.opacity}).show();
                cboxPublic.position(setSize(settings.initialWidth, 'x'), setSize(settings.initialHeight, 'y'), 0);
                if (isIE6) {
                    $window.bind(cbox_ie6, function () {
                        $overlay.css({width: $window.width(), height: $window.height(), top: $window.scrollTop(), left: $window.scrollLeft()});
                    }).trigger(cbox_ie6);
                }
            }
            cboxPublic.slideshow();
            cboxPublic.load();

            event.preventDefault();
        });

        if (options && options.open) {
            $(this).triggerHandler(cbox_click);
        }

        return this;
    };

    // Initialize ColorBox: store common calculations, preload the interface graphics, append the html.
    // This preps colorbox for a speedy open when clicked, and lightens the burdon on the browser by only
    // having to run once, instead of each time colorbox is opened.
    cboxPublic.init = function () {

        // jQuery object generator to save a bit of space
        function $div(id) {
            return $('<div id="cbox' + id + '"/>');
        }

        // Create & Append jQuery Objects
        $window = $(window);
        $cbox = $('<div id="colorbox"/>');
        $overlay = $div("Overlay").hide();
        $wrap = $div("Wrapper");
        $content = $div("Content").append(
            $loaded = $div("LoadedContent").css({width: 0, height: 0}),
            $loadingOverlay = $div("LoadingOverlay"),
            $loadingGraphic = $div("LoadingGraphic"),
            $title = $div("Title"),
            $current = $div("Current"),
            $slideshow = $div("Slideshow"),
            $next = $div("Next"),
            $prev = $div("Previous"),
            $close = $div("Close")
        );
        $wrap.append( // The 3x3 Grid that makes up ColorBox
            $('<div/>').append(
                $div("TopLeft"),
                $topBorder = $div("TopCenter"),
                $div("TopRight")
            ),
            $('<div/>').append(
                $leftBorder = $div("MiddleLeft"),
                $content,
                $rightBorder = $div("MiddleRight")
            ),
            $('<div/>').append(
                $div("BottomLeft"),
                $bottomBorder = $div("BottomCenter"),
                $div("BottomRight")
            )
        ).children().children().css({'float': 'left'});
        $('body').prepend($overlay, $cbox.append($wrap));

        if (isIE) {
            $cbox.addClass('cboxIE');
            if (isIE6) {
                $overlay.css('position', 'absolute');
            }
        }

        // Add rollover event to navigation elements
        $content.children()
        .addClass(hover)
        .mouseover(function () { $(this).addClass(hover); })
        .mouseout(function () { $(this).removeClass(hover); })
        .hide();

        // Cache values needed for size calculations
        interfaceHeight = $topBorder.height() + $bottomBorder.height() + $content.outerHeight(TRUE) - $content.height();//Subtraction needed for IE6
        interfaceWidth = $leftBorder.width() + $rightBorder.width() + $content.outerWidth(TRUE) - $content.width();
        loadedHeight = $loaded.outerHeight(TRUE);
        loadedWidth = $loaded.outerWidth(TRUE);

        // Setting padding to remove the need to do size conversions during the animation step.
        $cbox.css({"padding-bottom": interfaceHeight, "padding-right": interfaceWidth}).hide();

        // Setup button & key events.
        $next.click(cboxPublic.next);
        $prev.click(cboxPublic.prev);
        $close.click(cboxPublic.close);

        // Adding the 'hover' class allowed the browser to load the hover-state
        // background graphics.  The class can now can be removed.
        $content.children().removeClass(hover);
    };

    cboxPublic.position = function (mWidth, mHeight, speed, loadedCallback) {
        var winHeight = document.documentElement.clientHeight,
        posTop = winHeight / 2 - mHeight / 2,
        posLeft = document.documentElement.clientWidth / 2 - mWidth / 2,
        animate_speed;

        //keeps the box from expanding to an inaccessible area offscreen.
        if (mHeight > winHeight) { posTop -=(mHeight - winHeight); }
        if (posTop < 0) { posTop = 0; }
        if (posLeft < 0) { posLeft = 0; }

        posTop += $window.scrollTop();
        posLeft += $window.scrollLeft();

        mWidth = mWidth - interfaceWidth;
        mHeight = mHeight - interfaceHeight;

        //setting the speed to 0 to reduce the delay between same-sized content.
        animate_speed = ($cbox.width() === mWidth && $cbox.height() === mHeight) ? 0 : speed;

        //this gives the wrapper plenty of breathing room so it's floated contents can move around smoothly,
        //but it has to be shrank down around the size of div#colorbox when it's done.  If not,
        //it can invoke an obscure IE bug when using iframes.
        $wrap[0].style.width = $wrap[0].style.height = "9999px";

        function modalDimensions (that) {
            //loading overlay size has to be sure that IE6 uses the correct height.
            $topBorder[0].style.width = $bottomBorder[0].style.width = $content[0].style.width = that.style.width;
            $loadingGraphic[0].style.height = $loadingOverlay[0].style.height = $content[0].style.height = $leftBorder[0].style.height = $rightBorder[0].style.height = that.style.height;
        }

        $cbox.dequeue().animate({height:mHeight, width:mWidth, top:posTop, left:posLeft}, {duration: animate_speed,
            complete: function(){
                modalDimensions(this);

                //shrink the wrapper down to exactly the size of colorbox to avoid a bug in IE's iframe implementation.
                $wrap[0].style.width = (mWidth+interfaceWidth) + "px";
                $wrap[0].style.height = (mHeight+interfaceHeight) + "px";

                if (loadedCallback) {loadedCallback();}
            },
            step: function(){
                modalDimensions(this);
            }
        });
    };

    cboxPublic.resize = function (object) {
        if(!open){ return; }

        var width,
        height,
        topMargin,
        prev,
        prevSrc,
        next,
        nextSrc,
        photo,
        timeout,
        speed = settings.transition==="none" ? 0 : settings.speed;

        $window.unbind(cbox_resize);

        if(!object){
            timeout = setTimeout(function(){ //timer allows IE to render the dimensions before attempting to calculate the height
                height = $loaded.children().outerHeight(TRUE);
                $loaded[0].style.height = height + 'px';
                cboxPublic.position($loaded.width()+loadedWidth+interfaceWidth, height+loadedHeight+interfaceHeight, speed);
            }, 1);
            return;
        }

        $loaded.remove();
        $loaded = $(object);

        function getWidth(){
            width = settings.width ? maxWidth : maxWidth && maxWidth < $loaded.width() ? maxWidth : $loaded.width();
            return width;
        }
        function getHeight(){
            height = settings.height ? maxHeight : maxHeight && maxHeight < $loaded.height() ? maxHeight : $loaded.height();
            return height;
        }

        if(!settings.scrollbars){
            $loaded.css({overflow:'hidden'});
        }

        $loaded.hide().appendTo('body')
        .attr({id:'cboxLoadedContent'})
        .css({width:getWidth()})
        .css({height:getHeight()})//sets the height independently from the width in case the new width influences the value of height.
        .prependTo($content);

        // Hides 'select' form elements in IE6 because they would otherwise sit on top of the overlay.
        if (isIE6) {
            $('select:not(#colorbox select)').filter(function(){
                return $(this).css('visibility') !== 'hidden';
            }).css({'visibility':'hidden'}).one(cbox_cleanup, function(){
                $(this).css({'visibility':'inherit'});
            });
        }

        photo = $('#cboxPhoto')[0];
        if (photo && settings.height) {
            topMargin = (height - parseInt(photo.style.height, 10))/2;
            photo.style.marginTop = (topMargin > 0 ? topMargin : 0)+'px';
        }

        function setPosition (s) {
            var mWidth = width+loadedWidth+interfaceWidth,
            mHeight = height+loadedHeight+interfaceHeight;

            $().unbind('keydown', cbox_key);
            cboxPublic.position(mWidth, mHeight, s, function(){
                if (!open) { return; }

                if (isIE) {
                    //This fadeIn helps the bicubic resampling to kick-in.
                    if( photo ){$loaded.fadeIn(100);}
                    //IE adds a filter when ColorBox fades in and out that can cause problems if the loaded content contains transparent pngs.
                    $cbox[0].style.removeAttribute("filter");
                }

                $content.children().show();

                //Waited until the iframe is added to the DOM & it is visible before setting the src.
                //This increases compatability with pages using DOM dependent JavaScript.
                $('#cboxIframeTemp').after("<iframe id='cboxIframe' name='iframe_"+new Date().getTime()+"' frameborder=0 src='"+(settings.href || element.href)+"' />").remove();

                $loadingOverlay.hide();
                $loadingGraphic.hide();
                $slideshow.hide();

                if ($related.length>1) {
                    $current.html(settings.current.replace(/\{current\}/, index+1).replace(/\{total\}/, $related.length));
                    $next.html(settings.next);
                    $prev.html(settings.previous);

                    $().bind('keydown', cbox_key);

                    if(settings.slideshow){
                        $slideshow.show();
                    }
                } else {
                    $current.hide();
                    $next.hide();
                    $prev.hide();
                }

                $title.html(settings.title || element.title);

                $.event.trigger(cbox_complete);

                if (callback) {
                    callback.call(element);
                }

                if (settings.transition === 'fade'){
                    $cbox.fadeTo(speed, 1, function(){
                        if(isIE){$cbox[0].style.removeAttribute("filter");}
                    });
                }

                $window.bind(cbox_resize, function(){
                    cboxPublic.position(mWidth, mHeight, 0);
                });
            });
        }

        if((settings.transition === 'fade' && $cbox.fadeTo(speed, 0, function(){setPosition(0);})) || setPosition(speed)){}

        // Preloads images within a rel group
        if (settings.preloading && $related.length>1) {
            prev = index > 0 ? $related[index-1] : $related[$related.length-1];
            next = index < $related.length-1 ? $related[index+1] : $related[0];
            nextSrc = $(next).data(colorbox).href || next.href;
            prevSrc = $(prev).data(colorbox).href || prev.href;

            if(isImage(nextSrc)){
                $('<img />').attr('src', nextSrc);
            }

            if(isImage(prevSrc)){
                $('<img />').attr('src', prevSrc);
            }
        }
    };

    cboxPublic.load = function () {
        var height, width, href, loadingElement, resize = cboxPublic.resize;

        element = $related[index];

        settings = $(element).data(colorbox);

        //convert functions to static values
        process();

        $.event.trigger(cbox_load);

        // Evaluate the height based on the optional height and width settings.
        height = settings.height ? setSize(settings.height, 'y') - loadedHeight - interfaceHeight : FALSE;
        width = settings.width ? setSize(settings.width, 'x') - loadedWidth - interfaceWidth : FALSE;

        href = settings.href || element.href;

        $loadingOverlay.show();
        $loadingGraphic.show();
        $close.show();

        //Re-evaluate the maximum dimensions based on the optional maxheight and maxwidth.
        if(settings.maxHeight){
            maxHeight = settings.maxHeight ? setSize(settings.maxHeight, 'y') - loadedHeight - interfaceHeight : FALSE;
            height = height && height < maxHeight ? height : maxHeight;
        }
        if(settings.maxWidth){
            maxWidth = settings.maxWidth ? setSize(settings.maxWidth, 'x') - loadedWidth - interfaceWidth : FALSE;
            width = width && width < maxWidth ? width : maxWidth;
        }

        maxHeight = height;
        maxWidth = width;

        if (settings.inline) {
            $('<div id="cboxInlineTemp" />').hide().insertBefore($(href)[0]).bind(cbox_load+' '+cbox_cleanup, function(){
                $loaded.children().insertBefore(this);
                $(this).remove();
            });
            resize($(href).wrapAll('<div/>').parent());
        } else if (settings.iframe) {
            resize($("<div><div id='cboxIframeTemp' /></div>"));
        } else if (settings.html) {
            resize($('<div/>').html(settings.html));
        } else if (isImage(href)){
            loadingElement = new Image();
            loadingElement.onload = function(){
                loadingElement.onload = null;

                if((maxHeight || maxWidth) && settings.scalePhotos){
                    var width = this.width,
                    height = this.height,
                    percent = 0,
                    that = this,
                    setResize = function(){
                        height += height * percent;
                        width += width * percent;
                        that.height = height;
                        that.width = width;
                    };

                    if( maxWidth && width > maxWidth ){
                        percent = (maxWidth - width) / width;
                        setResize();
                    }
                    if( maxHeight && height > maxHeight ){
                        percent = (maxHeight - height) / height;
                        setResize();
                    }
                }

                resize($("<div />").css({width:this.width, height:this.height}).append($(this).css({width:this.width, height:this.height, display:"block", margin:"auto", border:0}).attr('id', 'cboxPhoto')));

                if($related.length > 1){
                    $(this).css({cursor:'pointer'}).click(cboxPublic.next);
                }

                if(isIE){
                    this.style.msInterpolationMode='bicubic';
                }
            };
            loadingElement.src = href;
        } else {
            $('<div />').load(href, function(data, textStatus){
                if(textStatus === "success"){
                    resize($(this));
                } else {
                    resize($("<p>Request unsuccessful.</p>"));
                }
            });
        }
    };

    //navigates to the next page/image in a set.
    cboxPublic.next = function () {
        index = index < $related.length-1 ? index+1 : 0;
        cboxPublic.load();
    };

    cboxPublic.prev = function () {
        index = index > 0 ? index-1 : $related.length-1;
        cboxPublic.load();
    };

    cboxPublic.slideshow = function () {
        var stop, timeOut, className = 'cboxSlideshow_';

        $slideshow.bind(cbox_cleanup, function(){
            clearTimeout(timeOut);
            $slideshow.unbind(cbox_complete+' '+cbox_load+" click");
        });

        function start(){
            $slideshow
            .text(settings.slideshowStop)
            .bind(cbox_complete, function(){
                timeOut = setTimeout(cboxPublic.next, settings.slideshowSpeed);
            })
            .bind(cbox_load, function(){
                clearTimeout(timeOut);
            }).one("click", function(){
                stop();
                $(this).removeClass(hover);
            });
            $cbox.removeClass(className+"off").addClass(className+"on");
        }

        stop = function(){
            clearTimeout(timeOut);
            $slideshow
            .text(settings.slideshowStart)
            .unbind(cbox_complete+' '+cbox_load)
            .one("click", function(){
                start();
                timeOut = setTimeout(cboxPublic.next, settings.slideshowSpeed);
                $(this).removeClass(hover);
            });
            $cbox.removeClass(className+"on").addClass(className+"off");
        };

        if(settings.slideshow && $related.length>1){
            if(settings.slideshowAuto){
                start();
            } else {
                stop();
            }
        }
    };

    //Note: to use this within an iframe use the following format: parent.$.fn.colorbox.close();
    cboxPublic.close = function () {
        $.event.trigger(cbox_cleanup);
        open = FALSE;
        $().unbind('keydown', cbox_key).unbind("keydown.cbox_close");
        $window.unbind(cbox_resize+" "+cbox_ie6);
        $overlay.css({cursor: 'auto'}).fadeOut('fast');

        $cbox
        .stop(TRUE, FALSE)
        .fadeOut('fast', function () {
            $loaded.remove();
            $cbox.css({'opacity': 1});
            $content.children().hide();
            $.event.trigger(cbox_closed);
        });
    };

    cboxPublic.element = function(){ return element; };

    cboxPublic.settings = defaults;

    // Initializes ColorBox when the DOM has loaded
    $(cboxPublic.init);

}(jQuery));
