var BK = function() {
    
    // Private properties
    var bkgdColourActive = '#ffffff';
    var bkgdColour = '#e6e6e6';

    // Private methods
    function hasClassSelected (list_item) {
        return (YAHOO.util.Dom.hasClass(list_item, "selected"));
    }
    
    function fadeBackground (list_item, fadeIn) {
        var navigation_sub_list_items = list_item.getElementsByTagName('ul');
        var toBkgdColour = (fadeIn) ? bkgdColourActive : bkgdColour;
        var animation_settings = {
            'backgroundColor': { 'to': toBkgdColour }
        };
        list_item.fade_background_anim = new YAHOO.util.ColorAnim(list_item, animation_settings, 0.3, YAHOO.util.Easing.easeIn);
        if (!fadeIn) {
            YAHOO.util.Dom.setStyle(navigation_sub_list_items, "display", "none");
        }
        list_item.fade_background_anim.animate();
    }
    
    function mouseOutListItem (e) {
        if ( !(
                YAHOO.util.Dom.isAncestor(this, YAHOO.util.Event.getRelatedTarget(e)) && ( this === YAHOO.util.Event.getTarget(e) || YAHOO.util.Dom.isAncestor(this, YAHOO.util.Event.getTarget(e)) )
                || ( this === YAHOO.util.Event.getRelatedTarget(e) && YAHOO.util.Dom.isAncestor(this, YAHOO.util.Event.getTarget(e)) )
            ) ) {
            fadeBackground(this);            
        }
    }

    function mouseOverListItem (e) {
        var selected_list_items = YAHOO.util.Dom.getChildrenBy(YAHOO.util.Dom.get('navigation_list'), hasClassSelected);
        var sameItem, sameColour, isAnimating;

        if (this != selected_list_items[0] && YAHOO.util.Dom.getStyle(selected_list_items[0], 'backgroundColor') != bkgdColour && !(selected_list_items[0].fade_background_anim && selected_list_items[0].fade_background_anim.isAnimated())) {
            fadeBackground(selected_list_items[0]);
        }
        
        if (this.fade_background_anim) {
            this.fade_background_anim.stop();
        }
        
        var navigation_sub_list_items = this.getElementsByTagName('ul');
        YAHOO.util.Dom.setStyle(navigation_sub_list_items, "display", "block");
        YAHOO.util.Dom.setStyle(this, "backgroundColor", bkgdColourActive);
    }

    function returnToDefault (e) {
        if (!(this === YAHOO.util.Event.getRelatedTarget(e) || YAHOO.util.Dom.isAncestor(this, YAHOO.util.Event.getRelatedTarget(e)))) {
            var selected_list_items = YAHOO.util.Dom.getChildrenBy(this, hasClassSelected);
            var selected_list_ul_children = selected_list_items[0].getElementsByTagName('ul');
            if (selected_list_items[0].fade_background_anim) {
                selected_list_items[0].fade_background_anim.stop();
            }
            YAHOO.util.Dom.setStyle(selected_list_items, "backgroundColor", bkgdColourActive);
            YAHOO.util.Dom.setStyle(selected_list_ul_children, "display", "block");        
        }
    }
    
    function flashCaption () {
        var flashCaptionText = document.getElementById('flashAlternative').innerHTML;
        var flashVars = { captionText: flashCaptionText };
        var flashParams = { wmode: "transparent" };
        swfobject.embedSWF("/flash/photo_caption.swf", "flashAlternative", "35", "350", "9.0.0", "/flash/expressInstall.swf", flashVars, flashParams);
    }
    
    function registerNavigationEvents () {
        var navigation_list = YAHOO.util.Dom.get('navigation_list')
        var navigation_list_items = YAHOO.util.Dom.getChildren(navigation_list);
        YAHOO.util.Event.on(navigation_list_items, 'mouseover', mouseOverListItem);
        YAHOO.util.Event.on(navigation_list_items, 'mouseout', mouseOutListItem);
        YAHOO.util.Event.on(navigation_list, 'mouseout', returnToDefault);        
    }
    
    function glowPrevNext () {
        var btnNext = YAHOO.util.Dom.get('next');
        var nextFirstPage = YAHOO.util.Dom.hasClass(btnNext, "firstpage");

        function glowOn() {
            if (this.getEl().broesCounter < 3) {
                this.getEl().broesCounter++;
                this.attributes.backgroundColor.to = (this.attributes.backgroundColor.to == bkgdColourActive) ? 'rgb(255,255,255)' : bkgdColourActive;
                this.attributes.method = (this.attributes.backgroundColor.to == bkgdColourActive) ? YAHOO.util.Easing.easeIn : YAHOO.util.Easing.easeOut;
                this.animate();                                
            }
        }

        if (btnNext && nextFirstPage) {
            var glowAnimNext = new YAHOO.util.ColorAnim(btnNext, { 'backgroundColor': { 'to': bkgdColourActive } }, .5, YAHOO.util.Easing.easeIn);
            btnNext.broesCounter = 0;
            glowAnimNext.onComplete.subscribe(glowOn);
        }

        if (btnNext && nextFirstPage) { 
            glowAnimNext.animate();
        }
    }
    
    function init () {
        debug = document.getElementById('debugArea');
        bkgdColourActive = YAHOO.util.Dom.getStyle(YAHOO.util.Dom.get('navigation_list'), 'borderTopColor');
        bkgdColour = YAHOO.util.Dom.getStyle(YAHOO.util.Dom.get('navigation'), 'backgroundColor');
        flashCaption();
        registerNavigationEvents();
        glowPrevNext();
    }
    
    // Public methods
    return {
        init: init
    }
}();

YAHOO.util.Event.onDOMReady(BK.init);