/* ---------------------------------------------------------------------
    Global JavaScript & jQuery

    Target Browsers: All
    Authors: Brian Bell, Nick Le Guillou, Lynn Wloszek
------------------------------------------------------------------------ */

var NERD = NERD || {};

jQuery(document).ready(function($) {
    $('body').removeClass('nojs');
    NERD.ExternalLinks.init();
    NERD.StarProcess.init();
    NERD.StarClients.init();
    NERD.StarTeam.init();
    NERD.MainNav.init();
    NERD.Newsticker.init();
    NERD.Sitemap.init();
//    NERD.Newsletter.init();

    if ($('body').hasClass('home')) {
        NERD.Homepage.init();
    } else if ($('body').hasClass('portfolio')) {
        NERD.Filter.init();
        NERD.PortfolioPanels.init();
        NERD.PortfolioPanels.initDeepLinks();

        NERD.PortfolioFilter.init();
    } else if ($('body').hasClass('case_studies')) {
        NERD.Filter.init();
        NERD.CaseStudyFilter.init();
    } else if ($('body').hasClass('facilities')) {
        NERD.Facilities.init();
    } else if ($('body').hasClass('why_star')) {
        NERD.WhyStar.init();
    }
});

/* ---------------------------------------------------------------------
    ExternalLinks
    Author: Nerdery Boilerplate

    Launches links with a rel="external" in a new window
------------------------------------------------------------------------ */

NERD.ExternalLinks = {
    init: function() {
        $('a[rel=external]').attr('target', '_blank');
    }
};

/* ---------------------------------------------------------------------
    Star Process
    Author: Brian Bell

    Animates the process page. Fade in star and numbers, add interaction
    on hover and on click of the numbers.
------------------------------------------------------------------------ */

NERD.StarProcess = {
    $starBg:   undefined,
    $steps:    undefined,
    $numLinks: undefined,
    $modules:  undefined,

    init: function() {
        var self = this;

        self.$starBg = $('#process_container');

        if (self.$starBg.length !== 0) {

            if ($.browser.msie && $.browser.version <= 8) {
                $('.steps .gradient').hide();
            }

            self.$steps    = $('#process_steps').children();
            self.$numLinks = self.$steps.find('.activate_step');
            self.$modules  = self.$steps.find('.module').addClass('inactive');
            var circle     = $('#process_circle');

            self.$steps.hide();
            circle.hide();
            self.$starBg.hide();

            self.$starBg
                .delay(200)
                .fadeIn(1500,
                    function() {
                        circle.fadeIn(1000,
                            function() {
                                showSteps(self.$steps.eq(0));
                            }
                        );
                    }
                );

            if (self.$modules.hasClass('active')) {
                self.$modules.removeClass('active');
            }

            var showSteps = function(el) {
                el.fadeIn(500,
                    function() {
                        var next = el.next();
                        if (next.length) {
                            showSteps(next);
                        }
                    }
                );
            }

            self.bind();
        }
    },

    bind: function() {
        var self = this;

        var me       = undefined;
        var gradient = undefined;
        var module   = undefined;
        var bgPos    = undefined;
        var hoverBox = undefined;

        self.$numLinks.hover(
            function() {
                me       = $(this);
                gradient = me.siblings('.gradient');
                module   = me.siblings('.module');

                if (module.hasClass('inactive')) {
                    module.css('display', 'none');
                } else if (module.hasClass('active')) {
                    module.css('display', 'block');
                }

                gradient
                    .hide()
                    .stop(true, true)
                    .fadeIn(200);

                me.stop(true, true).fadeTo(200, 0);
            },

            function() {
                me       = $(this);
                bgPos    = me.removeClass('active').css('background-position');

                gradient
                    .stop(true, true)
                    .fadeOut(200);

                me.stop(true, true)
                    .fadeTo(200, 1);
            }
        );

        self.$numLinks.click(
            function(e) {
                me     = $(this);
                module = me.siblings('.module');

                $('.steps.active').removeClass('active');
                me.parent('.steps').addClass('active');

                if (module.hasClass('active')) {
                    return false;
                } else {
                    self.$modules.removeClass('active');
                    self.$modules.addClass('inactive').fadeOut();
                    module.removeClass('inactive');
                    module.addClass('active').fadeIn();
                }

                e.preventDefault();
            }
        );
    }
};

/* ---------------------------------------------------------------------
    Star Carousel
    Author: Brian Bell

    Generic carousel functionality
------------------------------------------------------------------------ */

NERD.StarCarousel = {
    $carouselContainer: undefined,
    $slideContainer:    undefined,
    $prev:              undefined,
    $next:              undefined,
    $slides:            undefined,
    $slideWidth:        undefined,
    $firstSlide:        undefined,
    $currentSlide:      undefined,
    $lastSlide:         undefined,
    $autoRotate:        undefined,
    $intervalId:        undefined,
    $startRandom:       undefined,

    init: function(carouselContainer, slideContainer, slides, autoRotate, startRandom) {
        var self = this;

        if ($(carouselContainer).length !== 0) {
            self.$carouselContainer = $(carouselContainer);
            self.$slideContainer    = self.$carouselContainer.find(slideContainer);
            self.$slides            = self.$carouselContainer.find(slides);
            self.$slideWidth        = self.$slideContainer.css('width');

            self.$prev = $('<div id="previous"><a href="#">Previous</a></div>');
            self.$next = $('<div id="next"><a href="#">Next</a></div>');

            if (self.$slides.length >= 2) {
                self.$carouselContainer.prepend(self.$prev);
                self.$carouselContainer.append(self.$next);

                var navHeight      = self.$prev.find('a').outerHeight();
                var navWidth       = self.$prev.find('a').outerWidth();
                var viewportHeight = self.$carouselContainer.outerHeight();

                self.$prev.css({
                    'position' : 'absolute',
                    'top'      : ((viewportHeight / 2) - (navHeight / 2)),
                    'left'     : -(navWidth + 14)
                });
                self.$next.css({
                    'position' : 'absolute',
                    'top'      : ((viewportHeight / 2) - (navHeight / 2)),
                    'right'    : -(navWidth + 14)
                });
            }

            self.$autoRotate    = autoRotate;
            self.$startRandom   = startRandom;
            self.$firstSlide    = self.$slides.first();

            var startSlide = self.$startRandom
                                ? Math.floor(Math.random() * self.$slides.length)
                                : 0;

            self.$currentSlide  = self.$slides.eq(startSlide);
            self.$lastSlide     = self.$slides.last();

            self.$slides.hide();
            self.$currentSlide.fadeIn(1000);

            self.bind();
        }
    },

    bind: function() {
        var self = this;

        self.$next.click(
            function(e) {
                self._rotateForward();

                if (self.$intervalId) {
                    clearInterval(self.$intervalId);
                }

                e.preventDefault();
            }
        );

        self.$prev.click(
            function(e) {
                if ($('.slide:animated').length > 0) {
                    return false;
                }

                var prevSlide;

                if (self.$currentSlide.prev().length === 0) {
                    prevSlide = self.$lastSlide;
                } else  {
                    prevSlide = self.$currentSlide.prev();
                }

                self.showPrev(prevSlide);

                if (self.$intervalId) {
                    clearInterval(self.$intervalId);
                }

                e.preventDefault();
            }
        );

        if (self.$autoRotate) {
            self.$intervalId = setInterval(
                function() {
                    self._rotateForward();
                },
                8000
            );
        }
    },

    showNext: function(nextSlide) {
        var self = this;

        nextSlide
            .show()
            .css('left', self.$slideWidth);

        self.$currentSlide
            .animate({
                'left' : '-' + self.$slideWidth
            },
            1200,
            'easeInOutQuint',
            function() {
            }
        );

        nextSlide
            .animate({
                'left' : 0
            },
            1200,
            'easeInOutQuint',
            function() {
            }
        );

        self.$currentSlide = nextSlide;
    },

    showPrev: function(prevSlide) {
        var self = this;

        prevSlide
            .show()
            .css('left', '-' + self.$slideWidth);

        self.$currentSlide
            .animate({
                'left' : self.$slideWidth
            },
            1200,
            'easeInOutQuint',
            function() {
            }
        );

        prevSlide
            .animate({
                'left' : 0
            },
            1200,
            'easeInOutQuint',
            function() {
            }
        );

        self.$currentSlide = prevSlide;
    },

    _rotateForward:function() {
        var self = this;

        if ($('.slide:animated').length > 0) {
            return false;
        }

        var nextSlide;

        if (self.$currentSlide.next().length !== 0) {
            nextSlide = self.$currentSlide.next();
        } else {
            nextSlide = self.$firstSlide;
        }

        self.showNext(nextSlide);
    }
};

/* ---------------------------------------------------------------------
    Star Team
    Author: Brian Bell

    Cycles through "pages" of photos. Populates the featured photo
    with the clicked photo.
------------------------------------------------------------------------ */

NERD.StarTeam = {
    $panelsPerSlide:    20,
    $carouselContainer: undefined,
    $slideContainer:    undefined,
    $thumbs:            undefined,
    $featuredImage:     undefined,

    init: function() {
        var self = this;

        if ($('#team_container').length !== 0) {

            self.$carouselContainer = $('#team_grid');
            self.$slideContainer    = self.$carouselContainer.find('#grid').remove();

            var  $items             = self.$slideContainer.children();
            var  $carousel          = $('<div class="viewport"><ul id="grid" class="grid team"></ul></div>');
            var  $slideHolder       = $carousel.find('#grid');
            self.$thumbs            = $items.find('.thumb');
            self.$featuredImage     = $items.find('.featured_image');


            for (i = 0; i < Math.ceil($items.length / self.$panelsPerSlide); i++) {
                var times   = i * self.$panelsPerSlide;
                var group   = $items.slice(times, (times + self.$panelsPerSlide));
                var slide   = $('<li class="slide"></li>');
                var contain = $('<ul></ul>');

                group.each(
                    function(i) {
                        contain.append($(this));
                    }
                );

                slide.append(contain);
                $slideHolder.append(slide);
            }

            self.$carouselContainer.prepend($carousel);

            self.bind();
        }
    },

    bind: function() {
        var self = this;

        var pieceHeight      = parseInt($('.piece:first').css('height'));
        var pieceMargin      = parseInt($('.piece:first').css('margin-bottom'));
        var carouselColCount = (parseInt($('.viewport').css('width')) + pieceMargin) / (pieceHeight + pieceMargin);
        var carouselRowCount = self.$panelsPerSlide / carouselColCount;
        var viewportHeight   = (carouselRowCount * (pieceHeight + pieceMargin)) - pieceMargin;

        $('.viewport').css('height', viewportHeight + 'px');

        NERD.StarCarousel.init('.viewport', '#grid', '.slide');

        self.$thumbs.click(
            function(e) {
                e.preventDefault();

                var me          = $(this);
                var imageLink   = me.attr('href');
                var imageTitle  = me.attr('title');
                var caption     = me.siblings('.caption').html();
                var featuredImg = me.siblings('.featured_image').html();

                self.$thumbs.removeClass('active');

                self.showFeatured(imageLink, imageTitle, caption, featuredImg);

                me.addClass('active');
            }
        );
    },

    showFeatured: function(imageLink, imageTitle, caption, featuredImg) {
        var self = this;

        $('#featured_caption')
            .html(caption)
            .hide()
            .stop(true, true)
            .fadeIn(1000);

        $('#featured_image')
            .html(featuredImg)
            .hide()
            .stop(true, true)
            .fadeIn(1000);
    }
};

/* ---------------------------------------------------------------------
    Main Nav
    Authors: Brian Bell, Lynn Wloszek

    Shows and hides sub navigation for main navigation items.
    Adds .active class to clicked li elements.

    Accounts for .subnavs that have a larger height than their containing
    .nav.  Adjusts the #site_header height accordingly.
------------------------------------------------------------------------ */

NERD.MainNav = {
    $headerHolder: undefined,
    $origHeadHeight: undefined,
    $navHolder: undefined,
    $navItems:  undefined,
    $subNavs:   undefined,

    init: function() {
        var self       = this;
        var $headHolder = $('#site_header');
        var $navHolder = $('#main_nav');
        var $origHeadHeight = parseInt($('#main_nav').outerHeight(), 10);

        if ($navHolder.length !== 0) {
            self.$navHolder = $navHolder;
            self.$headHolder = $headHolder;
            self.$origHeadHeight = $origHeadHeight;
            self.$navItems  = $navHolder.children().find('> a');
            self.$subNavs   = $navHolder.find('ul');
        	self.headerHeightCalc();
            self.$subNavs.not('.nav .active ul').hide();

            self.bind();
        }
    },

    headerHeightCalc: function (sub) {										// initializes or correctly adjusts the header height for .nav and .subnav items
    	var self = this;
        var origHeight = self.$origHeadHeight;
    	var activeSub = (sub) ? sub : $('.nav .active ul');					// assigns the parameter .subnav, the page's .subnav or an empty array.
    	if(activeSub.length !== 0) {
	    	var activeSubHeight = parseInt(activeSub.outerHeight(), 10);
	        if(origHeight < activeSubHeight) {
	    		self.$headHolder.css('height', activeSubHeight);
	        } else {
		    	self.$headHolder.css('height', origHeight);
	        }
	    } else {
	    	self.$headHolder.css('height', origHeight);
	    }
    },

    bind: function() {
        var self = this;

        self.$navItems.click(
            function(e) {
                var me  = $(this);
                var sub = me.parent().find('ul');

                self.$subNavs.hide();
                self.$navHolder.find('> .active').removeClass('active');

                if (sub.length !== 0) {
                	self.headerHeightCalc(sub);
                    sub.show();
                }

                if (!me.hasClass('nosub')) {
                    e.preventDefault();
                } else {
                    me.parent().addClass('active');
                }
            }
        );
    }
};

/* ---------------------------------------------------------------------
    Filter
    Author: Brian Bell

    Creates an accordian style animation on the sidebar filter
    navigation. Adds .active class to clicked elements and shows/hides
    nested lists if they exist.
------------------------------------------------------------------------ */

NERD.Filter = {
    $navHolder: undefined,
    $navItems:  undefined,
    $subNavs:   undefined,

    init: function() {
        var self       = this;
        var $navHolder = $('#filter');

        if ($navHolder.length !== 0) {
            self.$navHolder = $navHolder;
            self.$navItems  = $navHolder.children().find('ul').prev('a');
            self.$subNavs   = $navHolder.find('ul');
            self.$links     = $navHolder.find('a');

            self.$subNavs.each(
                function() {
                    var me = $(this);
                    var height = me.outerHeight();

                    // Subtract sub menu heights from parent height
                    if (me.find('ul').length > 0)
                    {
                        me.find('ul').each(function() {
                            height -= $(this).outerHeight();
                        });
                    }

                    me.attr('data-oheight', height);
                    me.parent().addClass('parent');
                }
            );

            self.$subNavs.css('height', 0).hide();

            self.bind();
        }
    },

    bind: function() {
        var self = this;

        self.$links.click(
            function(e) {
                var me          = $(this);
                var parent      = me.parent();
                var parentMenu  = parent.parent('ul[id!=filter]');
                var subMenu     = me.next('ul');


                // Check for sub menus
                if (subMenu.length > 0)
                {
                    e.preventDefault();

                    if (!parent.hasClass('active'))
                    {
                        self._closeActive(parent);

                        // Expand sub menu, starting with adding room in parent
                        if (parentMenu.length > 0)
                        {
                            self._toggleSlide(
                                parentMenu,
                                parentMenu.data('oheight') + subMenu.data('oheight')
                            );
                        }

                        self._toggleSlide(subMenu, subMenu.data('oheight'),
                            function() {
                                parent.addClass('active');
                            }
                        );
                    } else {
                        self._collapseMenu(subMenu, parent, parentMenu);
                    }
                } else {
                    self._closeActive(parent);
                }
            }
        );
    },

    _closeActive:function(parent) {
        var self = this;

        // Close any sibling menus or open menus in another tree
        var active = parent.siblings('.active');

        if (active.length > 0)
        {
            var activeSubMenu = active.find('> ul');

            if (activeSubMenu.length > 0)
            {
                self._collapseMenu(
                    activeSubMenu,
                    active,
                    active.parent('ul[id!=filter]')
                );
            } else {
                active.removeClass('active');
            }
        }
    },

    _collapseMenu:function(menu, parent, parentMenu) {
        var self = this;

        // Collapse menus, starting with lowest sub-menu
        self._toggleSlide(menu, 0,
            function() {
                self._toggleSlide(menu.find('ul'), 0,
                    function() {
                        menu.find('ul').hide();
                        menu.find('.active').removeClass('active');
                    }
                );
                menu.hide();

                parent.removeClass('active');
            }
        );

        // Accommodate for extra space in parent
        if (parentMenu.length > 0)
        {
            self._toggleSlide(parentMenu, parentMenu.data('oheight'));
        }
    },

    _toggleSlide:function(nav, height, callback) {
        nav.show().stop().animate(
            {
                'height':height
            },
            700,
            'easeInOutQuint',
            (typeof(callback) == 'function' ? callback : function() {  })
        );
    }
};

/* ---------------------------------------------------------------------
    News Ticker
    Author: Brian Bell

    Rotates through li's of news headlines. Fade in/Fade out animation.
------------------------------------------------------------------------ */

NERD.Newsticker = {
    $slideHolder:     undefined,
    $headlines:       undefined,
    $currentHeadline: undefined,
    timer:            undefined,

    init: function() {
        var self = this;
        var $slideHolder = $('#news_ticker');

        if ($slideHolder.length !== 0) {
            self.$slideHolder     = $slideHolder;
            self.$headlines       = $slideHolder.children();
            self.$currentHeadline = self.$headlines.first();

            self.$headlines.not(self.$currentHeadline).hide();

            self.timer = setInterval(self.rotate, 4500);
        }
    },

    rotate: function() {
        var self = NERD.Newsticker;

        var nextHeadline;

        if (self.$currentHeadline.next().length !== 0) {
            nextHeadline = self.$currentHeadline.next();
        } else {
            nextHeadline = self.$headlines.eq(0);
        }

        self.showHeadline(nextHeadline);
    },

    showHeadline: function(nextHeadline) {
        var self = this;

        self.$currentHeadline.fadeOut();
        nextHeadline.fadeIn();
        self.$currentHeadline = nextHeadline;
    }
};

/* ---------------------------------------------------------------------
    Sitemap
    Author: Brian Bell, Lynn Wloszek

    Expands/Closes the sitemap. Animates the height property
    of the sitemap.

    Accomidates a growing site map and adds 10px to the bottom for
    appropriate padding.
------------------------------------------------------------------------ */

NERD.Sitemap = {
    $viewport:    undefined,
    $tab:         undefined,
    $container:   undefined,
    targetHeight: undefined,
    isOpen:       undefined,

    init: function() {
        var self      = this;
        var $viewport = $('#sitemap_viewport');

        if ($viewport.length !== 0) {
            self.$viewport       = $viewport;
            self.$tab            = $viewport.find('#sitemap_tab');
            self.$container      = $viewport.find('#sitemap_container');
            self.$siteMapContent = $viewport.find('#sitemap_content');

            self.targetHeight = parseInt(self.$siteMapContent.outerHeight(), 10) + 10;
            self.$container.css('height', 0);
            self.isOpen = false;

            self.bind();
        }
    },

    bind: function() {
        var self = this;

        self.$tab.click(
            function(e) {
                if (self.isOpen) {
                    self.isOpen = false;
                    self.hideSitemap();
                } else {
                    self.isOpen = true;
                    self.showSitemap();
                }

                e.preventDefault();
            }
        );
    },

    showSitemap: function() {
        var self = this;

        self.$container.stop().animate({
                'height': self.targetHeight
            },
            1200,
            'easeInOutQuint',
            function() {
            }
        );
    },

    hideSitemap: function() {
        var self = this;

        self.$container.stop().animate({
                'height': 0
            },
            1200,
            'easeInOutQuint',
            function() {
            }
        );
    }
};

/* ---------------------------------------------------------------------
    PortfolioPanels
    Author: Nick Le Guillou
    Contributors: Brian Bell

    Handles behaviors for Portfolio page image panels
------------------------------------------------------------------------ */

NERD.PortfolioPanels = {
    $carouselContainer: undefined,
    $detailContainer:   undefined,
    $slideContainer:    undefined,
    $backLink:          undefined,
    $leftDetail:        undefined,
    $items:             undefined,
    //    $thumbs:            undefined,

    init: function() {
        var self = this;

        if ($('#portfolio_container').length !== 0) {
            $('li.piece').shuffle();
            self.$carouselContainer = $('#portfolio_container');
            self.$detailContainer   = $('#portfolio_detail_container');
            self.$slideContainer    = self.$carouselContainer.find('#grid').remove();
            self.$backLink          = $('.more.back a');
            self.$leftDetail        = $('.aside .details');
            self.$items             = self.$slideContainer.children();
            var  $carousel          = $('<div class="viewport"><ul id="grid" class="grid portfolio"></ul></div>');
            var  $slideHolder       = $carousel.find('#grid');
//            self.$thumbs            = $items.find('.flip');

            for (i = 0; i < Math.ceil(self.$items.length / 15); i++) {
                var times   = i * 15;
                var group   = self.$items.slice(times, (times + 15));
                var slide   = $('<li class="slide"></li>');
                var contain = $('<ul></ul>');

                group.each(
                    function(i) {
                        contain.append($(this));
                    }
                );

                slide.append(contain);
                $slideHolder.append(slide);
            }

            self.$carouselContainer.prepend($carousel);

            self.bind();
        }
    },

    bind: function() {
        var self = this;

        self.$items.each(
            function(i) {
                var me = $(this);

                var img = me.find('.lazy_image').hide();
                var alt = me.find('.lazy_image_alt');

                me.find('.flip_start').html('<img src="'+img.text()+'" alt="'+alt.text()+'" />');

                me.find('.flip_container').html(
                    me.find('.flip_start').html()
                );

                me.find('.flip_start, .flip_over').hide();

                me.find('a').hover(
                    function() {
                        me.data('flipping', true);
                        self._doFlipStart(me);
                    },

                    function() {
                        me.data('flipping', false);
                        self._doFlipRevert(me);
                    }
                );
            }
        );




        NERD.StarCarousel.init('.viewport', '#grid', '.slide');
    },

    _doFlipStart: function($flipPanel) {
        var self = this;

        if (!$flipPanel.hasClass('flipped')) {
            $flipPanel.find('.flip_container').flip({
                direction   : 'rl',
                content     : $flipPanel.find('.flip_over'),
                speed       : 125,
                onEnd       : function() {
                    if (!$flipPanel.data('flipping'))
                    {
                        setTimeout(function() { self._doFlipRevert($flipPanel); }, 1);
                    }

                    $flipPanel.addClass('flipped');
                }
            });
        }
    },

    _doFlipRevert: function($flipPanel) {
        var self = this;

        if ($flipPanel.hasClass('flipped')) {
            $flipPanel.find('.flip_container').flip({
                direction   : 'lr',
                content     : $flipPanel.find('.flip_start'),
                speed       : 125,
                onEnd       : function() {
                    if ($flipPanel.data('flipping'))
                    {
                        setTimeout(function() { self._doFlipStart($flipPanel); }, 1);
                    }

                    $flipPanel.removeClass('flipped');
                }
            });
        }
    },

    initDeepLinks: function() {
        $(window).bind('hashchange', function(e) {
            var carouselContainer   = $('#portfolio_container');
            var detailContainer     = $('#portfolio_detail_container');
            var backLink            = $('.more.back a');
            var leftDetail          = $('.details');


            var url = $.param.fragment();

            if (url != '')
            {
                var company = $('#' + url).find('.details .bold').html();
                var summary = $('#' + url).find('.details .summary').html();

                leftDetail.find('.portfolio_detail_company .bold').html(company);
                leftDetail.find('.portfolio_detail_summary').html(summary);
                leftDetail.show();

                carouselContainer.hide();
                detailContainer.html('<div class="ajax_loader"></div>');

                detailContainer.load(
                    site_url + 'ajax/portfolio_detail/' + url,
                    function() {
                        NERD.PortfolioDetail.init();
                        backLink.show();
                    }
                );
            }
        });

        $(window).trigger('hashchange');
    }
};

/* ---------------------------------------------------------------------
    PortfolioFilter
    Author: Nick Le Guillou

    Handles behaviors for Portfolio page filter
------------------------------------------------------------------------ */

NERD.PortfolioFilter = {
    $filterControls:  undefined,
    $portfolioPanel:  undefined,
    $panelContainer:  undefined,
    $detailContainer: undefined,
    $backLink:        undefined,
    $leftDetail:      undefined,

    init: function() {
        var self = this;

        if ($('#portfolio_filter').length !== 0) {
            self.$filterControls     = $('#portfolio_filter');
            self.$portfolioPanel     = $('.section.main');
            self.$panelContainer     = $('#portfolio_container');
            self.$detailContainer    = $('#portfolio_detail_container');
            self.$backLink           = $('.more.back a');
            self.$leftDetail         = $('.aside .details');

            self.bind();
        }
    },

    bind: function() {
        var self = this;

        self.$backLink.hide().click(
            function(e) {
                var me = $(this);
                e.preventDefault();

                $('#portfolio_detail_container').html('');
                $('#portfolio_container').show();
                $('.aside .details').hide();

                $.bbq.removeState();

                me.hide();
            }
        );

        self.$leftDetail.hide();

        self.$filterControls.find('.nav.alt a').click(
            function(e) {
                var me = $(this);

                e.preventDefault();

                var parent = me.parent();
                parent.toggleClass('active');

                if (!parent.hasClass('parent')) {
                    self._doLoad(me.attr('href'));
                } else if (parent.hasClass('active')) {
                    self._doLoad(me.attr('href'));
                } else {
                    self._doLoad(site_url + 'ajax/portfolio_grid');
                }

                self.$backLink.trigger('click');
            }
        );
    },

    _doLoad: function($url) {
        var self = this;

        self.$portfolioPanel.html('<div class="ajax_loader"></div>');
        self.$portfolioPanel.load(
            $url,
            function() {
                NERD.PortfolioPanels.init();
            }
        );
    }
};

/* ---------------------------------------------------------------------
    PortfolioDetail
    Author: Brian Bell

    Handles behaviors for Portfolio detail panel
------------------------------------------------------------------------ */

NERD.PortfolioDetail = {
    $imageView:      undefined,
    $imageLinks:     undefined,
    $featuredImages: undefined,
    $firstFeatured:  undefined,

    init:function() {
        var self = this;

        self.$imageView  = $('#portfolio_featured');

        if (self.$imageView.length !== 0) {
            self.$imageLinks    = $('.grid.portfolio_detail').children();
            self.$featuredImage = self.$imageView.find('#portfolio_featured_image');

            self.$imageLinks
                .first()
                .addClass('active');

            self.bind();
        }
    },

    bind:function() {
        var self = this;

        self.$imageLinks.find('.featured_thumb').click(
            function(e) {
                var me         = $(this);
                var myFeatured = me.attr('href');

                e.preventDefault();

                if (me.parent().hasClass('active')) {
                    return false;
                }

                self.$imageLinks.removeClass('active');
                me.parent().addClass('active');
                self.$featuredImage.attr('src', myFeatured);
            }
        );
    }
};

/* ---------------------------------------------------------------------
    Star Clients
    Author: Brian Bell

    Displays slides of client logos and displays dialog box on click.
------------------------------------------------------------------------ */

NERD.StarClients = {
    $carouselContainer: undefined,
    $slideContainer:    undefined,
    $thumbs:            undefined,
    $dialog:            undefined,

    init: function() {
        var self = this;

        if ($('#client_container').length !== 0) {

            self.$carouselContainer = $('#client_container');
            self.$slideContainer    = self.$carouselContainer.find('#grid');
            var items               = self.$slideContainer.children();
            self.$thumbs            = items.find('.thumb');


            for (i = 0; i < Math.ceil(items.length / 12); i++) {
                var times   = i * 12;
                var group   = items.slice(times, (times + 12));
                var slide   = $('<li class="slide"></li>');
                var contain = $('<ul></ul>');

                group.each(
                    function(i) {
                        contain.append($(this));
                    }
                );

                slide.append(contain);
                self.$slideContainer.append(slide);
            }

            self.bind();
        }
    },

    bind: function() {
        var self = this;

        NERD.StarCarousel.init('.viewport', '#grid', '.slide');

        $(window).bind('hashchange', function(e) {
            var url = $.param.fragment();

            if (url != '') {
                var me            = $('a[href=#' + url + ']');
                var dialogContent = me.siblings('.dialog').html();
                var dialog        = $('<div></div>').dialog({
                                        autoOpen: false,
                                        modal: true,
                                        width: 560
                                    });
                var dialogWindow  = $('body');

                dialog.dialog({
                    open: function() {
                        var dialogOverlay = $('.ui-widget-overlay');

                        dialog.append(dialogContent);
                        dialogWindow.css('overflow', 'hidden');
                        dialogOverlay.css({
                            'width'  : '100%',
                            'height' : '100%'
                        });

                        if ($.browser.msie && $.browser.version < 8) {
                            window.scrollTo(0, 0);
                        }
                    },
                    close: function() {
                        dialog.dialog('destroy');
                        dialog.remove();
                        dialogWindow.css('overflow', 'auto');
                        $.bbq.removeState();

                    }
                });

                dialog.dialog('open');

                var uiDialog          = $('.ui-dialog');
                var uiDialogMinHeight = parseInt(uiDialog.css('min-height'), 10);
                var uiDialogTop       = parseInt(uiDialog.css('top'), 10);
                var titleBar          = uiDialog.find('.ui-dialog-titlebar');
                var titleBarMargin    = parseInt(titleBar.css('margin-top'), 10);
                var uiContentHeight   = uiDialog.outerHeight();
                var topOffset         = (uiDialogTop - ((uiContentHeight - uiDialogMinHeight) / 2));

                titleBar.css('height', uiContentHeight - (titleBarMargin * 2));
                uiDialog.css('top', topOffset);

                // May also need to use PIE.js to give border-radius
                // and box-shadow to dialog box in IE.
            }
        });

        $(window).trigger('hashchange');
    }
};

/* ---------------------------------------------------------------------
    CaseStudyFilter
    Author: Nick Le Guillou

    Handles behaviors for Case Study page filter
------------------------------------------------------------------------ */

NERD.CaseStudyFilter = {
    $activeLink: undefined,

    init: function() {
        var self = this;

        if ($('#portfolio_filter .parent ul .active').length !== 0) {

            self.$activeLink = $('#portfolio_filter .parent ul .active');

            self.bind();
        }
    },

    bind: function() {
        var self = this;

        var filterSection = self.$activeLink.parents('.parent');
        filterSection.addClass('active');
        filterSection.find('ul').show();

        self.$activeLink.parent('li').addClass('active');
    }
};

/* ---------------------------------------------------------------------
    Homepage
    Author: Nick Le Guillou
    Contributors: Brian Bell

    Handles behaviors for Home page
------------------------------------------------------------------------ */

NERD.Homepage = {
    $flashContainer:    undefined,
    $carouselContainer: undefined,

    init: function() {
        var self = this;

        if ($('#carousel_container').length !== 0) {

            self.$flashContainer     = $('#flash_container');
            self.$carouselContainer  = $('#carousel_container');

            if (is_not_first_visit || is_device) {
                self.$flashContainer.hide();
                self.initCarousel();
            } else {
                self.$carouselContainer.hide();
                var attributes = {
                   id: "home_flash_movie",
                   wmode: "transparent"
                };

                swfobject.embedSWF(
                    site_url + "assets/swf/star-exhibits-homepage-flash-v2.swf",
                    "home_flash_movie",
                    "890",
                    "357",
                    "9.0.0",
                    site_url + "assets/swf/expressInstall.swf",
                    attributes
                );
            }
        }
    },

    initCarousel: function() {
        var self = this;

        NERD.StarCarousel.init(
            '.viewport',
            '#slide_container',
            '.slide',
            true,
            is_not_first_visit
        );
    },

    _removeFlash: function() {
        var self = this;

        self.$flashContainer.fadeOut("slow", function() {
            self.$carouselContainer.fadeIn("slow");
            self.initCarousel();
        });
    }
};

/* ---------------------------------------------------------------------
    Why Star
    Author: Brian Bell

    Handles behaviors for Why Star
------------------------------------------------------------------------ */

NERD.WhyStar = {
    $carouselContainer: undefined,

    init: function() {
        var self = this;

        if ($('#carousel_container').length !== 0) {
            self.$carouselContainer = $('#carousel_container');

            self.initCarousel();
        }
    },

    initCarousel: function() {
        var self = this;

        NERD.StarCarousel.init(
            '.viewport',
            '#slide_container',
            '.slide',
            true
        );
    }
};


/* ---------------------------------------------------------------------
    Facilities
    Author: Nick Le Guillou

    Handles behaviors for Facilities page
------------------------------------------------------------------------ */

NERD.Facilities = {
    $facilityGrid:           undefined,
    $facilityLinks:          undefined,
    $facilityDetail:         undefined,
    $facilityDetailHideLink: undefined,
    $dialog:                 undefined,


    init: function() {
        var self = this;

        self.$facilityGrid           = $('.grid.facilities');
        self.$facilityLinks          = self.$facilityGrid.find('a');
        self.$facilityDetail         = $('#facility_detail');
        self.$facilityDetailHideLink = self.$facilityDetail.find('.more.back a');

        self.bind();
    },

    bind: function() {
        var self = this;

        self.$facilityDetail.hide();

        if (is_device) {
            self.$facilityGrid.find('.more').remove();
            self.$facilityGrid.find('img').unwrap();
        }

        self.$facilityLinks.click(function(e) {
            var me = $(this);

            var dialog = $('<div id="facility_modal"><h2></h2><div id="facility_video" style="height:545px !important"></div>').dialog({
                autoOpen:   false,
                modal:      true,
                width:      1000
            });

            e.preventDefault();

            dialog.dialog({
                open: function() {
                    var dialogOverlay = $('.ui-widget-overlay');

                    dialogOverlay.css({
                        'width'  : '100%',
                        'height' : '100%'
                    });

                    $('.ui-dialog-content').css({
                        'padding':'16px 24px 70px 25px'
                    });

                    if ($.browser.msie && $.browser.version < 8) {
                        window.scrollTo(0, 0);
                    }

                    var attributes = {
                       id: "facility_video",
                       wmode: "transparent"
                    };

                    swfobject.embedSWF(
                        site_url + "files/media/" + me.attr('href'),
                        "facility_video",
                        872,
                        546,
                        "9.0.0",
                        site_url + "assets/swf/expressInstall.swf",
                        attributes
                    );
                },
                close: function() {
                    dialog.dialog('destroy');
                    dialog.remove();
                }
            });

            dialog.dialog('open');
        });
    }
};

/* ---------------------------------------------------------------------
    Newsletter
    Author: Nick Le Guillou

    Handles behaviors for Newsletter footer link
------------------------------------------------------------------------ */

NERD.Newsletter = {
    $link:undefined,
    $form:undefined,

    init:function() {
        var self = this;

        self.$link = $('#newsletter_signup_link');
        self.$form = $('#newsletter_signup_form');

        self.bind();
    },

    bind:function() {
        var self = this;

        self.$form.hide();

        self.$link.click(function(e) {
            e.preventDefault();
            me = $(this);

//            var dialogContent = self.$form.html();
            var dialog        = $('<div><iframe src="http://eepurl.com/e6NYY" width="625" height="650"></iframe></div>').dialog({
                                    autoOpen: false,
                                    modal: true,
                                    width: 750
                                });

            dialog.dialog({
                open: function() {
                    var dialogOverlay = $('.ui-widget-overlay');

//                    dialog.append(dialogContent);

                    dialogOverlay.css({
                        'width'  : '100%',
                        'height' : '100%'
                    });

                    $('.ui-dialog-content').css({
                        'padding':'16px 24px 70px 25px'
                    });

                    if ($.browser.msie && $.browser.version < 8) {
                        window.scrollTo(0, 0);
                    }
                },
                close: function() {
                    dialog.dialog('destroy');
                    dialog.remove();
                }
            });

            dialog.dialog('open');
        });
    }
}


