(function(jQuery) {

    function init() {
        jQuery(document).keyup(handleKeyPress);
        jQuery(document.body).delegate(".gallery a", "click", handlePictureClicked);
    }


    function hidePicture() {
        jQuery("a").removeClass("selected");
        jQuery(".imageContainer").remove();
        return false;
    }

    function handlePictureClicked(event) {

        var jTarget = jQuery(event.currentTarget),
                isImageLink = jTarget.closest(".imageLinks").length > 0;
        if (!isImageLink) {
            return showPicture(jTarget);
        } else {
            // allow the link to behave as normal
            return true;
        }
    }

    function resizeContainer(event) {
        var image = jQuery(event.currentTarget), width = image.width();

        if (width) {
            image.parent().width(image.width());
        }

        image.parent().removeClass("hidden");
    }

    function showPicture(jLink) {

        hidePicture();

        var
                url = jLink.attr("href"),
                container = jQuery("<div class='dialogContainer'></div>"),
                imageContainer = jQuery("<div class='imageContainer'><div class='imageContainerInner'><h2></h2><img/><a href='#' class='prev'>Back</a><a href='#' class='next'>Next</a></div><a href='#' class='close'></a></div>")
                        .appendTo(container),
                image = imageContainer.find("img")
                        .bind("load", resizeContainer)
                        .attr("src", url)
                        .click(hidePicture);

        imageContainer.find(".prev").click(showPreviousPicture);
        imageContainer.find(".next").click(showNextPicture);
        imageContainer.find(".close").click(hidePicture);
        imageContainer.find("h2").text(jLink.find("img").attr("alt"));

        imageContainer.find(".prev,.next").toggleClass("hidden", jQuery(".gallery a").length < 2);

        jQuery(document.body).append(container);

        jLink.addClass("selected");

        return false;

    }

    function showNextPicture() {

        var
                allLinks = jQuery(".gallery a"),
                numLinks = allLinks.length,
                currentSelected = jQuery(".gallery a.selected");

        for (var i = 0; i < numLinks - 1; i++) {

            if (allLinks.eq(i).data("dataid") == currentSelected.data("dataid")) {
                showPicture(allLinks.eq(i + 1));
                break;
            }

        }

        return false;

    }

    function showPreviousPicture() {

        var
                allLinks = jQuery(".gallery a"),
                numLinks = allLinks.length,
                currentSelected = jQuery(".gallery a.selected");

        for (var i = 1; i < numLinks; i++) {

            if (allLinks.eq(i).data("dataid") == currentSelected.data("dataid")) {
                showPicture(allLinks.eq(i - 1));
                break;
            }

        }

        return false;

    }

    function handleKeyPress(event) {
        switch (event.keyCode) {
            case 27:
                hidePicture();
                break;
            case 39:
                showNextPicture();
                break;
            case 37:
                showPreviousPicture();
                break;
        }
    }

    jQuery(document).ready(init);

})(jQuery);
