var GlobalNavigationManager = Class.create();
GlobalNavigationManager.prototype = {
    separationIndex : 0,

    initialize : function() {
        this.separationIndex = 0;
    },

    renderNavigationByRequest : function( globalNavCallback, node, p_separationIndex ) {
        this.separationIndex = p_separationIndex;
        new Ajax.Request( globalNavCallback, {
            method : 'get',
            parameters: {
                'TS' : new Date().getTime(),
                'node' : node
            },
            onSuccess : function( transport ) {
                if ( transport != null && transport.responseText != null ) {
                    this.renderNavigation(transport.responseText.evalJSON( true ));
                }
            }.bind(this)
        });
    },


    renderNavigation : function( json ) {
        if ( json != null ) {
            NavUtilities.json = json;
            var results = json.result;
            var structure = results.structure;
            var counter = 0;

            // Build navigation
            structure.each( function( item ) {
                var listItem = new Element( 'li', { 'id' : StringUtils.prepareForHTMLId( item.LinkName ) } );
                var anchor = new Element( 'a', { 'id' : StringUtils.prepareForHTMLId( item.LinkName ) + 'a', 'href' : item.LinkURL, 'target' : item.NewWindow == 'true' ? '_blank' : '_top'  }).update( item.LinkName );

                // Handle end items specifically (don't want an extra separator, etc...)
                if ( structure.length <= ++counter  ) {
                    listItem.addClassName( "endcap" );
                }
                listItem.appendChild( anchor );

                // Determine which side the navitem goes into
                if ( counter <= this.separationIndex ) {
                    $( 'globalNavList' ).appendChild( listItem );
                }
                else {
                    $( 'globalNavListRight' ).appendChild( listItem );
                }

                //Build the sub navigation structure
                if ( item.NavigationChildren != null && item.NavigationChildren.length > 0  ) {
                    var subUL = new Element( 'ul', { 'id' : StringUtils.prepareForHTMLId('sub' + item.LinkName) });
                    subUL.hide();

                    var dotCounter = 0;
                    item.NavigationChildren.each( function( subItem ) {
                        var subListItem = new Element( 'li', { 'id' : StringUtils.prepareForHTMLId( 'sub' + subItem.LinkName + item.LinkName ), 'class' : 'sub-nav-item' } );
                        var subAnchor = new Element( 'a', { 'href' : subItem.LinkURL, 'target' : subItem.NewWindow == 'true' ? '_blank' : '_top' } ).update( subItem.LinkName );
                        var subDot = new Element( 'span').update( '&#8226;' );

                        subListItem.appendChild( subAnchor );
                        subUL.appendChild( subListItem );
                        if ( ++dotCounter < item.NavigationChildren.length ) {
                            subUL.appendChild( subDot )
                        }
                    });
                    $( 'globalSubNav' ).appendChild( subUL );
                }

                Event.observe( listItem, 'mouseover', function( e ) {
                    NavUtilities.resetNavItems( $$( '#globalNav ul li' ) ); //Reset All
                    NavUtilities.highlightElement( $( StringUtils.prepareForHTMLId( item.LinkName )) );  //Highlight element

                    var subNavElement = $( 'sub' + StringUtils.prepareForHTMLId( item.LinkName ) );

                    if ( subNavElement && !subNavElement.visible() ) {
                        NavUtilities.hideDefaultSubnav();
                        subNavElement.show();

                        var position = Position.positionedOffset(e.element())[0] + (e.element().getWidth()/2);
                        var wMax = $('nav').getWidth();
                        var midpoint = subNavElement.getWidth() / 2;

                        if ( wMax - midpoint < position )
                            subNavElement.style.left = (wMax - subNavElement.getWidth()) + 'px';
                        else if ( position - midpoint < 0 )
                            subNavElement.style.left = 0 + 'px';
                        else
                            subNavElement.style.left = (position - midpoint) + 'px';


                    }

                }.bind( this ));

                Event.observe( 'nav', 'mouseout', function( e ) {
                    if (!$('nav').descendants().member(e.relatedTarget)) {
                        NavUtilities.resetNavItems( $$( '#globalNav ul li' ) ); //Reset All
                        if ( results.selected ) {
                            NavUtilities.handleSelectedNavItem( results );
                        }
                        else {
                            NavUtilities.showDefaultSubnav();
                        }
                    }
                }.bind( this ));
            }.bind( this ));

            if ( $( 'globalNavListRight' ).hasChildNodes() ) $( 'globalNavListRight' ).show();
            NavUtilities.handleSelectedNavItem( results );
        }
    }
};