(function($) {
    $.prettyPhoto = { version: "2.5.6" };
    $.fn.prettyPhoto = function(settings) {
        settings = jQuery.extend({ animationSpeed: "normal", opacity: 0.8, showTitle: true, allowresize: true, default_width: 500, default_height: 344, counter_separator_label: "/", theme: "light_rounded", hideflash: false, wmode: "opaque", autoplay: true, modal: false, changepicturecallback: function() {
        }, auth: function() { return true }, callback: function() {
        }, markup: '<div class="pp_pic_holder"> <div class="pp_top"> <div class="pp_left"></div> <div class="pp_middle"></div> <div class="pp_right"></div> </div> <div class="pp_content_container"> <div class="pp_left"> <div class="pp_right"> <div class="pp_content"> <div class="pp_loaderIcon"></div> <div class="pp_fade"> <a href="#" class="pp_expand" title="Expand the image">Expand</a> <div class="pp_hoverContainer"> <a class="pp_next" href="#">next</a> <a class="pp_previous" href="#">previous</a> </div> <div id="pp_full_res"></div> <div class="pp_details clearfix"> <a class="pp_close" href="#">Close</a> <p class="pp_description"></p> <div class="pp_nav"> <a href="#" class="pp_arrow_previous">Previous</a> <p class="currentTextHolder">0/0</p> <a href="#" class="pp_arrow_next">Next</a> </div> </div> </div> </div> </div> </div> </div> <div class="pp_bottom"> <div class="pp_left"></div> <div class="pp_middle"></div> <div class="pp_right"></div> </div> </div> <div class="pp_overlay"></div> <div class="ppt"></div>',
            image_markup: '<img id="fullResImage" src="" />', flash_markup: '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="{width}" height="{height}"><param name="wmode" value="{wmode}" /><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="{path}" /><embed src="{path}" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="{width}" height="{height}" wmode="{wmode}"></embed></object>',
            quicktime_markup: '<object classid="clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B" codebase="http://www.apple.com/qtactivex/qtplugin.cab" height="{height}" width="{width}"><param name="src" value="{path}"><param name="autoplay" value="{autoplay}"><param name="type" value="video/quicktime"><embed src="{path}" height="{height}" width="{width}" autoplay="{autoplay}" type="video/quicktime" pluginspage="http://www.apple.com/quicktime/download/"></embed></object>', iframe_markup: '<iframe src ="{path}" width="{width}" height="{height}" frameborder="no"></iframe>',
            inline_markup: '<div class="pp_inline clearfix">{content}</div>'
        }, settings);
        if ($.browser.msie && parseInt($.browser.version) == 6) {
            settings.theme = "light_square"
        }
        if ($(".pp_overlay").size() == 0) {
            _buildOverlay()
        }
        var doresize = true, percentBased = false, correctSizes, $pp_pic_holder, $ppt, $pp_overlay, pp_contentHeight, pp_contentWidth, pp_containerHeight, pp_containerWidth, windowHeight = $(window).height(), windowWidth = $(window).width(), setPosition = 0, scrollPos = _getScroll();
        $(window).scroll(function() {
            scrollPos = _getScroll();
            _centerOverlay();
            _resizeOverlay()
        });
        $(window).resize(function() {
            _centerOverlay();
            _resizeOverlay()
        });
        $(document).keydown(function(e) {
            if ($pp_pic_holder.is(":visible")) {
                switch (e.keyCode) {
                    case 37:
                        $.prettyPhoto.changePage("previous");
                        break;
                    case 39:
                        $.prettyPhoto.changePage("next");
                        break;
                    case 27:
                        if (!settings.modal) {
                            $.prettyPhoto.close()
                        }
                        break
                }
            }
        });
        $(this).each(function() {
            $(this).bind("click", function() {
                _self = this;
                theRel = $(this).attr("rel");
                galleryRegExp = /\[(?:.*)\]/;
                theGallery = galleryRegExp.exec(theRel);
                var images = new Array, titles = new Array, descriptions = new Array;
                if (theGallery) {
                    $("a[rel*=" + theGallery + "]").each(function(i) {
                        if ($(this)[0] === $(_self)[0]) {
                            setPosition = i
                        }
                        images.push($(this).attr("href"));
                        titles.push($(this).find("img").attr("alt"));
                        descriptions.push($(this).attr("title"))
                    })
                } else {
                    images = $(this).attr("href");
                    titles = $(this).find("img").attr("alt") ? $(this).find("img").attr("alt") : "";
                    descriptions = $(this).attr("title") ? $(this).attr("title") : ""
                }
                if (theRel.indexOf("+auth") == -1 || settings.auth()) {
                    $.prettyPhoto.open(images, titles, descriptions);
                }
                return false
            })
        });
        $.prettyPhoto.open = function(gallery_images, gallery_titles, gallery_descriptions) {
            if ($.browser.msie && $.browser.version == 6) {
                $("select").css("visibility", "hidden")
            }
            if (settings.hideflash) {
                $("object,embed").css("visibility", "hidden")
            }
            images = $.makeArray(gallery_images);
            titles = $.makeArray(gallery_titles);
            descriptions = $.makeArray(gallery_descriptions);
            image_set = $(images).size() > 0 ? true : false;
            _checkPosition($(images).size());
            $(".pp_loaderIcon").show();
            $pp_overlay.show().fadeTo(settings.animationSpeed, settings.opacity);
            $pp_pic_holder.find(".currentTextHolder").text(setPosition + 1 + settings.counter_separator_label + $(images).size());
            if (descriptions[setPosition]) {
                $pp_pic_holder.find(".pp_description").show().html(unescape(descriptions[setPosition]))
            } else {
                $pp_pic_holder.find(".pp_description").hide().text("")
            }
            if (titles[setPosition] && settings.showTitle) {
                hasTitle = true;
                $ppt.html(unescape(titles[setPosition]))
            } else {
                hasTitle = false
            }
            movie_width = parseFloat(grab_param("width", images[setPosition])) ? grab_param("width", images[setPosition]) : settings.default_width.toString();
            movie_height = parseFloat(grab_param("height", images[setPosition])) ? grab_param("height", images[setPosition]) : settings.default_height.toString();
            if (movie_width.indexOf("%") != -1 || movie_height.indexOf("%") != -1) {
                movie_height = parseFloat($(window).height() * parseFloat(movie_height) / 100 - 100);
                movie_width = parseFloat($(window).width() * parseFloat(movie_width) / 100 - 100);
                percentBased = true
            }
            $pp_pic_holder.fadeIn(function() {
                imgPreloader = "";
                switch (_getFileType(images[setPosition])) {
                    case "image":
                        imgPreloader = new Image;
                        nextImage = new Image;
                        if (image_set && setPosition > $(images).size()) {
                            nextImage.src = images[setPosition + 1]
                        }
                        prevImage = new Image;
                        if (image_set && images[setPosition - 1]) {
                            prevImage.src = images[setPosition - 1]
                        }
                        $pp_pic_holder.find("#pp_full_res")[0].innerHTML = settings.image_markup;
                        $pp_pic_holder.find("#fullResImage").attr("src", images[setPosition]);
                        imgPreloader.onload = function() {
                            correctSizes = _fitToViewport(imgPreloader.width, imgPreloader.height);
                            _showContent()
                        };
                        imgPreloader.onerror = function() {
                            alert("Image cannot be loaded. Make sure the path is correct and image exist.");
                            $.prettyPhoto.close()
                        };
                        imgPreloader.src = images[setPosition];
                        break;
                    case "youtube":
                        correctSizes = _fitToViewport(movie_width, movie_height);
                        movie = "http://www.youtube.com/v/" + grab_param("v", images[setPosition]);
                        if (settings.autoplay) {
                            movie += "&autoplay=1"
                        }
                        toInject = settings.flash_markup.replace(/{width}/g, correctSizes["width"]).replace(/{height}/g, correctSizes["height"]).replace(/{wmode}/g, settings.wmode).replace(/{path}/g, movie);
                        break;
                    case "vimeo":
                        correctSizes = _fitToViewport(movie_width, movie_height);
                        movie_id = images[setPosition];
                        movie = "http://vimeo.com/moogaloop.swf?clip_id=" + movie_id.replace("http://vimeo.com/", "");
                        if (settings.autoplay) {
                            movie += "&autoplay=1"
                        }
                        toInject = settings.flash_markup.replace(/{width}/g, correctSizes["width"]).replace(/{height}/g, correctSizes["height"]).replace(/{wmode}/g, settings.wmode).replace(/{path}/g, movie);
                        break;
                    case "quicktime":
                        correctSizes = _fitToViewport(movie_width, movie_height);
                        correctSizes["height"] += 15;
                        correctSizes["contentHeight"] += 15;
                        correctSizes["containerHeight"] += 15;
                        toInject = settings.quicktime_markup.replace(/{width}/g, correctSizes["width"]).replace(/{height}/g, correctSizes["height"]).replace(/{wmode}/g, settings.wmode).replace(/{path}/g, images[setPosition]).replace(/{autoplay}/g, settings.autoplay);
                        break;
                    case "flash":
                        correctSizes = _fitToViewport(movie_width, movie_height);
                        flash_vars = images[setPosition];
                        flash_vars = flash_vars.substring(images[setPosition].indexOf("flashvars") + 10, images[setPosition].length);
                        filename = images[setPosition];
                        filename = filename.substring(0, filename.indexOf("?"));
                        toInject = settings.flash_markup.replace(/{width}/g, correctSizes["width"]).replace(/{height}/g, correctSizes["height"]).replace(/{wmode}/g, settings.wmode).replace(/{path}/g, filename + "?" + flash_vars);
                        break;
                    case "iframe":
                        correctSizes = _fitToViewport(movie_width, movie_height);
                        frame_url = images[setPosition];
                        frame_url = frame_url.substr(0, frame_url.indexOf("iframe") - 1);
                        toInject = settings.iframe_markup.replace(/{width}/g, correctSizes["width"]).replace(/{height}/g, correctSizes["height"]).replace(/{path}/g, frame_url);
                        break;
                    case "inline":
                        myClone = $(images[setPosition]).clone().css({ width: settings.default_width }).wrapInner('<div id="pp_full_res"><div class="pp_inline clearfix"></div></div>').appendTo($("body"));
                        correctSizes = _fitToViewport($(myClone).width(), $(myClone).height());
                        $(myClone).remove();
                        toInject = settings.inline_markup.replace(/{content}/g, $(images[setPosition]).html());
                        break
                }
                if (!imgPreloader) {
                    $pp_pic_holder.find("#pp_full_res")[0].innerHTML = toInject;
                    _showContent()
                }
            })
        };
        $.prettyPhoto.changePage = function(direction) {
            if (direction == "previous") {
                setPosition--;
                if (setPosition < 0) {
                    setPosition = 0;
                    return
                }
            } else {
                if ($(".pp_arrow_next").is(".disabled")) {
                    return
                }
                setPosition++
            }
            if (!doresize) {
                doresize = true
            }
            _hideContent(function() {
                $.prettyPhoto.open(images, titles, descriptions)
            });
            $("a.pp_expand,a.pp_contract").fadeOut(settings.animationSpeed)
        };
        $.prettyPhoto.close = function() {
            $pp_pic_holder.find("object,embed").css("visibility", "hidden");
            $("div.pp_pic_holder,div.ppt,.pp_fade").fadeOut(settings.animationSpeed);
            $pp_overlay.fadeOut(settings.animationSpeed, function() {
                $("#pp_full_res").html("");
                $pp_pic_holder.attr("style", "").find("div:not(.pp_hoverContainer)").attr("style", "");
                _centerOverlay();
                if ($.browser.msie && $.browser.version == 6) {
                    $("select").css("visibility", "visible")
                }
                if (settings.hideflash) {
                    $("object,embed").css("visibility", "visible")
                }
                setPosition = 0;
                settings.callback()
            });
            doresize = true
        };
        _showContent = function() {
            $(".pp_loaderIcon").hide();
            projectedTop = scrollPos["scrollTop"] + (windowHeight / 2 - correctSizes["containerHeight"] / 2);
            if (projectedTop < 0) {
                projectedTop = 0 + $ppt.height()
            }
            $pp_pic_holder.find(".pp_content").animate({ height: correctSizes["contentHeight"] }, settings.animationSpeed);
            $pp_pic_holder.animate({ top: projectedTop, left: windowWidth / 2 - correctSizes["containerWidth"] / 2, width: correctSizes["containerWidth"] }, settings.animationSpeed, function() {
                $pp_pic_holder.find(".pp_hoverContainer,#fullResImage").height(correctSizes["height"]).width(correctSizes["width"]);
                $pp_pic_holder.find(".pp_fade").fadeIn(settings.animationSpeed);
                if (image_set && _getFileType(images[setPosition]) == "image") {
                    $pp_pic_holder.find(".pp_hoverContainer").show()
                } else {
                    $pp_pic_holder.find(".pp_hoverContainer").hide()
                }
                if (settings.showTitle && hasTitle) {
                    $ppt.css({ top: $pp_pic_holder.offset().top - 25, left: $pp_pic_holder.offset().left + 20, display: "none" });
                    $ppt.fadeIn(settings.animationSpeed)
                }
                if (correctSizes["resized"]) {
                    $("a.pp_expand,a.pp_contract").fadeIn(settings.animationSpeed)
                }
                settings.changepicturecallback()
            })
        };
        function _hideContent(callback) {
            $pp_pic_holder.find("#pp_full_res object,#pp_full_res embed").css("visibility", "hidden");
            $pp_pic_holder.find(".pp_fade").fadeOut(settings.animationSpeed, function() {
                $(".pp_loaderIcon").show();
                if (callback) {
                    callback()
                }
            });
            $ppt.fadeOut(settings.animationSpeed)
        }
        function _checkPosition(setCount) {
            if (setPosition == setCount - 1) {
                $pp_pic_holder.find("a.pp_next").css("visibility", "hidden");
                $pp_pic_holder.find("a.pp_arrow_next").addClass("disabled").unbind("click")
            } else {
                $pp_pic_holder.find("a.pp_next").css("visibility", "visible");
                $pp_pic_holder.find("a.pp_arrow_next.disabled").removeClass("disabled").bind("click", function() {
                    $.prettyPhoto.changePage("next");
                    return false
                })
            }
            if (setPosition == 0) {
                $pp_pic_holder.find("a.pp_previous").css("visibility", "hidden");
                $pp_pic_holder.find("a.pp_arrow_previous").addClass("disabled").unbind("click")
            } else {
                $pp_pic_holder.find("a.pp_previous").css("visibility", "visible");
                $pp_pic_holder.find("a.pp_arrow_previous.disabled").removeClass("disabled").bind("click", function() {
                    $.prettyPhoto.changePage("previous");
                    return false
                })
            }
            if (setCount > 1) {
                $(".pp_nav").show()
            } else {
                $(".pp_nav").hide()
            }
        }
        function _fitToViewport(width, height) {
            hasBeenResized = false;
            _getDimensions(width, height);
            imageWidth = width;
            imageHeight = height;
            if ((pp_containerWidth > windowWidth || pp_containerHeight > windowHeight) && doresize && settings.allowresize && !percentBased) {
                hasBeenResized = true;
                notFitting = true;
                while (notFitting) {
                    if (pp_containerWidth > windowWidth) {
                        imageWidth = windowWidth - 200;
                        imageHeight = height / width * imageWidth
                    } else {
                        if (pp_containerHeight > windowHeight) {
                            imageHeight = windowHeight - 200;
                            imageWidth = width / height * imageHeight
                        } else {
                            notFitting = false
                        }
                    }
                    pp_containerHeight = imageHeight;
                    pp_containerWidth = imageWidth
                }
                _getDimensions(imageWidth, imageHeight)
            }
            return { width: Math.floor(imageWidth), height: Math.floor(imageHeight), containerHeight: Math.floor(pp_containerHeight), containerWidth: Math.floor(pp_containerWidth) + 40, contentHeight: Math.floor(pp_contentHeight), contentWidth: Math.floor(pp_contentWidth), resized: hasBeenResized }
        }
        function _getDimensions(width, height) {
            width = parseFloat(width);
            height = parseFloat(height);
            $pp_details = $pp_pic_holder.find(".pp_details");
            $pp_details.width(width);
            detailsHeight = parseFloat($pp_details.css("marginTop")) + parseFloat($pp_details.css("marginBottom"));
            $pp_details = $pp_details.clone().appendTo($("body")).css({ position: "absolute", top: -1E4 });
            detailsHeight += $pp_details.height();
            detailsHeight = detailsHeight <= 34 ? 36 : detailsHeight;
            if ($.browser.msie && $.browser.version == 7) {
                detailsHeight += 8
            }
            $pp_details.remove();
            pp_contentHeight = height + detailsHeight;
            pp_contentWidth = width;
            pp_containerHeight = pp_contentHeight + $ppt.height() + $pp_pic_holder.find(".pp_top").height() + $pp_pic_holder.find(".pp_bottom").height();
            pp_containerWidth = width
        }
        function _getFileType(itemSrc) {
            if (itemSrc.match(/youtube\.com\/watch/i)) {
                return "youtube"
            } else {
                if (itemSrc.match(/vimeo\.com/i)) {
                    return "vimeo"
                } else {
                    if (itemSrc.indexOf(".mov") != -1) {
                        return "quicktime"
                    } else {
                        if (itemSrc.indexOf(".swf") != -1) {
                            return "flash"
                        } else {
                            if (itemSrc.indexOf("iframe") != -1) {
                                return "iframe"
                            } else {
                                if (itemSrc.substr(0, 1) == "#") {
                                    return "inline"
                                } else {
                                    return "image"
                                }
                            }
                        }
                    }
                }
            }
        }
        function _centerOverlay() {
            if (doresize) {
                titleHeight = $ppt.height();
                contentHeight = $pp_pic_holder.height();
                contentwidth = $pp_pic_holder.width();
                projectedTop = windowHeight / 2 + scrollPos["scrollTop"] - (contentHeight + titleHeight) / 2;
                $pp_pic_holder.css({ top: projectedTop, left: windowWidth / 2 + scrollPos["scrollLeft"] - contentwidth / 2 });
                $ppt.css({ top: projectedTop - titleHeight, left: windowWidth / 2 + scrollPos["scrollLeft"] - contentwidth / 2 + 20 })
            }
        }
        function _getScroll() {
            if (self.pageYOffset) {
                return { scrollTop: self.pageYOffset, scrollLeft: self.pageXOffset }
            } else {
                if (document.documentElement && document.documentElement.scrollTop) {
                    return { scrollTop: document.documentElement.scrollTop, scrollLeft: document.documentElement.scrollLeft }
                } else {
                    if (document.body) {
                        return { scrollTop: document.body.scrollTop, scrollLeft: document.body.scrollLeft }
                    }
                }
            }
        }
        function _resizeOverlay() {
            windowHeight = $(window).height();
            windowWidth = $(window).width();
            $pp_overlay.css({ height: $(document).height() })
        }
        function _buildOverlay() {
            $("body").append(settings.markup);
            $pp_pic_holder = $(".pp_pic_holder");
            $ppt = $(".ppt");
            $pp_overlay = $("div.pp_overlay");
            $pp_pic_holder.attr("class", "pp_pic_holder " + settings.theme);
            $pp_overlay.css({ opacity: 0, height: $(document).height() }).bind("click", function() {
                if (!settings.modal) {
                    $.prettyPhoto.close()
                }
            });
            $("a.pp_close").bind("click", function() {
                $.prettyPhoto.close();
                return false
            });
            $("a.pp_expand").bind("click", function() {
                $this = $(this);
                if ($this.hasClass("pp_expand")) {
                    $this.removeClass("pp_expand").addClass("pp_contract");
                    doresize = false
                } else {
                    $this.removeClass("pp_contract").addClass("pp_expand");
                    doresize = true
                }
                _hideContent(function() {
                    $.prettyPhoto.open(images, titles, descriptions)
                });
                $pp_pic_holder.find(".pp_fade").fadeOut(settings.animationSpeed);
                return false
            });
            $pp_pic_holder.find(".pp_previous, .pp_arrow_previous").bind("click", function() {
                $.prettyPhoto.changePage("previous");
                return false
            });
            $pp_pic_holder.find(".pp_next, .pp_arrow_next").bind("click", function() {
                $.prettyPhoto.changePage("next");
                return false
            })
        }
        _centerOverlay()
    };
    function grab_param(name, url) {
        name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
        var regexS = "[\\?&]" + name + "=([^&#]*)";
        var regex = new RegExp(regexS);
        var results = regex.exec(url);
        if (results == null) {
            return ""
        } else {
            return results[1]
        }
    }
})(jQuery);
