(function($) {
    
    var SHOW_EVENT = "show.inch";
    var HIDE_EVENT = "hide.inch";
    
    function initBanner() {
        $("#nav-pennant").each(function() {
            var navBanner = $(this);
            var slides = navBanner.find("li");
            slides.hide();
            // Add the controls.
            var controlBar = $('<div id="nav-pennant-controlbar"/>');
            navBanner.append(controlBar);
            var controls = $('<div id="nav-pennant-controls"/>');
            controlBar.append(controls);
            slides.each(function(n) {
                var control = $('<div class="nav-pennant-control"/>');
                controls.append(control);
                control.click(function() {
                    clearInterval(slideTimer);
                    showSlide(n);
                });
            });
            var controlButtons = controls.find(".nav-pennant-control");
            // Shows the given slide.
            var currentSlide = null;
            function showSlide(n) {
                if (n == currentSlide) {
                    return
                }
                currentSlide = n;
                slides.filter(":visible").css("z-index", "50").fadeOut("slow");
                slides.eq(n).hide().css("z-index", "100").fadeIn("slow");
                controlButtons.removeClass("here").eq(n).addClass("here");
            }
            showSlide(0);
            // Shows the next slide.
            function nextSlide() {
                if (currentSlide >= slides.length - 1) {
                    showSlide(0);
                } else {
                    showSlide(currentSlide + 1);
                }
            }
            // Add the automatic slideshow.
            var slideTimer = setInterval(nextSlide, 7000);
        });
    }
    
    function waveChicken() {
        // Oh great chicken, we invoke ye! Fix IE7!
        $("#social").css("top", $("#content").height() - 1);
    }
    
    function initNewsEventsTabs() {
        $("#news-events-tabs").each(function() {
            var container = $(this);
            var newsEventsTabs = container.find("a").each(function() {
                var tab = $(this);
                var list = $(tab.attr("href"));
                tab.bind(SHOW_EVENT, function() {
                    tab.addClass("here");
                    list.show();
                    newsEventsTabs.not(tab).trigger(HIDE_EVENT);
                    waveChicken();
                });
                tab.bind(HIDE_EVENT, function() {
                    tab.removeClass("here");
                    list.hide();
                    waveChicken();
                });
                tab.click(function() {
                    tab.trigger(SHOW_EVENT);
                    return false;
                });
            });
            newsEventsTabs.eq(0).trigger(SHOW_EVENT);
        });
    }
    
    function initGallery() {
        $("#gallery").each(function() {
            var gallery = $(this);
            var itemContainer = gallery.find("#gallery-items ul");
            var items = itemContainer.find("li");
            var itemWidth = items.width();
            var thumbnailContainer = gallery.find("#gallery-thumbnails ul");
            var thumbnails = thumbnailContainer.find("li");
            var thumbnailWidth = thumbnails.width();
            // Dimensions calculations.
            function itemOffset(n) {
                return n * itemWidth;
            }
            function thumbnailOffset(n) {
                return n * (thumbnailWidth + 6);
            }
            // Add the description.
            var description = $('<div id="gallery-description"/>');
            gallery.append(description);
            // Position all the images.
            items.css("left", itemOffset);
            thumbnails.css("left", thumbnailOffset);
            // Shows the given slide.
            var currentSlide = null;
            function showSlide(n) {
                if (n == currentSlide) {
                    return;
                }
                currentSlide = n;
                // Get the slide.
                var slide = items.eq(n);
                // Transition the main image.
                itemContainer.animate({
                    left: "-" + itemOffset(n)
                });
                // Transition the thumbnail.
                thumbnails.removeClass("here").eq(n).addClass("here");
                // Add the description.
                description.html(slide.attr("title"));
                // Ensure that the correct page of thumbnails is displayed.
                showPage(Math.floor(n / 6));
            }
            // Shows the given page.
            var currentPage = null;
            var maxPage = Math.floor(items.length / 6);
            function showPage(n) {
                if (n == currentPage) {
                    return
                }
                currentPage = n;
                // Animate the thumbnails.
                thumbnailContainer.animate({
                    left: "-" + thumbnailOffset(n * 6)
                });
                // Highlight the correct page.
                pages.removeClass("here").eq(n).addClass("here");
                // Ensure correct image is shown.
                if (Math.floor(currentSlide / 6) != currentPage) {
                    showSlide(n * 6);
                }
            }
            // Make the thumbnails clickable.
            thumbnails.each(function(n) {
                var thumbnail = $(this);
                thumbnail.click(function() {
                    showSlide(n);
                    return false;
                });
            });
            // Next and prev controls.
            function showNext() {
                if (currentSlide >= items.length - 1) {
                    showSlide(0);
                } else {
                    showSlide(currentSlide + 1);
                }
            }
            function showPrev() {
                if (currentSlide == 0) {
                    showSlide(items.length - 1);
                } else {
                    showSlide(currentSlide - 1);
                }
            }
            // Add in the buttons.
            var leftButton = $('<div id="gallery-button-left"/>');
            gallery.append(leftButton);
            leftButton.click(showPrev);
            var rightButton = $('<div id="gallery-button-right"/>');
            gallery.append(rightButton);
            rightButton.click(showNext);
            // Next and prev controls.
            function showNextPage() {
                if (currentPage >= maxPage) {
                    showPage(0);
                } else {
                    showPage(currentPage + 1);
                }
            }
            function showPrevPage() {
                if (currentPage == 0) {
                    showPage(maxPage);
                } else {
                    showPage(currentPage - 1);
                }
            }
            // Add in the pagination.
            var pagination = $('<div id="gallery-pagination"/>');
            gallery.append(pagination);
            var pageLeft = $('<span id="gallery-page-left">Prev</span>');
            pagination.append(pageLeft);
            pageLeft.click(showPrevPage);
            function createPageLink(n) {
                var page = $('<span class="gallery-page">' + (n + 1) + '</span>');
                pagination.append(page);
                page.click(function() {
                    showPage(n);
                });
            }
            for (var pageN = 0; pageN <= maxPage; pageN++) {
                createPageLink(pageN);
            }
            var pageRight = $('<span id="gallery-page-right">Next</span>');
            pagination.append(pageRight);
            pageRight.click(showNextPage);
            var pages = pagination.find(".gallery-page");
            // Initialize!
            showSlide(0);
        });
    }
    
    function initCaterbookLinks() {
        $("a").each(function() {
            var link = $(this);
            var href = link.attr("href");
            if (href && href.indexOf("caterbook.com") != -1) {
                link.click(function() {
                    _gaq.push(['_link', href]); return false;
                    return false;
                });
            }
        });
    }
    
    $(function() {
        initBanner();
        initNewsEventsTabs();
        initGallery();
        initCaterbookLinks();
    });
    
}(jQuery));
